Created
February 9, 2022 15:43
-
-
Save CookieBox26/474f64ffa514222675e1a43d855ac1b1 to your computer and use it in GitHub Desktop.
Untitled.ipynb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"入力可能ポケモン 847 ['フシギダネ', 'フシギソウ', 'フシギバナ'] ... ['レジドラゴ', 'ブリザポス', 'レイスポス']\n", | |
"正答候補ポケモン 511 ['フシギダネ', 'フシギソウ', 'フシギバナ'] ... ['レジドラゴ', 'ブリザポス', 'レイスポス']\n" | |
] | |
} | |
], | |
"source": [ | |
"import re\n", | |
"katakana = re.compile('[\\u30A1-\\u30FF]+')\n", | |
"\n", | |
"'''\n", | |
"そのポケモンが入力可能か=5文字以下かつ全てカタカナか\n", | |
"'''\n", | |
"def is_inputable(s):\n", | |
" return (len(s)<=5) and (katakana.fullmatch(s) is not None)\n", | |
"\n", | |
"'''\n", | |
"ポケモンの取得\n", | |
"'''\n", | |
"def get_pokemons():\n", | |
" pokemons = [] # 入力可能ポケモン \n", | |
" pokemons_kouho = [] # 正答候補ポケモン \n", | |
" # ウィキペディアから剣盾のポケモンまでコピーし各行を「番号\\tポケモン名」にする\n", | |
" with open('poke.txt', encoding='utf8') as ifile:\n", | |
" for line in ifile:\n", | |
" pokemon = line.strip().split('\\t')[1]\n", | |
" if is_inputable(pokemon):\n", | |
" pokemons.append(pokemon)\n", | |
" if len(pokemon) == 5:\n", | |
" pokemons_kouho.append(pokemon)\n", | |
" return pokemons, pokemons_kouho\n", | |
"\n", | |
"pokemons, pokemons_kouho = get_pokemons()\n", | |
"print('入力可能ポケモン', len(pokemons), pokemons[:3], '...', pokemons[-3:])\n", | |
"print('正答候補ポケモン', len(pokemons_kouho), pokemons_kouho[:3], '...', pokemons_kouho[-3:])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"黒黒黄黄黒\n" | |
] | |
} | |
], | |
"source": [ | |
"from collections import defaultdict\n", | |
"\n", | |
"'''\n", | |
"正答ポケモンが pokemon_answer の条件下で\n", | |
"入力ポケモン pokemon_input を入力したときの返却画面\n", | |
"'''\n", | |
"def get_gamen(pokemon_input, pokemon_answer):\n", | |
" gamen = ['黒'] * 5 # デフォルトですべて黒にしておく\n", | |
" d = defaultdict(list)\n", | |
" for i, s in enumerate(pokemon_input): # 入力ポケモンを{ 使用文字: 使用位置, ... } の形の辞書にする\n", | |
" d[s].append(i)\n", | |
" for k, v in d.items(): # 入力ポケモン中の文字ごとに処理する\n", | |
" if k not in pokemon_answer: # 正解ポケモン中で使われていない文字ならば色塗り処理なし\n", | |
" continue\n", | |
" index_ = [i for i, s in enumerate(pokemon_answer) if s == k] # 正解ポケモン側での使用位置を抽出する\n", | |
" match = list(set(index_) & set(v))\n", | |
" for m in match: # 正解側と入力側の使用位置の共通部分は必ず緑に塗る\n", | |
" gamen[m] = '緑'\n", | |
" v.remove(m)\n", | |
" index_.remove(m)\n", | |
" for i in range(len(index_)): # 共通部分除去しても正解側にまだ使用位置があるときその個数まで黄に塗る\n", | |
" if i >= len(v): # 入力側にもう塗る位置がないなら終わる\n", | |
" break\n", | |
" gamen[v[i]] = '黄'\n", | |
" return ''.join(gamen)\n", | |
"\n", | |
"pokemon_input = 'キノココ'\n", | |
"pokemon_answer = 'ココロモリ'\n", | |
"print(get_gamen(pokemon_input, pokemon_answer))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from collections import Counter\n", | |
"\n", | |
"# { 入力ポケモン: { 画面: [候補], 画面: [候補], ...}, } の形式のデータの作成\n", | |
"results = {}\n", | |
"for pokemon_input in pokemons: # 入力可能ポケモン\n", | |
" results[pokemon_input] = defaultdict(set)\n", | |
" for pokemon_answer in pokemons_kouho: # 正答候補ポケモン\n", | |
" gamen = get_gamen(pokemon_input, pokemon_answer)\n", | |
" results[pokemon_input][gamen].add(pokemon_answer)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"フシギダネ\n", | |
" 緑緑緑緑緑 ( 0.20%) 候補数 1 ['フシギダネ']\n", | |
" 緑緑緑黒黒 ( 0.39%) 候補数 2 ['フシギバナ', 'フシギソウ']\n", | |
" 黒黒黒黒黒 (75.15%) 候補数 384 ['メブキジカ', 'キングドラ', 'ムウマージ', 'ジグザグマ', 'アーケオス']\n", | |
" 黄黒黒黒黒 ( 2.74%) 候補数 14 ['モルフォン', 'コジョフー', 'バッフロン', 'ベイリーフ', 'ペロッパフ']\n", | |
" 黄黄黒黒黒 ( 0.39%) 候補数 2 ['ラフレシア', 'コフキムシ']\n", | |
" ...\n", | |
"フシギソウ\n", | |
" 緑緑緑黒黒 ( 0.39%) 候補数 2 ['フシギダネ', 'フシギバナ']\n", | |
" 緑緑緑緑緑 ( 0.20%) 候補数 1 ['フシギソウ']\n", | |
" 黒黒黒黒黒 (74.36%) 候補数 380 ['メブキジカ', 'キングドラ', 'ジグザグマ', 'アーケオス', 'キリンリキ']\n", | |
" 黄黒黒黒黒 ( 2.74%) 候補数 14 ['モルフォン', 'コジョフー', 'バッフロン', 'ベイリーフ', 'ペロッパフ']\n", | |
" 黒黒黒黒緑 ( 1.76%) 候補数 9 ['デンリュウ', 'アズマオウ', 'ミニリュウ', 'ミズゴロウ', 'ママンボウ']\n", | |
" ...\n", | |
"フシギバナ\n", | |
" 緑緑緑黒黒 ( 0.39%) 候補数 2 ['フシギダネ', 'フシギソウ']\n", | |
" 緑緑緑緑緑 ( 0.20%) 候補数 1 ['フシギバナ']\n", | |
" 黒黒黒黒黒 (72.41%) 候補数 370 ['メブキジカ', 'キングドラ', 'ムウマージ', 'ジグザグマ', 'アーケオス']\n", | |
" 黄黒黒黄黒 ( 0.59%) 候補数 3 ['バッフロン', 'バタフリー', 'バクフーン']\n", | |
" 黒黒黒黒緑 ( 0.59%) 候補数 3 ['クサイハナ', 'ニドリーナ', 'キレイハナ']\n", | |
" ...\n", | |
"...\n" | |
] | |
} | |
], | |
"source": [ | |
"for i, (pokemon_input, result) in enumerate(results.items()):\n", | |
" if i == 3:\n", | |
" print('...')\n", | |
" break\n", | |
" print(pokemon_input)\n", | |
" for j, (gamen, kouho) in enumerate(result.items()):\n", | |
" if j == 5:\n", | |
" print(' ...')\n", | |
" break\n", | |
" count = len(kouho)\n", | |
" prob = float(count) / 511.0\n", | |
" print(' ', gamen, f'({prob:6.2%}) 候補数 {count: >3}', list(kouho)[:5])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"◆ 1手目終了後に残る候補数の期待値\n", | |
" 1位 ジーランス 1手目終了後に残る候補数の期待値: 58.900195694716224\n", | |
" 2位 レントラー 1手目終了後に残る候補数の期待値: 59.21330724070448\n", | |
" 3位 ルナトーン 1手目終了後に残る候補数の期待値: 61.60861056751469\n", | |
" 4位 ネンドール 1手目終了後に残る候補数の期待値: 63.61643835616436\n", | |
" 5位 ランクルス 1手目終了後に残る候補数の期待値: 65.03326810176122\n", | |
" 6位 デスカーン 1手目終了後に残る候補数の期待値: 68.30528375733853\n", | |
" 7位 デスバーン 1手目終了後に残る候補数の期待値: 71.1037181996086\n", | |
" 8位 エルフーン 1手目終了後に残る候補数の期待値: 71.14285714285712\n", | |
" 9位 グラードン 1手目終了後に残る候補数の期待値: 71.9060665362035\n", | |
" 10位 ハンテール 1手目終了後に残る候補数の期待値: 72.64579256360076\n", | |
"838位 エネコ 1手目終了後に残る候補数の期待値: 389.3639921722114\n", | |
"839位 パウワウ 1手目終了後に残る候補数の期待値: 390.7221135029356\n", | |
"840位 ゴニョニョ 1手目終了後に残る候補数の期待値: 404.324853228963\n", | |
"841位 ベベノム 1手目終了後に残る候補数の期待値: 404.5733855185911\n", | |
"842位 ブビィ 1手目終了後に残る候補数の期待値: 408.0841487279845\n", | |
"843位 モノズ 1手目終了後に残る候補数の期待値: 414.9726027397261\n", | |
"844位 モココ 1手目終了後に残る候補数の期待値: 420.54990215264195\n", | |
"845位 ミネズミ 1手目終了後に残る候補数の期待値: 423.857142857143\n", | |
"846位 ツボツボ 1手目終了後に残る候補数の期待値: 453.23874755381615\n", | |
"847位 ピィ 1手目終了後に残る候補数の期待値: 470.28767123287673\n" | |
] | |
} | |
], | |
"source": [ | |
"import collections\n", | |
"\n", | |
"kitaichis = {}\n", | |
"n_pokemons_kouho = float(len(pokemons_kouho))\n", | |
"for pokemon_input, result in results.items():\n", | |
" kitaichi = 0.0\n", | |
" for gamen, kouho in result.items():\n", | |
" if gamen == '緑緑緑緑緑':\n", | |
" continue\n", | |
" count = len(kouho)\n", | |
" kitaichi += float(count * count) / n_pokemons_kouho\n", | |
" kitaichis[pokemon_input] = kitaichi\n", | |
"kitaichis = sorted(kitaichis.items(), key=lambda x:x[1])\n", | |
"print('◆ 1手目終了後に残る候補数の期待値')\n", | |
"for i, (k, v) in enumerate(kitaichis):\n", | |
" if (i + 1 < 11) or (i + 1 > 837): \n", | |
" print(f'{(i+1):>3}位', f'{k: <5}', ' 1手目終了後に残る候補数の期待値:', v)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"◆ 1手目終了後に残る候補数が1になる確率\n", | |
" 1位 ランドロス 1手目終了後に残る候補数が1になる確率: 0.050880626223091974\n", | |
" 2位 ヒードラン 1手目終了後に残る候補数が1になる確率: 0.046966731898238745\n", | |
" 3位 バクフーン 1手目終了後に残る候補数が1になる確率: 0.043052837573385516\n", | |
" 4位 オンバット 1手目終了後に残る候補数が1になる確率: 0.043052837573385516\n", | |
" 5位 ナックラー 1手目終了後に残る候補数が1になる確率: 0.0410958904109589\n", | |
" 6位 ジーランス 1手目終了後に残る候補数が1になる確率: 0.0410958904109589\n", | |
" 7位 グラードン 1手目終了後に残る候補数が1になる確率: 0.0410958904109589\n", | |
" 8位 ドンカラス 1手目終了後に残る候補数が1になる確率: 0.0410958904109589\n", | |
" 9位 レアコイル 1手目終了後に残る候補数が1になる確率: 0.03913894324853229\n", | |
" 10位 キングラー 1手目終了後に残る候補数が1になる確率: 0.03913894324853229\n", | |
"838位 ナゲキ 1手目終了後に残る候補数が1になる確率: 0.0019569471624266144\n", | |
"839位 モノズ 1手目終了後に残る候補数が1になる確率: 0.0019569471624266144\n", | |
"840位 シシコ 1手目終了後に残る候補数が1になる確率: 0.0019569471624266144\n", | |
"841位 デデンネ 1手目終了後に残る候補数が1になる確率: 0.0019569471624266144\n", | |
"842位 ヌメラ 1手目終了後に残る候補数が1になる確率: 0.0019569471624266144\n", | |
"843位 ツツケラ 1手目終了後に残る候補数が1になる確率: 0.0019569471624266144\n", | |
"844位 ヨワシ 1手目終了後に残る候補数が1になる確率: 0.0019569471624266144\n", | |
"845位 ウッウ 1手目終了後に残る候補数が1になる確率: 0.0019569471624266144\n", | |
"846位 スバメ 1手目終了後に残る候補数が1になる確率: 0.0\n", | |
"847位 ギモー 1手目終了後に残る候補数が1になる確率: 0.0\n" | |
] | |
} | |
], | |
"source": [ | |
"probs = {}\n", | |
"for pokemon_input, result in results.items():\n", | |
" prob = 0.0\n", | |
" for gamen, kouho in result.items():\n", | |
" if gamen == '緑緑緑緑緑':\n", | |
" continue\n", | |
" if len(kouho) == 1:\n", | |
" prob += 1.0\n", | |
" probs[pokemon_input] = prob / n_pokemons_kouho\n", | |
"probs = sorted(probs.items(), key=lambda x:-x[1])\n", | |
"print('◆ 1手目終了後に残る候補数が1になる確率')\n", | |
"for i, (k, v) in enumerate(probs):\n", | |
" if (i + 1 < 11) or (i + 1 > 837): \n", | |
" print(f'{(i+1):>3}位', f'{k: <5}', ' 1手目終了後に残る候補数が1になる確率:', v)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ランドロス\n", | |
" 黒黒緑黒緑 ( 0.20%) 候補数 1 ['マタドガス']\n", | |
" 黄黒黒黒黄 ( 0.20%) 候補数 1 ['ストライク']\n", | |
" 黒緑黒緑緑 ( 0.20%) 候補数 1 ['ケンタロス']\n", | |
" 黄黒黄黒緑 ( 0.20%) 候補数 1 ['ギャラドス']\n", | |
" 黒黄黒黒緑 ( 0.20%) 候補数 1 ['ソーナンス']\n", | |
" 黄黒黒緑緑 ( 0.20%) 候補数 1 ['ヘラクロス']\n", | |
" 黄緑黄黒黒 ( 0.20%) 候補数 1 ['キングドラ']\n", | |
" 黒緑黄黒黒 ( 0.20%) 候補数 1 ['ドンファン']\n", | |
" 黄緑黒黒緑 ( 0.20%) 候補数 1 ['バンギラス']\n", | |
" 黄黒黄黒黄 ( 0.20%) 候補数 1 ['ボスゴドラ']\n", | |
" 黒黒黒黄緑 ( 0.20%) 候補数 1 ['トロピウス']\n", | |
" 黄黄黒黒緑 ( 0.20%) 候補数 1 ['ジーランス']\n", | |
" 緑黒黄黒黒 ( 0.20%) 候補数 1 ['ラムパルド']\n", | |
" 黄緑黄黒緑 ( 0.20%) 候補数 1 ['ドンカラス']\n", | |
" 黄黄緑黒黒 ( 0.20%) 候補数 1 ['ヒードラン']\n", | |
" 黒緑黒緑黒 ( 0.20%) 候補数 1 ['ケンホロウ']\n", | |
" 黄緑緑黒黒 ( 0.20%) 候補数 1 ['ペンドラー']\n", | |
" 緑緑黒黒緑 ( 0.20%) 候補数 1 ['ランクルス']\n", | |
" 緑緑緑緑緑 ( 0.20%) 候補数 1 ['ランドロス']\n", | |
" 黄黒黒黄黒 ( 0.20%) 候補数 1 ['カラマネロ']\n", | |
" 黄黒黄黄黒 ( 0.20%) 候補数 1 ['ドラミドロ']\n", | |
" 黒黒黒緑黄 ( 0.20%) 候補数 1 ['フクスロー']\n", | |
" 黒黄黄黄黒 ( 0.20%) 候補数 1 ['ドロバンコ']\n", | |
" 黒緑黄黄黒 ( 0.20%) 候補数 1 ['バンバドロ']\n", | |
" 緑黄黒黒緑 ( 0.20%) 候補数 1 ['ラランテス']\n", | |
" 黒黄緑黒黒 ( 0.20%) 候補数 1 ['ズガドーン']\n", | |
" 黄黒緑黒黒 ( 0.20%) 候補数 1 ['レジドラゴ']\n" | |
] | |
} | |
], | |
"source": [ | |
"if True:\n", | |
" pokemon_input = 'ランドロス'\n", | |
" result = results[pokemon_input]\n", | |
" print(pokemon_input)\n", | |
" for j, (gamen, kouho) in enumerate(result.items()):\n", | |
" count = len(kouho)\n", | |
" if count != 1:\n", | |
" continue\n", | |
" prob = float(count) / 511.0\n", | |
" print(' ', gamen, f'({prob:6.2%}) 候補数 {count: >3}', list(kouho)[:5])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"スバメ\n", | |
" 黄黄黄黒黒 ( 0.39%) 候補数 2 ['オオスバメ', 'バクガメス']\n", | |
"ギモー\n", | |
" 黄黒黄黒黒 ( 0.39%) 候補数 2 ['アギルダー', 'ヨーギラス']\n" | |
] | |
} | |
], | |
"source": [ | |
"if True:\n", | |
" pokemon_input = 'スバメ'\n", | |
" result = results[pokemon_input]\n", | |
" print(pokemon_input)\n", | |
" for j, (gamen, kouho) in enumerate(result.items()):\n", | |
" count = len(kouho)\n", | |
" if count == 2:\n", | |
" prob = float(count) / 511.0\n", | |
" print(' ', gamen, f'({prob:6.2%}) 候補数 {count: >3}', list(kouho)[:5])\n", | |
"if True:\n", | |
" pokemon_input = 'ギモー'\n", | |
" result = results[pokemon_input]\n", | |
" print(pokemon_input)\n", | |
" for j, (gamen, kouho) in enumerate(result.items()):\n", | |
" count = len(kouho)\n", | |
" if count == 2:\n", | |
" prob = float(count) / 511.0\n", | |
" print(' ', gamen, f'({prob:6.2%}) 候補数 {count: >3}', list(kouho)[:5])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"◆ 1手目終了後に残る候補数が5以下になる確率\n", | |
" 1位 ドンカラス 1手目終了後に残る候補数が5以下になる確率: 0.1761252446183953\n", | |
" 2位 アーマルド 1手目終了後に残る候補数が5以下になる確率: 0.16046966731898238\n", | |
" 3位 グラードン 1手目終了後に残る候補数が5以下になる確率: 0.15459882583170254\n", | |
" 4位 ランドロス 1手目終了後に残る候補数が5以下になる確率: 0.15459882583170254\n", | |
" 5位 シンボラー 1手目終了後に残る候補数が5以下になる確率: 0.14285714285714285\n", | |
" 6位 ムーランド 1手目終了後に残る候補数が5以下になる確率: 0.1350293542074364\n", | |
" 7位 サンダース 1手目終了後に残る候補数が5以下になる確率: 0.13111545988258316\n", | |
" 8位 キングドラ 1手目終了後に残る候補数が5以下になる確率: 0.13111545988258316\n", | |
" 9位 キングラー 1手目終了後に残る候補数が5以下になる確率: 0.12915851272015655\n", | |
" 10位 ネンドール 1手目終了後に残る候補数が5以下になる確率: 0.12720156555772993\n", | |
"838位 プリン 1手目終了後に残る候補数が5以下になる確率: 0.011741682974559686\n", | |
"839位 ダゲキ 1手目終了後に残る候補数が5以下になる確率: 0.011741682974559686\n", | |
"840位 クスネ 1手目終了後に残る候補数が5以下になる確率: 0.011741682974559686\n", | |
"841位 オタチ 1手目終了後に残る候補数が5以下になる確率: 0.009784735812133072\n", | |
"842位 モノズ 1手目終了後に残る候補数が5以下になる確率: 0.009784735812133072\n", | |
"843位 ギモー 1手目終了後に残る候補数が5以下になる確率: 0.009784735812133072\n", | |
"844位 エネコ 1手目終了後に残る候補数が5以下になる確率: 0.005870841487279843\n", | |
"845位 メテノ 1手目終了後に残る候補数が5以下になる確率: 0.005870841487279843\n", | |
"846位 ゾロア 1手目終了後に残る候補数が5以下になる確率: 0.003913894324853229\n", | |
"847位 ヤクデ 1手目終了後に残る候補数が5以下になる確率: 0.003913894324853229\n" | |
] | |
} | |
], | |
"source": [ | |
"probs = {}\n", | |
"for pokemon_input, result in results.items():\n", | |
" prob = 0.0\n", | |
" for gamen, kouho in result.items():\n", | |
" if gamen == '緑緑緑緑緑':\n", | |
" continue\n", | |
" count = len(kouho)\n", | |
" if count <= 5:\n", | |
" prob += float(count)\n", | |
" probs[pokemon_input] = prob / n_pokemons_kouho\n", | |
"probs = sorted(probs.items(), key=lambda x:-x[1])\n", | |
"print('◆ 1手目終了後に残る候補数が5以下になる確率')\n", | |
"for i, (k, v) in enumerate(probs):\n", | |
" if (i + 1 < 11) or (i + 1 > 837): \n", | |
" print(f'{(i+1):>3}位', f'{k: <5}', ' 1手目終了後に残る候補数が5以下になる確率:', v)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"◆ 2手目終了後に残る候補数の期待値 (2手目は2手目終了後の候補数の期待値が最小になる手を選択)\n", | |
" 1位 ランクルス 2手目終了後に残る候補数の期待値: 7.8238747553816035\n", | |
" 2位 ジーランス 2手目終了後に残る候補数の期待値: 8.1839530332681\n", | |
" 3位 レントラー 2手目終了後に残る候補数の期待値: 8.571428571428566\n", | |
" 4位 カイリキー 2手目終了後に残る候補数の期待値: 8.628180039138945\n", | |
" 5位 ドッコラー 2手目終了後に残る候補数の期待値: 9.65949119373777\n", | |
" 6位 カイリュー 2手目終了後に残る候補数の期待値: 9.904109589041097\n", | |
" 7位 オーロット 2手目終了後に残る候補数の期待値: 9.94911937377691\n", | |
" 8位 テッシード 2手目終了後に残る候補数の期待値: 9.968688845401168\n", | |
" 9位 ネンドール 2手目終了後に残る候補数の期待値: 10.02348336594912\n", | |
" 10位 ルナトーン 2手目終了後に残る候補数の期待値: 10.273972602739729\n", | |
" 11位 ランドロス 2手目終了後に残る候補数の期待値: 10.36594911937378\n", | |
" 12位 バオッキー 2手目終了後に残る候補数の期待値: 10.551859099804306\n", | |
" 13位 マルマイン 2手目終了後に残る候補数の期待値: 10.628180039138927\n", | |
" 14位 リーシャン 2手目終了後に残る候補数の期待値: 10.651663405088058\n", | |
" 15位 マルノーム 2手目終了後に残る候補数の期待値: 10.772994129158503\n", | |
" 16位 ブラッキー 2手目終了後に残る候補数の期待値: 10.863013698630125\n", | |
" 17位 エルフーン 2手目終了後に残る候補数の期待値: 10.9041095890411\n", | |
" 18位 ウーラオス 2手目終了後に残る候補数の期待値: 10.90606653620352\n", | |
" 19位 デスバーン 2手目終了後に残る候補数の期待値: 10.915851272015647\n", | |
" 20位 ナックラー 2手目終了後に残る候補数の期待値: 10.960861056751476\n" | |
] | |
} | |
], | |
"source": [ | |
"def check_drop(kitaichis_kijun, kitaichi):\n", | |
" if len(kitaichis_kijun) < 20:\n", | |
" return False\n", | |
" elif kitaichi > kitaichis_kijun[-1]:\n", | |
" return True\n", | |
" return False\n", | |
"\n", | |
"kitaichis_kijun = []\n", | |
"kitaichis = {}\n", | |
"for pokemon_input, result in results.items():\n", | |
" kitaichi = 0.0\n", | |
" for gamen, kouho in result.items():\n", | |
" drop = check_drop(kitaichis_kijun, kitaichi)\n", | |
" if drop:\n", | |
" break\n", | |
" if gamen == '緑緑緑緑緑': # 1手目終了\n", | |
" continue\n", | |
" count = len(kouho)\n", | |
" prob = float(count) / n_pokemons_kouho # pokemon_input で gamen を引く確率\n", | |
" kitaichi_min = 1000\n", | |
" pokemon_input_kitaichi_min = None\n", | |
" for pokemon_input_ in pokemons:\n", | |
" kitaichi_ = 0.0\n", | |
" result_ = results[pokemon_input_]\n", | |
" for gamen_, kouho_ in result_.items():\n", | |
" drop_ = False\n", | |
" if (kitaichi_min != 1000) and (kitaichi_min < kitaichi_):\n", | |
" drop_ = True\n", | |
" break\n", | |
" kouho__ = kouho & kouho_\n", | |
" # 共通部分が 0 のとき, 1手目 pokemon_input で gamen を得た後\n", | |
" # 2手目 pokemon_input_ で gamen_ を得ることがないことを意味する\n", | |
" if len(kouho__) == 0:\n", | |
" continue\n", | |
" if gamen_ == '緑緑緑緑緑': # 2手目終了\n", | |
" continue\n", | |
" count_ = len(kouho__)\n", | |
" prob_ = float(count_) / count\n", | |
" kitaichi_ += prob_ * float(count_)\n", | |
" if drop_:\n", | |
" continue\n", | |
" if kitaichi_ < kitaichi_min:\n", | |
" kitaichi_min = kitaichi_\n", | |
" pokemon_input_kitaichi_min = pokemon_input_\n", | |
" kitaichi += prob * kitaichi_min\n", | |
" if drop:\n", | |
" continue\n", | |
" kitaichis[pokemon_input] = kitaichi\n", | |
" if (len(kitaichis_kijun) < 20) or (kitaichi < kitaichis_kijun[-1]):\n", | |
" kitaichis_kijun.append(kitaichi)\n", | |
" kitaichis_kijun = sorted(kitaichis_kijun)[:20]\n", | |
"kitaichis = sorted(kitaichis.items(), key=lambda x:x[1])\n", | |
"print('◆ 2手目終了後に残る候補数の期待値 (2手目は2手目終了後の候補数の期待値が最小になる手を選択)')\n", | |
"for i, (k, v) in enumerate(kitaichis):\n", | |
" if (i + 1 < 21): \n", | |
" print(f'{(i+1):>3}位', f'{k: <5}', ' 2手目終了後に残る候補数の期待値:', v)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.8" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment