ぱそきいろのIT日記

ぱそきいろがITに関する記事を書いていきます。

ポケモンWordleを大人の力(Python)を使って解く

こんばんは、ぱそきいろ (@takacpu55) | Twitterです。
最近Wordleが人気ですね。
また、Wordleから派生してポケモンWordleというものもあるみたいです。
wordle.mega-yadoran.jp
ポケモンをやっていた身としては「なんとしてもチャレンジしなくては!」と意気込んでいたものの、全然解けませんでした。。
そこで大人の力(Python)を使ってポケモンWordleを解きました。
(数時間で、最低限解ければいいという発想で作っていますので、コードが汚い、効率が悪いはご容赦を。。。)

製作物

実際にPythonでポケモンWordleを解いている動画を上げています。(早送りしております。)
www.youtube.com

右の画面でポケモンWordleを開き、左の画面でPythonにWordleを解かせています。
まずはポケモンWordleにポケモンを入力する。
その次にPythonに入力したポケモンとその結果を入力することで、候補のポケモンを調べています。

解説

大まかに以下のフローでできています。

  1. ポケモン一覧を読み込む
  2. ポケモンを入力する
  3. 緑の場所、黄色の場所を入力する
  4. 候補のポケモンを出力する
  5. 2に戻る
ポケモン一覧を読み込む

ポケモン一覧をまとめてくれるJSONファイルがあります。
ここの記事でデータ読み込みなどをまとめています。
これを参考に名前の一覧を取得します。
www.takacpu55.xyz

ポケモンを絞り込む

緑と黄色の文字が入っているポケモンのみを抽出します。

for i in range(len(inname)):
    if i in inputyellow:
        hirayellow.append(inname[i])
    elif i not in inputgreen:
        if (inname[i] not in hiragreen) and (inname[i] not in hirayellow):
            hirayellow2.append(inname[i])

ここらへんで緑の文字が指定の場所にあるポケモンのみを残すという処理をしてます。

for i in range(len(name)):
    if re.compile("".join(hiragreen)).search(name[i]):
        nametemp.append(name[i])

そしてここらへんで黄色の文字が含まれているポケモンを残すという処理をしてます。

for i in range(len(hirayellow2)):
    nametemp2=[]
    for j in range(len(nametemp)):
        if hirayellow2[i] not in nametemp[j]:
            nametemp2.append(nametemp[j])
    nametemp = nametemp2

これらをポケモンの残りが1つになるまで続けます。

まとめ

コードを書くの自体は数時間で終わったのですが、動画をあげるのとブログに書くのに時間がかかった。。。
もう一度動かしているところを載せておきます。
www.youtube.com
ちょうどいい難易度で楽しかったです。

コード
# -*- coding: utf-8 -*-

# Press the green button in the gutter to run the script.
import json
import re
import pprint


def readPokemon():
    name=[]
    s = open("./pokemon.json-master/pokedex.json", "r",encoding="utf-8_sig")
    json_load = json.load(s)
    for i in range(491):
        name.append(json_load[i]["name"]["japanese"])
    return name

def solve(name):
    inputName=[]
    targetName=r"-----"

    for num in range(10):
        print("入力したポケモン")
        inname=input()
        print("緑色は何番目?")
        inputgreen=list(map(lambda x:int(x)-1,input().split()))
        print("黄色は何番目?")
        inputyellow=list(map(lambda x:int(x)-1,input().split()))

        inputName.append([inname,inputgreen,inputyellow])
        if inputgreen==[0,1,2,3,4]:
            return
        nametemp=[]
        nametemp2=[]
        hiragreen=[".",".",".",".","."]
        hirayellow=[]
        hirayellow2=[]
        for i in inputgreen:
            hiragreen[i]=inname[i]


        for i in range(len(inname)):
            if i in inputyellow:
                hirayellow.append(inname[i])
            elif i not in inputgreen:
                if (inname[i] not in hiragreen) and (inname[i] not in hirayellow):
                    hirayellow2.append(inname[i])


        for i in range(len(name)):
            if re.compile("".join(hiragreen)).search(name[i]):
                nametemp.append(name[i])

        for i in range(len(hirayellow)):
            nametemp2=[]
            for j in range(len(nametemp)):
                if hirayellow[i] in nametemp[j]:
                    nametemp2.append(nametemp[j])
            nametemp = nametemp2

        for i in range(len(hirayellow2)):
            nametemp2=[]
            for j in range(len(nametemp)):
                if hirayellow2[i] not in nametemp[j]:
                    nametemp2.append(nametemp[j])
            nametemp = nametemp2


        if len(nametemp2)==1:
            print(nametemp2[0])
            return
        print(nametemp2)
        print("残り"+str(len(nametemp2)))
        name=nametemp2


if __name__ == '__main__':
    name=readPokemon()
    while True:
        solve(name)