3

コンテキストについては、Wordle は、特定のヒントに基づいて 6 回以下の推測で 5 文字の単語を解読する必要があるゲームです。得られるヒントは次のとおりです。

  1. 文字が黒く着色されている場合、その文字に一致する文字はターゲット単語にありません。
  2. 文字がオレンジ色の場合、その文字と一致する文字がターゲット ワード内にありますが、位置が異なります。
  3. 文字が緑色に着色されている場合、位置と文字は一致しています。

私は、一連の単語試行を取り、可能な単語のリストからそれらを削除する wordle ソルバー プログラムを作成しています。

この問題を解決するための最良のアルゴリズムは、ルールの 1 つに違反する単語を配列から除外するブラック リストだと思います。しかし、より良い代替案があれば、私は提案を受け入れます.


const text =
[
  [
    ["N","black"],["i","black"],["g","black"],
    ["h","black"],["t","green"]
  ],
  [
    ["b","black"],["e","black"],["l","orange"],
    ["o","orange"],["w","black"]
  ]
]

const words = "dozen,brave,apple,climb,outer,pitch,ruler,holds,fixed,costs,calls, ...etc"

const solver = (text: any) => {
    this.resultingWords = words.split(",").filter(word => {
      word = word.toUpperCase()
      for (var i = 0; i < text.length; i++) {
        for (var j = 0; j < 5; j++) {
          let currentText = text[i][j]
          currentText[0] = currentText[0].toUpperCase()
          if (currentText[0] == '') { continue }
          if (currentText[1] == "green" && (word[j] != currentText[0])) {
            return false
          }
          if (currentText[1] == "black" && word.includes(currentText[0])) {
            return false;
          }
          if (currentText[1] == "orange" &&
          (word[j] == currentText[0] || !word.includes(currentText[0]))) {
            return false
          }
        }
      }
      return true
    })
  }

私が抱えている問題は、単語に同じ文字が複数あり、そのうちの 1 つが緑またはオレンジの一致で、もう 1 つが黒である場合です。アルゴリズムの書き方が原因で、結果が得られません。

この問題を正しく解決する方法は何でしょうか?

ブラック リスト スタイルのフィルタリングは最適なソリューションですか? (ホワイトリストとは対照的に)。

4

2 に答える 2

1

あなたは候補者のリストを作成していますが、これは良いスタートだと思います。ホワイトリストまたはブラックリストに登録するかどうかは、実際には問題ではありません。結果は候補のリストです。唯一の懸念は、候補リストにない単語を推測することで、ソリューションをより迅速に、またはより確実に取得できることです。なんで?そうすれば、一度に新しい文字を導入して、単語に含まれているかどうかを確認できるからです。おそらく、2 つの戦略の組み合わせが最適ですが、最初にテストしないと判断が難しいでしょう。

  • 「グリーン」でOKです。
  • 「黒」は、推測で黒以外の文字の出現数をカウントする必要があり、その文字の正確な量を含まないすべての単語 (および文字が黒の位置にある単語も) を除外できます。
  • 「オレンジ」は問題ありませんが、改善することができます: 推測で黒以外の文字の出現回数を数え、その文字を含むすべての単語をより少ない回数 (少なくとも 1 回だけでなく、最小限の出現をチェックする) 削除することもできます。あなたがすでに持っているものが適用されます: 文字はオレンジ色の位置にあってはなりません.

改善のアイデアはたくさんあります。まず、単語を調べる前にフィルターを作成します。上記と同様のロジックを使用すると、4 つの異なるルール タイプのコレクションを取得できます。文字は特定の位置にある必要があるか、特定の位置にあることができないか、文字が正確に (おそらく 0)、または少なくとも特定の回数出現する必要があります。次に、単語を調べて、それらのルールを使用してフィルタリングします。そうしないと、いくつかの作業が複数回行われる可能性があります。最初に推測で同じ文字を収集することによって、このようなフィルターを作成するのが最も簡単です。出現規則の正確な数がある場合は、明らかに、同じ文字の出現規則の最小数を削除できます。

単語をすばやく推測するには、評価関数を作成して、候補の中から最も有望な次の推測を見つけます。採点可能な値:

  • 新しい文字がいくつ導入されたか (まだ推測されていない文字)。
  • また、新しい文字の確率も考慮に入れることができます。たとえば、単語に特定の文字が含まれる可能性はどれくらいか。または、文字間の相関関係を見てみましょう。たとえば、Q がある場合は U もある可能性が高く、最後の文字が D の場合、最後から 2 番目の文字が E である可能性が非常に高くなります。
  • すべての候補について考えられるすべての回答を調べて、どの推測が平均して最も多くの単語を除外するか、または同様のことを確認することもできます。何らかの方法で概算しない限り、これにはおそらく時間がかかりすぎますが。
于 2022-02-04T10:05:33.487 に答える