"""
learnstock.py
帰納的学習による10桁のパターン探索
パターンC・Dの候補を調べるプログラム
"""
import random
# グローバル変数
SETSIZE = 100 # 学習データの数
CNO = 10 # パターンの桁数
GENMAX = 10000 # 解候補を生成する回数
SEED = 7 # 乱数の初期値
# 学習データと教師データを読み込む関数
def readdata(data, teacher):
for i in range(SETSIZE):
line = input()
data[i] = [int(num) for num in line.split()]
teacher[i] = data[i][CNO]
# 解候補のスコアを計算する関数
def calcscore(data, teacher, answer):
score = 0
for i in range(SETSIZE):
point = 0
# 解候補と学習データの一致度を調べる
for j in range(CNO):
if answer[j] == 2:
point += 1 # 2はワイルドカード
elif answer[j] == data[i][j]:
point += 1 # 値が一致した
# 教師データと一致する場合に点数を加える
if point == CNO and teacher[i] == 1:
score += 1
elif point != CNO and teacher[i] == 0:
score += 1
return score
# メイン処理
score = 0
answer = [0 for i in range(CNO)]
data = [[] for i in range(SETSIZE)]
teacher = [0 for i in range(SETSIZE)]
bestscore = 0
bestanswer = [0 for i in range(CNO)]
# スコア別に異なる解候補を保存する
candidate_patterns = {}
# 乱数を初期化する
random.seed(SEED)
# 学習データを読み込む
readdata(data, teacher)
# 解候補を生成して評価する
for i in range(GENMAX):
# 10桁の解候補をランダムに生成する
for j in range(CNO):
answer[j] = random.randint(0, 2)
# 解候補のスコアを計算する
score = calcscore(data, teacher, answer)
# 最高スコアを更新する
if score > bestscore:
bestanswer = answer.copy()
bestscore = score
# 84点と100点以外の候補を記録する
if score != 84 and score != 100:
pattern = tuple(answer)
# 同じパターンを重複して保存しない
if pattern not in candidate_patterns:
candidate_patterns[pattern] = score
# スコアが高い順に並べる
sorted_patterns = sorted(
candidate_patterns.items(),
key=lambda item: item[1],
reverse=True
)
# パターンC・Dの候補を出力する
print("パターンC・Dの候補")
for i, (pattern, pattern_score) in enumerate(
sorted_patterns[:2]):
print("パターン", ["C", "D"][i])
print("解候補 =", list(pattern))
print("スコア =", pattern_score)
# 全体で見つかった最高スコアも出力する
print("探索全体の最良解")
print(bestanswer, ":score=", bestscore)
# your code goes here
CiIiIgpsZWFybnN0b2NrLnB5CuW4sOe0jeeahOWtpue/kuOBq+OCiOOCizEw5qGB44Gu44OR44K/44O844Oz5o6i57SiCuODkeOCv+ODvOODs0Pjg7tE44Gu5YCZ6KOc44KS6Kq/44G544KL44OX44Ot44Kw44Op44OgCiIiIgoKaW1wb3J0IHJhbmRvbQoKIyDjgrDjg63jg7zjg5Djg6vlpInmlbAKU0VUU0laRSA9IDEwMCAgICAgICAjIOWtpue/kuODh+ODvOOCv+OBruaVsApDTk8gPSAxMCAgICAgICAgICAgICMg44OR44K/44O844Oz44Gu5qGB5pWwCkdFTk1BWCA9IDEwMDAwICAgICAgIyDop6PlgJnoo5zjgpLnlJ/miJDjgZnjgovlm57mlbAKU0VFRCA9IDcgICAgICAgICAgICAjIOS5seaVsOOBruWIneacn+WApAoKCiMg5a2m57+S44OH44O844K/44Go5pWZ5bir44OH44O844K/44KS6Kqt44G/6L6844KA6Zai5pWwCmRlZiByZWFkZGF0YShkYXRhLCB0ZWFjaGVyKToKICAgIGZvciBpIGluIHJhbmdlKFNFVFNJWkUpOgogICAgICAgIGxpbmUgPSBpbnB1dCgpCiAgICAgICAgZGF0YVtpXSA9IFtpbnQobnVtKSBmb3IgbnVtIGluIGxpbmUuc3BsaXQoKV0KICAgICAgICB0ZWFjaGVyW2ldID0gZGF0YVtpXVtDTk9dCgoKIyDop6PlgJnoo5zjga7jgrnjgrPjgqLjgpLoqIjnrpfjgZnjgovplqLmlbAKZGVmIGNhbGNzY29yZShkYXRhLCB0ZWFjaGVyLCBhbnN3ZXIpOgogICAgc2NvcmUgPSAwCgogICAgZm9yIGkgaW4gcmFuZ2UoU0VUU0laRSk6CiAgICAgICAgcG9pbnQgPSAwCgogICAgICAgICMg6Kej5YCZ6KOc44Go5a2m57+S44OH44O844K/44Gu5LiA6Ie05bqm44KS6Kq/44G544KLCiAgICAgICAgZm9yIGogaW4gcmFuZ2UoQ05PKToKICAgICAgICAgICAgaWYgYW5zd2VyW2pdID09IDI6CiAgICAgICAgICAgICAgICBwb2ludCArPSAxICAgICAgICMgMuOBr+ODr+OCpOODq+ODieOCq+ODvOODiQogICAgICAgICAgICBlbGlmIGFuc3dlcltqXSA9PSBkYXRhW2ldW2pdOgogICAgICAgICAgICAgICAgcG9pbnQgKz0gMSAgICAgICAjIOWApOOBjOS4gOiHtOOBl+OBnwoKICAgICAgICAjIOaVmeW4q+ODh+ODvOOCv+OBqOS4gOiHtOOBmeOCi+WgtOWQiOOBq+eCueaVsOOCkuWKoOOBiOOCiwogICAgICAgIGlmIHBvaW50ID09IENOTyBhbmQgdGVhY2hlcltpXSA9PSAxOgogICAgICAgICAgICBzY29yZSArPSAxCiAgICAgICAgZWxpZiBwb2ludCAhPSBDTk8gYW5kIHRlYWNoZXJbaV0gPT0gMDoKICAgICAgICAgICAgc2NvcmUgKz0gMQoKICAgIHJldHVybiBzY29yZQoKCiMg44Oh44Kk44Oz5Yem55CGCnNjb3JlID0gMAphbnN3ZXIgPSBbMCBmb3IgaSBpbiByYW5nZShDTk8pXQpkYXRhID0gW1tdIGZvciBpIGluIHJhbmdlKFNFVFNJWkUpXQp0ZWFjaGVyID0gWzAgZm9yIGkgaW4gcmFuZ2UoU0VUU0laRSldCgpiZXN0c2NvcmUgPSAwCmJlc3RhbnN3ZXIgPSBbMCBmb3IgaSBpbiByYW5nZShDTk8pXQoKIyDjgrnjgrPjgqLliKXjgavnlbDjgarjgovop6PlgJnoo5zjgpLkv53lrZjjgZnjgosKY2FuZGlkYXRlX3BhdHRlcm5zID0ge30KCiMg5Lmx5pWw44KS5Yid5pyf5YyW44GZ44KLCnJhbmRvbS5zZWVkKFNFRUQpCgojIOWtpue/kuODh+ODvOOCv+OCkuiqreOBv+i+vOOCgApyZWFkZGF0YShkYXRhLCB0ZWFjaGVyKQoKIyDop6PlgJnoo5zjgpLnlJ/miJDjgZfjgaboqZXkvqHjgZnjgosKZm9yIGkgaW4gcmFuZ2UoR0VOTUFYKToKCiAgICAjIDEw5qGB44Gu6Kej5YCZ6KOc44KS44Op44Oz44OA44Og44Gr55Sf5oiQ44GZ44KLCiAgICBmb3IgaiBpbiByYW5nZShDTk8pOgogICAgICAgIGFuc3dlcltqXSA9IHJhbmRvbS5yYW5kaW50KDAsIDIpCgogICAgIyDop6PlgJnoo5zjga7jgrnjgrPjgqLjgpLoqIjnrpfjgZnjgosKICAgIHNjb3JlID0gY2FsY3Njb3JlKGRhdGEsIHRlYWNoZXIsIGFuc3dlcikKCiAgICAjIOacgOmrmOOCueOCs+OCouOCkuabtOaWsOOBmeOCiwogICAgaWYgc2NvcmUgPiBiZXN0c2NvcmU6CiAgICAgICAgYmVzdGFuc3dlciA9IGFuc3dlci5jb3B5KCkKICAgICAgICBiZXN0c2NvcmUgPSBzY29yZQoKICAgICMgODTngrnjgagxMDDngrnku6XlpJbjga7lgJnoo5zjgpLoqJjpjLLjgZnjgosKICAgIGlmIHNjb3JlICE9IDg0IGFuZCBzY29yZSAhPSAxMDA6CiAgICAgICAgcGF0dGVybiA9IHR1cGxlKGFuc3dlcikKCiAgICAgICAgIyDlkIzjgZjjg5Hjgr/jg7zjg7PjgpLph43opIfjgZfjgabkv53lrZjjgZfjgarjgYQKICAgICAgICBpZiBwYXR0ZXJuIG5vdCBpbiBjYW5kaWRhdGVfcGF0dGVybnM6CiAgICAgICAgICAgIGNhbmRpZGF0ZV9wYXR0ZXJuc1twYXR0ZXJuXSA9IHNjb3JlCgoKIyDjgrnjgrPjgqLjgYzpq5jjgYTpoIbjgavkuKbjgbnjgosKc29ydGVkX3BhdHRlcm5zID0gc29ydGVkKAogICAgY2FuZGlkYXRlX3BhdHRlcm5zLml0ZW1zKCksCiAgICBrZXk9bGFtYmRhIGl0ZW06IGl0ZW1bMV0sCiAgICByZXZlcnNlPVRydWUKKQoKIyDjg5Hjgr/jg7zjg7ND44O7ROOBruWAmeijnOOCkuWHuuWKm+OBmeOCiwpwcmludCgi44OR44K/44O844OzQ+ODu0Tjga7lgJnoo5wiKQoKZm9yIGksIChwYXR0ZXJuLCBwYXR0ZXJuX3Njb3JlKSBpbiBlbnVtZXJhdGUoCiAgICAgICAgc29ydGVkX3BhdHRlcm5zWzoyXSk6CiAgICBwcmludCgi44OR44K/44O844OzIiwgWyJDIiwgIkQiXVtpXSkKICAgIHByaW50KCLop6PlgJnoo5wgPSIsIGxpc3QocGF0dGVybikpCiAgICBwcmludCgi44K544Kz44KiID0iLCBwYXR0ZXJuX3Njb3JlKQoKIyDlhajkvZPjgafopovjgaTjgYvjgaPjgZ/mnIDpq5jjgrnjgrPjgqLjgoLlh7rlipvjgZnjgosKcHJpbnQoIuaOoue0ouWFqOS9k+OBruacgOiJr+inoyIpCnByaW50KGJlc3RhbnN3ZXIsICI6c2NvcmU9IiwgYmVzdHNjb3JlKQojIHlvdXIgY29kZSBnb2VzIGhlcmU=
MSAwIDAgMCAwIDAgMSAwIDAgMSAgICAgMQowIDEgMCAxIDAgMSAxIDEgMCAxICAgICAxCjAgMSAwIDAgMCAxIDEgMCAxIDAgICAgIDAKMSAwIDAgMSAxIDAgMSAwIDAgMSAgICAgMQoxIDAgMCAxIDEgMCAxIDEgMSAxICAgICAwCjAgMCAwIDAgMCAwIDEgMSAwIDAgICAgIDEKMSAxIDEgMSAwIDAgMSAxIDAgMSAgICAgMAowIDEgMSAxIDAgMSAxIDEgMCAxICAgICAwCjAgMCAxIDEgMCAxIDEgMSAwIDAgICAgIDAKMSAxIDEgMCAwIDAgMCAxIDEgMCAgICAgMAowIDAgMSAxIDEgMCAwIDAgMSAwICAgICAwCjEgMCAwIDAgMSAwIDEgMCAxIDEgICAgIDAKMCAxIDAgMCAxIDAgMCAwIDEgMSAgICAgMAowIDEgMSAwIDEgMCAwIDEgMSAxICAgICAwCjAgMCAxIDAgMSAwIDEgMCAxIDAgICAgIDAKMCAxIDEgMCAxIDEgMSAxIDEgMCAgICAgMAoxIDEgMCAwIDEgMSAxIDEgMCAwICAgICAxCjEgMCAwIDAgMSAxIDEgMCAwIDAgICAgIDEKMCAwIDEgMCAwIDEgMSAxIDAgMCAgICAgMAowIDEgMSAwIDAgMSAxIDEgMCAxICAgICAwCjEgMSAwIDEgMCAxIDEgMSAxIDEgICAgIDAKMSAxIDEgMCAxIDEgMSAwIDEgMCAgICAgMAowIDEgMSAwIDEgMSAxIDAgMCAxICAgICAwCjEgMSAxIDEgMSAxIDAgMCAwIDEgICAgIDAKMSAxIDEgMCAxIDAgMSAxIDEgMCAgICAgMAoxIDEgMSAwIDEgMCAwIDAgMCAwICAgICAwCjAgMCAwIDEgMSAxIDAgMCAxIDAgICAgIDAKMSAwIDEgMCAwIDAgMSAxIDEgMCAgICAgMAowIDAgMSAxIDEgMSAwIDEgMSAwICAgICAwCjEgMSAwIDEgMCAwIDAgMCAwIDEgICAgIDEKMCAxIDEgMSAwIDEgMCAxIDEgMSAgICAgMAoxIDEgMCAwIDAgMSAxIDAgMCAxICAgICAxCjEgMSAwIDEgMSAxIDEgMSAxIDEgICAgIDAKMSAwIDEgMCAxIDEgMCAxIDAgMSAgICAgMAoxIDEgMCAxIDEgMCAwIDEgMSAwICAgICAwCjAgMCAxIDAgMSAwIDEgMSAwIDEgICAgIDAKMCAxIDEgMSAxIDAgMCAxIDAgMCAgICAgMAowIDEgMSAwIDAgMSAxIDAgMCAwICAgICAwCjAgMCAwIDEgMCAxIDAgMCAwIDAgICAgIDEKMSAxIDEgMCAwIDAgMCAxIDAgMCAgICAgMAoxIDAgMSAxIDEgMSAwIDAgMSAwICAgICAwCjAgMSAwIDAgMSAwIDEgMSAwIDAgICAgIDEKMSAxIDEgMCAxIDEgMCAwIDAgMCAgICAgMAowIDAgMSAwIDEgMCAxIDEgMCAxICAgICAwCjEgMCAwIDEgMCAxIDEgMSAwIDAgICAgIDEKMSAxIDEgMCAxIDEgMCAwIDEgMCAgICAgMAowIDEgMCAxIDEgMSAxIDEgMCAxICAgICAxCjAgMSAxIDAgMCAxIDAgMCAxIDAgICAgIDAKMCAwIDAgMSAxIDEgMCAxIDEgMSAgICAgMAoxIDAgMSAwIDEgMCAxIDEgMSAwICAgICAwCjAgMSAxIDAgMCAwIDEgMCAwIDAgICAgIDAKMCAwIDEgMCAxIDAgMCAwIDEgMSAgICAgMAoxIDAgMSAwIDAgMSAxIDAgMCAwICAgICAwCjAgMCAwIDEgMCAwIDEgMCAwIDEgICAgIDEKMCAwIDEgMSAxIDEgMSAxIDEgMCAgICAgMAowIDAgMSAwIDEgMSAxIDAgMSAxICAgICAwCjAgMSAxIDAgMSAwIDAgMCAwIDAgICAgIDAKMCAwIDEgMSAwIDAgMCAxIDEgMSAgICAgMAowIDEgMCAxIDEgMSAwIDAgMSAwICAgICAwCjEgMSAxIDEgMCAwIDEgMCAxIDEgICAgIDAKMSAxIDEgMCAwIDEgMCAxIDEgMSAgICAgMAowIDEgMCAwIDAgMCAxIDAgMCAwICAgICAxCjAgMCAwIDAgMSAwIDAgMCAwIDEgICAgIDEKMSAxIDAgMCAxIDEgMCAxIDAgMSAgICAgMQowIDAgMCAxIDEgMCAxIDAgMCAxICAgICAxCjEgMSAxIDEgMSAwIDEgMSAwIDEgICAgIDAKMSAxIDEgMSAwIDAgMCAwIDAgMCAgICAgMAoxIDAgMSAxIDEgMCAxIDAgMCAxICAgICAwCjAgMSAwIDEgMCAxIDAgMSAxIDAgICAgIDAKMSAwIDAgMCAxIDAgMCAwIDAgMCAgICAgMQowIDEgMSAxIDAgMCAxIDEgMSAwICAgICAwCjAgMSAxIDEgMCAwIDAgMCAxIDEgICAgIDAKMSAwIDEgMSAwIDEgMSAxIDEgMSAgICAgMAoxIDEgMCAwIDEgMCAxIDAgMSAwICAgICAwCjAgMSAxIDAgMCAxIDAgMSAwIDEgICAgIDAKMCAxIDAgMCAwIDAgMSAxIDEgMCAgICAgMAowIDEgMSAwIDEgMCAwIDAgMSAxICAgICAwCjAgMSAwIDEgMSAxIDEgMSAwIDEgICAgIDEKMSAwIDAgMSAwIDAgMSAxIDEgMSAgICAgMAoxIDEgMCAxIDEgMSAxIDEgMCAwICAgICAxCjAgMCAwIDAgMCAxIDEgMSAxIDEgICAgIDAKMCAwIDAgMCAxIDAgMCAwIDAgMSAgICAgMQoxIDEgMCAxIDAgMSAxIDAgMCAxICAgICAxCjAgMCAxIDAgMCAxIDAgMCAwIDEgICAgIDAKMSAwIDEgMSAwIDAgMCAwIDAgMCAgICAgMAoxIDAgMSAxIDEgMCAwIDAgMCAwICAgICAwCjEgMCAwIDEgMSAxIDAgMSAxIDEgICAgIDAKMCAwIDEgMSAwIDAgMSAwIDAgMSAgICAgMAowIDAgMSAxIDEgMSAxIDAgMSAxICAgICAwCjAgMSAwIDEgMCAxIDAgMCAwIDEgICAgIDEKMSAwIDEgMSAxIDEgMSAwIDEgMSAgICAgMAoxIDEgMSAxIDEgMSAwIDAgMSAxICAgICAwCjAgMSAwIDAgMCAwIDEgMCAxIDEgICAgIDAKMSAwIDEgMSAxIDAgMCAwIDAgMCAgICAgMAowIDEgMSAxIDAgMCAwIDAgMSAxICAgICAwCjAgMSAxIDAgMSAxIDEgMCAwIDAgICAgIDAKMSAxIDAgMCAwIDAgMCAxIDAgMCAgICAgMQoxIDAgMSAwIDAgMCAxIDAgMCAwICAgICAwCjAgMCAxIDEgMSAwIDAgMCAwIDAgICAgIDAKMCAxIDAgMCAxIDAgMCAxIDEgMSAgICAgMA==
1 0 0 0 0 0 1 0 0 1 1
0 1 0 1 0 1 1 1 0 1 1
0 1 0 0 0 1 1 0 1 0 0
1 0 0 1 1 0 1 0 0 1 1
1 0 0 1 1 0 1 1 1 1 0
0 0 0 0 0 0 1 1 0 0 1
1 1 1 1 0 0 1 1 0 1 0
0 1 1 1 0 1 1 1 0 1 0
0 0 1 1 0 1 1 1 0 0 0
1 1 1 0 0 0 0 1 1 0 0
0 0 1 1 1 0 0 0 1 0 0
1 0 0 0 1 0 1 0 1 1 0
0 1 0 0 1 0 0 0 1 1 0
0 1 1 0 1 0 0 1 1 1 0
0 0 1 0 1 0 1 0 1 0 0
0 1 1 0 1 1 1 1 1 0 0
1 1 0 0 1 1 1 1 0 0 1
1 0 0 0 1 1 1 0 0 0 1
0 0 1 0 0 1 1 1 0 0 0
0 1 1 0 0 1 1 1 0 1 0
1 1 0 1 0 1 1 1 1 1 0
1 1 1 0 1 1 1 0 1 0 0
0 1 1 0 1 1 1 0 0 1 0
1 1 1 1 1 1 0 0 0 1 0
1 1 1 0 1 0 1 1 1 0 0
1 1 1 0 1 0 0 0 0 0 0
0 0 0 1 1 1 0 0 1 0 0
1 0 1 0 0 0 1 1 1 0 0
0 0 1 1 1 1 0 1 1 0 0
1 1 0 1 0 0 0 0 0 1 1
0 1 1 1 0 1 0 1 1 1 0
1 1 0 0 0 1 1 0 0 1 1
1 1 0 1 1 1 1 1 1 1 0
1 0 1 0 1 1 0 1 0 1 0
1 1 0 1 1 0 0 1 1 0 0
0 0 1 0 1 0 1 1 0 1 0
0 1 1 1 1 0 0 1 0 0 0
0 1 1 0 0 1 1 0 0 0 0
0 0 0 1 0 1 0 0 0 0 1
1 1 1 0 0 0 0 1 0 0 0
1 0 1 1 1 1 0 0 1 0 0
0 1 0 0 1 0 1 1 0 0 1
1 1 1 0 1 1 0 0 0 0 0
0 0 1 0 1 0 1 1 0 1 0
1 0 0 1 0 1 1 1 0 0 1
1 1 1 0 1 1 0 0 1 0 0
0 1 0 1 1 1 1 1 0 1 1
0 1 1 0 0 1 0 0 1 0 0
0 0 0 1 1 1 0 1 1 1 0
1 0 1 0 1 0 1 1 1 0 0
0 1 1 0 0 0 1 0 0 0 0
0 0 1 0 1 0 0 0 1 1 0
1 0 1 0 0 1 1 0 0 0 0
0 0 0 1 0 0 1 0 0 1 1
0 0 1 1 1 1 1 1 1 0 0
0 0 1 0 1 1 1 0 1 1 0
0 1 1 0 1 0 0 0 0 0 0
0 0 1 1 0 0 0 1 1 1 0
0 1 0 1 1 1 0 0 1 0 0
1 1 1 1 0 0 1 0 1 1 0
1 1 1 0 0 1 0 1 1 1 0
0 1 0 0 0 0 1 0 0 0 1
0 0 0 0 1 0 0 0 0 1 1
1 1 0 0 1 1 0 1 0 1 1
0 0 0 1 1 0 1 0 0 1 1
1 1 1 1 1 0 1 1 0 1 0
1 1 1 1 0 0 0 0 0 0 0
1 0 1 1 1 0 1 0 0 1 0
0 1 0 1 0 1 0 1 1 0 0
1 0 0 0 1 0 0 0 0 0 1
0 1 1 1 0 0 1 1 1 0 0
0 1 1 1 0 0 0 0 1 1 0
1 0 1 1 0 1 1 1 1 1 0
1 1 0 0 1 0 1 0 1 0 0
0 1 1 0 0 1 0 1 0 1 0
0 1 0 0 0 0 1 1 1 0 0
0 1 1 0 1 0 0 0 1 1 0
0 1 0 1 1 1 1 1 0 1 1
1 0 0 1 0 0 1 1 1 1 0
1 1 0 1 1 1 1 1 0 0 1
0 0 0 0 0 1 1 1 1 1 0
0 0 0 0 1 0 0 0 0 1 1
1 1 0 1 0 1 1 0 0 1 1
0 0 1 0 0 1 0 0 0 1 0
1 0 1 1 0 0 0 0 0 0 0
1 0 1 1 1 0 0 0 0 0 0
1 0 0 1 1 1 0 1 1 1 0
0 0 1 1 0 0 1 0 0 1 0
0 0 1 1 1 1 1 0 1 1 0
0 1 0 1 0 1 0 0 0 1 1
1 0 1 1 1 1 1 0 1 1 0
1 1 1 1 1 1 0 0 1 1 0
0 1 0 0 0 0 1 0 1 1 0
1 0 1 1 1 0 0 0 0 0 0
0 1 1 1 0 0 0 0 1 1 0
0 1 1 0 1 1 1 0 0 0 0
1 1 0 0 0 0 0 1 0 0 1
1 0 1 0 0 0 1 0 0 0 0
0 0 1 1 1 0 0 0 0 0 0
0 1 0 0 1 0 0 1 1 1 0
パターンC・Dの候補
パターン C
解候補 = [1, 1, 0, 2, 2, 2, 2, 2, 0, 2]
スコア = 83
パターン D
解候補 = [2, 2, 0, 2, 2, 2, 2, 0, 2, 2]
スコア = 83
探索全体の最良解
[2, 2, 0, 2, 2, 2, 0, 2, 0, 2] :score= 84