
"""
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