POKEMON WORDLE(ポケモンWordle)の最適解導出プログラム
ポケモン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)
以上。