2

現在、私は自分自身を教える手段として一連のワードゲームに取り組んでいます(そして私のお気に入りのワードゲームのいくつかを再現しています!)「実際の」研究されたプログラミングの友人の助けを借りて、私たちは私のクラス。それは、3文字以上のすべての順列を見つけて、それらを、本質的にスクラブルトーナメントの単語リストであるものを含む文字列のリストと比較することです。

これが背景です。これが私の現在の問題です。すべての順列があり、それらを既存の単語と比較して、特定の文字列内のすべての可能な単語の組み合わせで新しいリストを作成しました。ただし、この文字列をユーザーに提示するときは、スクランブルする必要があります。フィッシャー-イェーツシャッフルのC#実装をいくつか見つけましたが、単一の文字列を受け入れるようにそれらを適応させることができませんでした(編集:フィッシャー-イェーツ問題はchar []配列で解決されました)。それから私はちょっとしたハックのアイデアを思いつきました-同じ長さであるが!=元の単語である順列の1つを使用してみませんか。

残念ながら、条件文が単語を逆方向に返すたびに。エンドユーザーが理解するのはそれほど難しいことではありません:)スクランブリングのコードは次のとおりです。

// permWords is a Dictionary<int, List<string>>
String strScrambled= "";

        foreach (List<string> listWords in permWords.Values)
        {
            foreach (string word in listWords)
            {
                if (word.Length == strWord.Length && word != strWord)
                {
                    strScrambled = word;
                }

            }
        }

strScrambled = word + 1オリジナルと等しくない最初の順列は後方の単語であると仮定してみました。ただし、このコンテキストでは実際には「機能」するとは思いません。特にそれがまだ同じ後方の単語を返すことを考えると。

char配列を使用してFisher-Yatesの問題を修正する方法については、非常に有用な回答がありますが、投稿したもののようなものを使用するのが最善であるかどうかを知りたいのですが、答えが単に逆に綴られた単語ではないことを確認する方法。順列のリストがすでに存在するので、私はこの方法に興味をそそられます。私の解決策としてそれを利用したいと思います。

4

2 に答える 2

3

私はあなたがすでにシャッフルを行う方法を持っていると思います:

void FisherYatesShuffle(char[] elements)
{
    int N = elements.Count;
    for(int i = 0; i<N-1; i++)
    {
        // exchange elements[i] with a random element in i+1 .. N
    }   
}

文字列をCharArrayに変換してから、結果を文字列に戻す必要があります。

string shuffle(string input)
{
    var arr = input.ToCharArray();
    FisherYatesShuffle(arr);
    return new String(arr);
}
于 2012-11-28T14:50:24.860 に答える
1

これがあなたのために働くかどうか見てください...

string str = "hello";

// The random number sequence
Random num = new Random();

string rand = str;
while (rand == str)
    rand = new string(str.OrderBy(s => (num.Next())).ToArray());

シャッフルされた値が正確に逆になっていないことを確認したい場合は、while条件を...に変更できます。

while (rand == str || rand == str.Reverse())
于 2012-11-28T14:33:52.563 に答える