伊深の隠れ家

備忘録かも~

POKEMON WORDLE(ポケモンWordle)の最適解導出プログラム

wordle.mega-yadoran.jp

ポケモンWordleなるものの最適解を自動で計算してくれるプログラムを
pythonの練習がてら書いてみました。

自己流なので記法とかヤバいから、マナー違反な書き方だとか
「ここはこうした方が効率がいい」とか色々意見が噴出しそう。

上記のものを解くために書いたけれど、
普通のWordleも解けるはず。辞書えぐそうだけど。

import numpy as np
global names_copy

#==============================
def shakeOff(names):
    tmp = np.array([])
    for i in range(len(names)):
        if len(names[i]) == 5:
            tmp = np.append(tmp, names[i])
    return(tmp)
#==============================
def analyse_frequency(names):
    # get_all_characters_and_unique_characters
    all_characters = np.array([])
    for i in range(len(names)):
        for j in range(5):
            all_characters = np.append(all_characters,names[i][j])
    unique_characters = np.array([])
    unique_characters = np.unique(all_characters)

    # create_array
    analysis_result = np.array([])
    for i in range(len(unique_characters)):
        analysis_result = np.append(analysis_result,unique_characters[i])
        analysis_result = np.append(analysis_result,0)
        analysis_result = np.append(analysis_result,0)
    analysis_result = np.array(analysis_result).reshape(-1, 3)

    # get_frequency_and_get_maximum_value
    maximum_value=1
    for i in range(len(analysis_result)):
        character = analysis_result[i][0]
        analysis_result[i][1] = np.count_nonzero(all_characters == character)
        if maximum_value < int(analysis_result[i][1]):
            maximum_value = int(analysis_result[i][1])

    # get_score
    i=0
    for i in range(len(analysis_result)):
        analysis_result[i][2] = round(int(analysis_result[i][1])/maximum_value*100)   
    return(analysis_result)

def find_candidate(analysis_result):
    # create_array
    names_and_scores = np.array([])
    for i in range(len(names)):
        names_and_scores = np.append(names_and_scores,names[i])
        names_and_scores = np.append(names_and_scores,0)
    names_and_scores = np.array(names_and_scores).reshape(-1, 2)

    # get_score
    for i in range(len(analysis_result)):
        for j in range(len(names_and_scores)):
            if analysis_result[i][0] in names_and_scores[j][0]:
                names_and_scores[j][1] =int(names_and_scores[j][1]) + int(analysis_result[i][2])

    # find_maximum_score
    scores = np.array([])
    scores = names_and_scores[:, 1].astype(np.int64)
    score_index = np.argmax(scores)
    candidate = names_and_scores[score_index][0]
    return(candidate)
#==============================
def get_match_status():
    print('')
    print('一致状況を入力してください')
    print('0:不一致(灰色)、1:文字一致(橙色)、2:一致(緑色)')
    print('(例):灰橙灰緑灰 → 01020')
    while True:
        try:
            status_code = int(input())
            if status_code < 0:
                status_code = 'ERROR'
                status_code = int(status_code)
            status_code = str(status_code).zfill(5)
            if len(status_code) != 5:
                status_code = 'ERROR'
                status_code = int(status_code)
            for i in range(3,10):
                if status_code.find(str(i)) != -1:
                    status_code = 'ERROR'
                    status_code = int(status_code)
            break
        except ValueError:
            print('入力されたステータスの値が不正です')
            print('')
    return(status_code)
#==============================
def update_names(names):
    names_tmp = np.array([])
    status_table = np.array([])

    for i in range(5):
        status_table = np.append(status_table, candidate[i])
    for i in range(5):
        status_table = np.append(status_table, match_status[i])
    status_table = np.array(status_table).reshape(2, 5)
    
    for i in range(5):
        if status_table[1][i] == '0':
            unuse_character = status_table[0][i]
            for j in range(len(names)):
                if unuse_character not in names[j]:
                    names_tmp = np.append(names_tmp, names[j])
            names = names_tmp
            names_tmp = np.array([])
        if status_table[1][i] == '1':
            use_character = status_table[0][i]
            for j in range(len(names)):
                if use_character in names[j]:
                    names_tmp = np.append(names_tmp, names[j])
            names = names_tmp
            names_tmp = np.array([])              

            for j in range(len(names)):
                if use_character not in names[j][i]:
                    names_tmp = np.append(names_tmp, names[j])
            names = names_tmp
            names_tmp = np.array([])
        if status_table[1][i] == '2':
            use_character = status_table[0][i]
            for j in range(len(names)):
                if use_character in names[j][i]:
                    names_tmp = np.append(names_tmp, names[j])
            names = names_tmp
            names_tmp = np.array([])
    return(names)
# ==============================

