2011-11-04 16 views
4

Spintax允许你旋转不同的单词和句子,如:Spintax C#...我该如何处理这个问题?

{Hello|Hi} {World|People}! {C{#|++|}|Java} is an {awesome|amazing} language. 

括号之间的文本将随机选取,形成不同的句子。

我能够自己想出一个解决方案,但我会遇到的问题是嵌套。有时嵌套可能非常深。什么是处理嵌套的可能解决方案?

我无法收集所需的逻辑。

+0

这当然有点短。只有一点,它不是一个好主意,因为它们都有相同的起始种子,所以很快连续实例化大量的随机数。这就是为什么我通过一个随机数生成器实例,所以它不会这样做。 – paxdiablo

+0

我完全忘了!谢谢。 –

回答

8

不要担心嵌套,只是做反复如下:

  1. 找到具有{...}里面没有其他括号中的字符串中的第一个序列。对于你的情况,这是{Hello|Hi}。如果没有更多的模式,请转到步骤3.

  2. 抓住所有可能性,然后选择一个随机的替换大括号的值。然后回到第1步。

  3. 这是您修改过的字符串。

比方说,你有轻微错误的随机数生成器,它总是返回为零。然后,您的字符串修改历史将是:

 
a/ {Hello|Hi} {World|People}! {C{#|++|}|Java} is an {awesome|amazing} language. 
b/ Hello {World|People}! {C{#|++|}|Java} is an {awesome|amazing} language. 
c/ Hello World! {C{#|++|}|Java} is an {awesome|amazing} language. 
d/ Hello World! {C#|Java} is an {awesome|amazing} language. 
e/ Hello World! C# is an {awesome|amazing} language. 
f/ Hello World! C# is an awesome language. 

注特别是(C)过渡至(d)。因为我们正在寻找并非里面有大括号的第一个大括号部分,我们在{C{#|++|}|Java}之前做了{#|++|}

所有你现在需要补充的是,你可能有{,你的实际文本中}|的可能性 - 这些都需要以某种方式逃脱,以保护他们从修正引擎。


这是一个小小的C#程序,它显示了这一点在行动。考虑到我对语言的相对缺乏经验,这可能不是那么令人印象深刻,但它说明了这一过程。

using System; 
using System.Text.RegularExpressions; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static string spintax(Random rnd, string str) { 
      // Loop over string until all patterns exhausted. 
      string pattern = "{[^{}]*}"; 
      Match m = Regex.Match(str, pattern); 
      while (m.Success) { 
       // Get random choice and replace pattern match. 
       string seg = str.Substring(m.Index + 1, m.Length - 2); 
       string[] choices = seg.Split('|'); 
       str = str.Substring(0, m.Index) + choices[rnd.Next(choices.Length)] + str.Substring(m.Index + m.Length); 
       m = Regex.Match(str, pattern); 
      } 

      // Return the modified string. 
      return str; 
     } 

     static void Main(string[] args) { 
      Random rnd = new Random(); 
      string str = "{Hello|Hi} {World|People}! {C{#|++|}|Java} is an {awesome|amazing} language."; 
      Console.WriteLine(spintax(rnd, str)); 
      Console.ReadLine(); 
     } 
    } 
} 

的输出是,在一个示例运行

 
Hello World! C# is an awesome language. 
+0

我从来没有想过这样做迭代。谢谢!至于{}和|在文本中,我想我会这样做,以便任何不符合语法规则的东西都可以被忽略。 –

+0

我正盯着你的C#代码块,想知道 差距在那里做什么:) – BoltClock

+0

@BoltClock:我不是那些只有一行或两行太长代码的滚动条的忠实粉丝。所述滚动条适用于500行巨兽,因此它们不会阻塞页面,但我希望尽可能地看到所有代码。如果它困扰了足够多的人,我会停止这样做 - 我经常想知道其他有垂直挑战的笔记本电脑的人是否没有这个问题。事实上,我会停止这样做,从现在开始:-) – paxdiablo

2

我倾向于建立一个递归方法来处理解析。编写一个方法,它接受一个字符串,扫描第一级大括号,并从随后的选项中进行随机选择。然后该方法在将其插入最终结果之前会使用所选的选项字符串自行调用。

+0

您的递归想法已经实现。我的解决方案在上面的答案中。谢谢。我不知道现在投票谁,这两个答案都有很大的帮助。 –