単語の内部文字をスクランブルする「古い」トリックをどのように実装できますか?
知らない人のためにウィキペディアに詳しく書かれています。
この質問へのコメントで述べたように、これには、このミームの最も初期の形式で最初に言及された「研究」に関するいくつかの研究がありました。
マーク・ハードの回答には欠陥があります。重複する文字の問題が修正されたとしても、ソートアルゴリズムを使用しても有効な結果は得られません。//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の「1」行で実装しました。
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
すべての inratnel cthcearras が roeerredd aindorccg to smoe ronadm oidrreng であるため、すべての ietnnarl reteaepd lteer は srlmceabd wodrs で tgtheoer によって保護されていることに注意してください。)