見出し画像

ポケモンwordleで最強の初手について考えてみる

こんにちは、かたさんです。

最近wordleが流行っていますね。私も毎日問題が入れ替わるのを楽しみにしている一人です。

最近はwordleの亜種もたくさん出てきていますが、その中でもポケモンwordleにドハマリしています。

今回は、Python3を使ってポケモンwordleの強い初手を調べてみました。

最初の9手の総数は843C9=5.68×10^20通りととんでもない数になるため全探索は厳しく、あくまで今回決めた手法で見つけた最良の解である、という点に注意しておきます。

しかし、今回見つけた初手によって特定困難な問題数を10/279まで絞れるため、それなりに有用な手法であると考えます。

ポケモンwordleについて

ポケモンwordleは、第8世代までのポケモン(入力可能なものは843種類)を使って解を特定するゲームです。

解の候補は第4世代までの5文字のポケモン(同279種類)となります。 ちなみに、解は必ず5文字ですが入力としては4文字以下のポケモンでもOKです。10手以内で解に辿り着ければ成功となります。

入力できる文字は、濁点や小文字なども含む全80文字となります。 これに対し、入力できるのは5*10=50文字までであるため、手数内で解の情報を引き出すことが重要です。 一切重複させずに文字を入力するのは不可能なため、なかなか奥が深いゲームだと言えそうです。

分析

強い初手を求める前に、少し問題データを分析してみました。

分析1. 各文字の出現頻度(何文字目かは考慮しない)
分析2. 各文字位置での出現頻度
分析3. 名前に1文字でもかする問題数の多いポケモン

分析1の結果は直感的にもしっくりくるかと思います。

分析2の結果については、4文字目、5文字目の方がやや情報量が大きくなっているのが面白いです。

分析3は「単体で効率のいいポケモンは誰か」を見たくて出してみましたが、一匹で279問中の200問以上をカバーできるポケモンが結構いることに驚きました。

また、「ヘ」、「ゾ」を持つ解は各1種類ずつしかないことも分かりました。(ヘラクロス、ナゾノクサ)

あと、全80種類のうち使われていない文字が3つあるようです。(面倒なので特定はしていない)

実験1 正解の選択肢数での評価

当初は、ある解に対してある手を入力した場合の状態(緑色、黄色、灰色の文字)を考慮して取りうる解の候補数を算出し、この候補数を小さくするように選べばよいだろうと考えました。

正解を1つ設定し、"手"を入力することで内部状態を求めるプログラムを作成しました。内部状態から取り柄ない解を除外した解候補及び、解候補をなるべく多くカバーした次の手を求める機能も実装しました。

