1

単語の内部文字をスクランブルする「古い」トリックをどのように実装できますか?

知らない人のためにウィキペディアに詳しく書かれています。

この質問へのコメントで述べたように、これには、このミームの最も初期の形式で最初に言及された「研究」に関するいくつかの研究がありました。

4

2 に答える 2

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));
}
于 2012-09-05T05:18:49.090 に答える
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ですが、この場合、シードを設定するだけで (ある程度) 再現可能な結果が得られます。OrderByRnd

(Functionを指定された に直接依存するように設定すると、cすべての内部文字が何らかのランダムな順序に従って並べ替えられるため、内部で繰り返されるすべての文字は常にスクランブルされた単語にグループ化されることに注意してください。)

出力の例:

(前述のFictunon方法では、cすべての inratnel cthcearras が roeerredd aindorccg to smoe ronadm oidrreng であるため、すべての ietnnarl reteaepd lteer は srlmceabd wodrs で tgtheoer によって保護されていることに注意してください。)

于 2012-09-01T11:13:19.477 に答える