0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

日本語版 Wordle を作った - 重複文字の判定が意外と難しい

0
Posted at

作ったもの

Wordle JPhttps://sen.ltd/portfolio/wordle-jp/

スクリーンショット

  • 5 文字のひらがなを 6 回以内に当てる
  • 164 単語を厳選
  • 日替わり問題(全員共通)+ 練習モード
  • オンスクリーン 50音キーボード
  • 絵文字グリッドで結果シェア
  • 統計(勝率・連勝・当て回数分布)

vanilla JS、ゼロ依存、ビルド不要node --test で 40 ケース。

重複文字の罠

Wordle の色判定で一番ハマるのが「重複文字」。答えに が 1 つしかないのに推測に を 4 つ使った場合、何個を「含む」にするか?

正解は 1 個だけ。ナイーブな answer.includes(guess[i]) では全部「含む」になってしまう。

2 パスアルゴリズム

// Pass 1: 完全一致をマーク、残りの answer 文字を frequency map に記録
for (let i = 0; i < 5; i++) {
  if (guess[i] === answer[i]) result[i] = 'correct';
  else answerRemaining[answer[i]]++;
}

// Pass 2: frequency map に残っていれば 'present'、デクリメント
for (let i = 0; i < 5; i++) {
  if (result[i]) continue;
  if (answerRemaining[guess[i]] > 0) {
    result[i] = 'present';
    answerRemaining[guess[i]]--;
  } else result[i] = 'absent';
}

完全一致優先 → 残った answer 文字を消費する形で present 判定。これで重複も正しく扱える。

日替わり問題は djb2 ハッシュ

let hash = 5381;
for (const c of dateStr) hash = ((hash << 5) + hash) + c.charCodeAt(0);
return wordList[Math.abs(hash) % wordList.length];

日付文字列を djb2 でハッシュして単語リストのインデックスに変換。同じ日付なら全員同じ単語。サーバ不要。

シリーズ

100+ 公開ポートフォリオ シリーズの #44 です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?