【问题标题】:Exchanging the internal letters of words交换单词的内部字母
【发布时间】:2012-08-26 23:21:36
【问题描述】:

如何实现打乱单词内部字母的“旧”技巧?

对于那些不知道的人,Wikipedia 描述得很好。

正如对this question 的评论中提到的,这已经有一些research 进入了这个模因最早形式中最初提到的“研究”。

【问题讨论】:

    标签: regex vb.net string linq scramble


    【解决方案1】:

    马克赫德的回答是有缺陷的。即使纠正了重复字母的问题,使用排序算法也不会产生有效的结果。 // 见http://okmij.org/ftp/Haskell/perfect-shuffle.txt

    这是我的尝试,使用递归。非常简单易懂,但性能有待提高。显然它不使用正则表达式、vb.net 或 linq(见标签)。我把它留给读者。

    Random _rng = new Random();
    
    string Scramble(string text) {
      return String.Concat(text[0], Shuffle3(text.Substring(1, text.Length - 2)), text[text.Length - 1]);
    }
    
    string Shuffle3(string text) {
      return ShuffleStep(text, _rng.Next(text.Length));
    }
    
    string ShuffleStep(string text, int i) {
      return (text.Length == 1) ? text : text[i] + ShuffleStep(text.Remove(i, 1), _rng.Next(text.Length-1));
    }
    

    【讨论】:

    • 我已经使用您指出的正确随机播放实现了.OrderRandomly 扩展方法,但是由于我使用了没有Yield 的VB.NET,因此不值得将它放在这里。
    【解决方案2】:

    我在 VB 的“一个”行中实现了这个:

    Dim outText = Regex.Replace(inText, _
            "\b([a-zA-z])([a-zA-Z]+)([a-zA-Z])\b", _
            Function(g) (g.Groups(1).Value & String.Join("", _
                (g.Groups(2).Value.ToCharArray.OrderBy( _
                                Function(c) (Rnd(1))) _
                                )) & _
                g.Groups(3).Value))
    

    更好的解决方案是为OrderBy 提供一个“更正确”的Function,它将为字符串中的特定字符返回相同的值,但在这种情况下,只需设置Rnd 种子即可获得(有点)可重复的结果。

    (请注意,将Function设置为直接依赖于提供的c意味着所有内部字符都根据某种随机顺序重新排序,因此所有内部重复字母总是在打乱的单词中组合在一起。)

    输出示例:

    (请注意,将Fictunon 指定为 uopn c previodd mnaes 所有inratnel cthcearras 都是roeerredd aindorccg 到 smoe ronadm oidrreng,所以所有 ietnnarl reteaepd ltteers 是 srlmceabd wodrs 中的 awayls guorped tgtheoer。)

    【讨论】:

    • 不错。有没有一种简单的方法可以将字符的索引放入函数中?只是想知道,因为那时您可以创建一个不一定将重复字符组合在一起的确定性函数。我知道你可以通过增加一个外部计数器来做到这一点,但这不是一个非常漂亮的技术。 :)
    • @Chris:是的,特别是如果您将外部 Function 扩展为独立或多行函数:Groups,即 Captures,包含 Index 的原始字符串中的匹配,因此可以做更多工作来为OrderBy 提供“正确”和/或可重复的Function
    猜你喜欢
    • 2019-09-30
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多