>>> t.input('ランクルス')
>>> t.input('ウソッキー') 
>>> t.disp() 
ans:グラードン, steps:['ランクルス', 'ウソッキー'] 
correct: ..... , present: ンーラ , absent: ルスクキウソッ 
解候補(5): [('ユンゲラー', 3), ('ランターン', 3), ('グラードン', 3), ('レントラー', 3), ('ヒードラン', 3)] 
recommend(356): [('トドグラー', 8), ('ユンゲラー', 7), ('グラードン', 7), ('レントラー', 7), ('トリトドン', 7),

先程の分析で求めた効率的なポケモンを採用しつつ、このプログラムをポチポチしてなんとなく強そうな初手を見つけました。

頻出文字を序盤でカバーしている上、1文字たりともかすらないポケモンがいないので強力なパーティに違いない!と当初は思っていました。

実験2 正解の特定可能性を考慮した評価

ここからが本題となります。

先程の実験結果をもとに、['ランクルス', 'ウソッキー', 'ニョロトノ', 'クサイハナ', 'オシャマリ', 'ドーブル']という初手を見つけました。

ここで'マダツボミ'が問題だった場合について考えてみます。

ans:マダツボミ
初手:['ランクルス', 'ウソッキー', 'ニョロトノ', 'クサイハナ', 'オシャマリ', 'ドーブル'] 
correct: ..... , present: マ , absent: ニナーシトリオドクハルッロキョウソスイノャブランサ 
解候補(2): [('マダツボミ', 1), ('ジグザグマ', 1)] 
recommend(21): [('マダツボミ', 9), ('ジグザグマ', 9), ('ツボツボ', 8), ('ディグダ', 4),

なんと、この時点で'マ'が黄色になる以外は全て灰色となってしまいます。不使用文字(absent; 灰色)の情報から解候補はマダツボミ/ジグザグマの二択となっていますが、この情報から類推するのは実際にはかなり難しいのではないでしょうか。

そこで、”手”に対する新たな評価指標を導入します。

ある解に対する黄色、緑の文字数を求め、これらが少ない場合には解の特定が不可能と扱うことにします。具体的には、全問題パターン(279種類)に対して以下のような方法で特定状態のスコア付け(0.0~7.5点)を行います。

  • 緑色の文字1つにつき1.5点

  • 黄色の文字1つにつき1.0点 (緑色になっているものは除外)

  • 緑2文字、黄色0文字のものは特定が難しそうなので-0.1点(2.9点とする)

そして、特定状態スコアが3.0点未満の問題では”解の特定が不可能”とみなすことにしました。 開幕11手の戦略に対して、279問中で特定不可能とされた問題の数を減らすように探索を行いました。

探索については、以下のように行いました。

  1. ”手”の初期値はあるポケモン1匹とする。

  2. 現在の手に対し、解の特定が不可能なポケモンの集合Aを求める。

  3. 集合Aに対し、後述の処理1を実行する。最も評価値が高いものを次の1手として選択する。

  4. 手数が11になったら終了。そうでなければ2に戻る。

処理1: 次の1手のスコアの求め方

言葉での説明が難しかったので擬似コードになっています。すみません。

for 次の一手N in 手の候補(843種類):
    スコア = 0
    for char in 次の一手N: # 次の一手に含まれる文字を1つずつ調べる
        if char が 未登場文字(白色;集合Aのポケモンに含まれる かつ 現在黄色/緑ではない)である:
            スコア += 2
        else if charが位置未特定文字(黄色)である: # 位置の特定になる可能性がある
            スコア += 1
        else if charが未使用文字(灰色)である:
            スコア -= 2
        else:
            pass # 既に緑のものはそのまま
    次の一手Nのスコア = スコア

ちなみに、探索初期では10点満点(どの文字も登場していない)の候補が多数出ますが、今回は図鑑番号順で一番前に来るやつを選択させています。

以上の条件について、初手を全ポケモン(843種類)について試しながらそれぞれの解を求めたところ、最終的に特定不可能なポケモンの数が最小となったのは以下のパターンでした。
['ビリジオン', 'フシギダネ', 'カメックス', 'キャタピー', 'ライチュウ', 'ニョロトノ', 'ディアルガ', 'マダツボミ', 'エレザード']

初手= ['ビリジオン', 'フシギダネ', 'カメックス', 'キャタピー', 'ライチュウ', 'ニョロトノ', 'ディアルガ', 'マダツボミ', 'エレザード']
特定不能(10): [('クサイハナ', 2.0), ('ヤンヤンマ', 2.0), ('ゴニョニョ', 2.0), ('サンドパン', 2.5), ('ナゾノクサ', 2.5), ('サワムラー', 2.5), ('マグマッグ', 2.5), ('ハリテヤマ', 2.5), ('ムクホーク', 2.5), ('ヒポポタス', 2.5)]
文字カバー率 62.3% (48/77)

特定不能と判定された10問のうち、クサイハナ、ヤンヤンマ、ゴニョニョが2.0点(黄色2文字)、その他の7つが2.5点(緑、黄色各1文字)となりました。これらの問題が来てしまった場合は頑張って推定するしかありません。

1手だけでのカバー率が高いポケモン(レントラー、ジーランス等)が出てきていませんが、9手全体でカバー率を高める方向となっており、自然な結果だと考えています。

ちなみに、実験1で求めた['ランクルス', 'ウソッキー', 'オシャマリ', 'ニョロトノ', 'クサイハナ', 'ドーブル']の続きを探索するケースも調べてみましたが、 こちらは最良でも特定困難な問題が19個残る結果となりました。後半の手ほど新しい文字を選びにくくなっているのかもしれません。

初手= ['ランクルス', 'ウソッキー', 'オシャマリ', 'ニョロトノ', 'クサイハナ', 'ドーブル', 'カチコール', 'ディアルガ', 'フシギダネ']
特定不能(19): [('ジグザグマ', 1.0), ('ジュペッタ', 1.0), ('ヒポポタス', 1.5), ('マダツボミ', 2.0), ('マグマッグ', 2.0), ...

おわりに

ということで、ポケモンwordleの効率的な初手について考えてみました。
緑色文字の扱いが完璧ではなかったり、同一スコアの候補の扱いが雑だったりと改善の余地もありますが、なかなかいい手を見つけられたので満足です。

あまりズルしたくはないですが、一回ぐらい今回のパーティを使ってみようと思います。

それでは。

この記事が気に入ったらサポートをしてみませんか?