您如何实施打乱单词内部字母的“旧”技巧?
对于那些不知道它的人,维基百科很好地描述了它。
马克赫德的回答是有缺陷的。即使纠正了重复字母的问题,使用排序算法也不会产生有效的结果。// 见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));
}
我在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))
更好的解决方案将提供“更正确”Function
的方法,因为OrderBy
它会为字符串中的特定字符返回相同的值,但在这种情况下,只需设置Rnd
种子即可获得(某种程度上)可重复的结果。
(请注意,将 设置Function
为直接依赖于c
提供的意味着所有内部字符都根据某种随机顺序重新排序,因此所有内部重复字母总是在打乱的单词中组合在一起。)
输出示例:
(请注意,在
Fictunon
前一阶段,所有的c
内部线程都被指定为 smoe ronadm oidrreng,因此所有的线程都被指定为 srlmceabd 世界。)