【问题标题】:Spintax C# ... How can I handle this?Spintax C# ...我该如何处理?
【发布时间】:2011-11-04 03:03:23
【问题描述】:

Spintax 允许您旋转各种单词和句子,例如:

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

大括号之间的文本会被随机选择组成不同的句子。

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

我无法收集所需的逻辑。

【问题讨论】:

  • 当然要短一些。只有一点,快速连续实例化大量随机数并不是一个好主意,因为它们都将具有相同的起始种子。这就是为什么我传入一个随机数生成器实例,这样它就不会那样做。
  • 我完全忘记了!谢谢。

标签: c# spintax


【解决方案1】:

不用担心嵌套,只需如下迭代即可:

  1. 在字符串中找到第一个包含{...} 且内部没有其他大括号的序列。对于您的情况,这是{Hello|Hi}。如果没有更多该模式,请转到第 3 步。

  2. 抓住所有可能性并随机选择一个,用它的值替换大括号部分。然后返回步骤 1。

  3. 这是你修改后的字符串。

假设您有一个稍微有问题的随机数生成器,它总是返回零。您的字符串修改历史将是:

a/ {你好|嗨} {世界|人民}! {C{#|++|}|Java} 是一种{awesome|amazing} 语言。 b/你好{世界|人民}! {C{#|++|}|Java} 是一种{awesome|amazing} 语言。 c/世界你好! {C{#|++|}|Java} 是一种{awesome|amazing} 语言。 d/世界你好! {C#|Java} 是一种{awesome|amazing} 语言。 e/世界你好! C# 是一种{awesome|amazing} 语言。 f/世界你好! C# 是一门很棒的语言。

特别注意从 (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();
        }
    }
}

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

你好世界! C# 是一门很棒的语言。

【讨论】:

  • 我从没想过它会迭代。谢谢!至于 {} 和 |在文本中,我想我会这样做,以便可以忽略任何不符合语法规则的内容。
  • 我盯着你的 C# 代码块,想知道那是什么  差距在那里:)
  • @BoltClock:我不喜欢只有一两行太长的代码上的滚动条。所述滚动条适用于 500 行的庞然大物,因此它们不会阻塞页面,但我希望尽可能一目了然地查看所有代码。如果它困扰了足够多的人,我会停止这样做——我经常想知道其他笔记本电脑垂直挑战较少的人是否没有这个问题。事实上,算了,我要停止这样做了,从现在开始:-)
  • 好吧,我没有被它打扰,但你对那些滚动条提出了一个很好的观点。
  • @paxdiablo 检查我在问题中的解决方案,简单得多:p 但我确实基于您的伪代码。只需添加逻辑检查即可。
【解决方案2】:

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

【讨论】:

  • 你的递归想法已经实现。我的解决方案在我上面的答案中。谢谢你。我现在不知道该给谁投票,这两个答案都有很大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多