# ダイパまで
names = np.array(['フシギダネ', 'フシギソウ', 'フシギバナ', 'リザードン', 'カメックス', 'キャタピー', 'トランセル', 'バタフリー', 'ピジョット', 'オニスズメ', 'オニドリル', 'アーボック', 'ピカチュウ', 'ライチュウ', 'サンドパン', 'ニドラン♀', 'ニドリーナ', 'ニドクイン', 'ニドラン♂', 'ニドリーノ', 'ニドキング', 'キュウコン', 'ゴルバット', 'ナゾノクサ', 'クサイハナ', 'ラフレシア', 'パラセクト', 'モルフォン', 'ダグトリオ', 'ペルシアン', 'ゴルダック', 'オコリザル', 'ウインディ', 'ニョロボン', 'ユンゲラー', 'フーディン', 'ワンリキー', 'ゴーリキー', 'カイリキー', 'マダツボミ', 'ウツボット', 'メノクラゲ', 'ドククラゲ', 'イシツブテ', 'ゴローニャ', 'ギャロップ', 'レアコイル', 'ドードリオ', 'ベトベター', 'ベトベトン', 'シェルダー', 'パルシェン', 'スリーパー', 'キングラー', 'ビリリダマ', 'マルマイン', 'サワムラー', 'エビワラー', 'ベロリンガ', 'マタドガス', 'サイホーン', 'モンジャラ', 'トサキント', 'アズマオウ', 'ヒトデマン', 'スターミー', 'バリヤード', 'ストライク', 'ルージュラ', 'ケンタロス', 'コイキング', 'ギャラドス', 'シャワーズ', 'サンダース', 'ブースター', 'オムナイト', 'オムスター', 'カブトプス', 'フリーザー', 'ファイヤー', 'ミニリュウ', 'ハクリュー', 'カイリュー', 'ミュウツー', 'チコリータ', 'ベイリーフ', 'メガニウム', 'ヒノアラシ', 'マグマラシ', 'バクフーン', 'アリゲイツ', 'オーダイル', 'ヨルノズク', 'レディアン', 'アリアドス', 'クロバット', 'チョンチー', 'ランターン', 'トゲチック', 'ネイティオ', 'デンリュウ', 'キレイハナ', 'ウソッキー', 'ニョロトノ', 'ヒマナッツ', 'ヤンヤンマ', 'ブラッキー', 'ヤミカラス', 'ヤドキング', 'アンノーン', 'ソーナンス', 'キリンリキ', 'クヌギダマ', 'フォレトス', 'グライガー', 'ハガネール', 'グランブル', 'ハリーセン', 'ヘラクロス', 'マグマッグ', 'マグカルゴ', 'テッポウオ', 'デリバード', 'マンタイン', 'エアームド', 'キングドラ', 'ドンファン', 'ポリゴン2', 'カポエラー', 'ムチュール', 'エレキッド', 'ミルタンク', 'ヨーギラス', 'サナギラス', 'バンギラス', 'ジュプトル', 'ジュカイン', 'ワカシャモ', 'バシャーモ', 'ミズゴロウ', 'ヌマクロー', 'ラグラージ', 'ジグザグマ', 'マッスグマ', 'カラサリス', 'アゲハント', 'ドクケイル', 'ハスブレロ', 'ルンパッパ', 'ダーテング', 'オオスバメ', 'ペリッパー', 'サーナイト', 'アメモース', 'キノガッサ', 'ヤルキモノ', 'ケッキング', 'テッカニン', 'ゴニョニョ', 'バクオング', 'マクノシタ', 'ハリテヤマ', 'エネコロロ', 'ボスゴドラ', 'チャーレム', 'ライボルト', 'バルビート', 'イルミーゼ', 'マルノーム', 'サメハダー', 'ホエルオー', 'ブーピッグ', 'パッチール', 'ナックラー', 'ビブラーバ', 'フライゴン', 'チルタリス', 'ザングース', 'ハブネーク', 'ルナトーン', 'ソルロック', 'ドジョッチ', 'シザリガー', 'ネンドール', 'ユレイドル', 'アーマルド', 'ミロカロス', 'カクレオン', 'カゲボウズ', 'ジュペッタ', 'サマヨール', 'トロピウス', 'ユキワラシ', 'オニゴーリ', 'タマザラシ', 'トドグラー', 'トドゼルガ', 'ハンテール', 'サクラビス', 'ジーランス', 'ボーマンダ', 'メタグロス', 'レジロック', 'レジアイス', 'レジスチル', 'ラティアス', 'ラティオス', 'カイオーガ', 'グラードン', 'レックウザ', 'デオキシス', 'ハヤシガメ', 'ドダイトス', 'モウカザル', 'ゴウカザル', 'ポッチャマ', 'ポッタイシ', 'エンペルト', 'ムクバード', 'ムクホーク', 'コロボーシ', 'コロトック', 'レントラー', 'ロズレイド', 'ズガイドス', 'ラムパルド', 'タテトプス', 'トリデプス', 'ミノムッチ', 'ミノマダム', 'ガーメイル', 'ミツハニー', 'ビークイン', 'フローゼル', 'チェリンボ', 'カラナクシ', 'トリトドン', 'エテボース', 'フワライド', 'ミミロップ', 'ムウマージ', 'ドンカラス', 'ニャルマー', 'ブニャット', 'リーシャン', 'スカンプー', 'スカタンク', 'ドーミラー', 'ドータクン', 'ガブリアス', 'ヒポポタス', 'カバルドン', 'ドラピオン', 'グレッグル', 'ドクロッグ', 'マスキッパ', 'ケイコウオ', 'ネオラント', 'ユキカブリ', 'ユキノオー', 'マニューラ', 'ジバコイル', 'ベロベルト', 'ドサイドン', 'モジャンボ', 'エレキブル', 'ブーバーン', 'トゲキッス', 'メガヤンマ', 'リーフィア', 'グレイシア', 'グライオン', 'ポリゴンZ', 'エルレイド', 'ダイノーズ', 'ヨノワール', 'ユキメノコ', 'エムリット', 'ディアルガ', 'ヒードラン', 'レジギガス', 'ギラティナ', 'クレセリア', 'ダークライ', 'アルセウス'])

names_tmp = np.array([])
names = shakeOff(names)

for i in range(10):
    number_of_candidate = len(names)
    accuracy = round(1/number_of_candidate*100,1)

    frequency_analysis = np.array([])
    frequency_analysis = analyse_frequency(names)
    candidate = find_candidate(frequency_analysis)
    
    print('最有力候補は「', candidate, '」です。(候補数', number_of_candidate, '件、正解率', accuracy, '%)')
    
    match_status = get_match_status()
    print('')

    if match_status == '22222':
        print('正解おめでとうございます!')
        break
    names = update_names(names)

以上。