作ったもの
Wordle JP — https://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 です。
- 📦 リポジトリ: https://github.com/sen-ltd/wordle-jp
- 🌐 デモ: https://sen.ltd/portfolio/wordle-jp/
- 🏢 会社: https://sen.ltd/
