import sys
import random
# 定数設定
SETSIZE = 100
CNO = 10
GENMAX = 10000
SEED = 7
# 1. stdin(標準入力)からldata.txtの内容を読み込む
def readdata_from_stdin():
data = []
teacher = []
lines = sys.stdin.read().strip().splitlines()
for line in lines:
line = line.strip()
if not line:
continue
vals = [int(c) for c in line.split()]
data.append(vals[:CNO])
teacher.append(vals[CNO])
return data, teacher
# 2. スコア計算関数
def calcscore(data, teacher, answer):
score = 0
for i in range(len(data)):
point = 0
for j in range(CNO):
if answer[j] == 2: # ワイルドカード
point += 1
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
# データ読み込み
data, teacher = readdata_from_stdin()
# 探索(最良解の獲得)
random.seed(SEED)
bestscore = 0
bestanswer = [0] * CNO
for i in range(GENMAX):
answer = [random.randint(0, 2) for _ in range(CNO)]
score = calcscore(data, teacher, answer)
if score > bestscore:
bestscore = score
bestanswer = answer.copy()
# パターンA, B, C, Dの定義
patterns = {
'パターンA': [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
'パターンB': bestanswer,
'パターンC': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
'パターンD': [1, 2, 2, 2, 2, 2, 2, 2, 2, 2]
}
# --- 実行結果(スコア表示) ---
print("=== 実行結果 (各パターンのスコア) ===")
for p_name, p_ans in patterns.items():
s = calcscore(data, teacher, p_ans)
print(f"{p_name} {p_ans}: score = {s}")
# --- 表2.2 の出力(テキスト形式) ---
print("\n=== 表2.2 予測結果の比較 (先頭10事例) ===")
header = f"{'事例No':<6} | {'入力属性データ':<30} | {'正解':<4} | {'パタA':<5} | {'パタB':<5} | {'パタC':<5} | {'パタD':<5}"
print(header)
print("-" * len(header))
for i in range(min(10, len(data))):
row_str = f"{i+1:<7} | {str(data[i]):<30} | {teacher[i]:<6} | "
preds = []
for p_name, p_ans in patterns.items():
point = sum(1 for j in range(CNO) if p_ans[j] == 2 or p_ans[j] == data[i][j])
pred = 1 if point == CNO else 0
preds.append(str(pred))
row_str += " | ".join(f"{p:<5}" for p in preds)
print(row_str)
aW1wb3J0IHN5cwppbXBvcnQgcmFuZG9tCgojIOWumuaVsOioreWumgpTRVRTSVpFID0gMTAwCkNOTyA9IDEwCkdFTk1BWCA9IDEwMDAwClNFRUQgPSA3CgojIDEuIHN0ZGlu77yI5qiZ5rqW5YWl5Yqb77yJ44GL44KJbGRhdGEudHh044Gu5YaF5a6544KS6Kqt44G/6L6844KACmRlZiByZWFkZGF0YV9mcm9tX3N0ZGluKCk6CiAgICBkYXRhID0gW10KICAgIHRlYWNoZXIgPSBbXQogICAgbGluZXMgPSBzeXMuc3RkaW4ucmVhZCgpLnN0cmlwKCkuc3BsaXRsaW5lcygpCiAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgaWYgbm90IGxpbmU6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgdmFscyA9IFtpbnQoYykgZm9yIGMgaW4gbGluZS5zcGxpdCgpXQogICAgICAgIGRhdGEuYXBwZW5kKHZhbHNbOkNOT10pCiAgICAgICAgdGVhY2hlci5hcHBlbmQodmFsc1tDTk9dKQogICAgcmV0dXJuIGRhdGEsIHRlYWNoZXIKCiMgMi4g44K544Kz44Ki6KiI566X6Zai5pWwCmRlZiBjYWxjc2NvcmUoZGF0YSwgdGVhY2hlciwgYW5zd2VyKToKICAgIHNjb3JlID0gMAogICAgZm9yIGkgaW4gcmFuZ2UobGVuKGRhdGEpKToKICAgICAgICBwb2ludCA9IDAKICAgICAgICBmb3IgaiBpbiByYW5nZShDTk8pOgogICAgICAgICAgICBpZiBhbnN3ZXJbal0gPT0gMjogICMg44Ov44Kk44Or44OJ44Kr44O844OJCiAgICAgICAgICAgICAgICBwb2ludCArPSAxCiAgICAgICAgICAgIGVsaWYgYW5zd2VyW2pdID09IGRhdGFbaV1bal06CiAgICAgICAgICAgICAgICBwb2ludCArPSAxCiAgICAgICAgCiAgICAgICAgaWYgcG9pbnQgPT0gQ05PIGFuZCB0ZWFjaGVyW2ldID09IDE6CiAgICAgICAgICAgIHNjb3JlICs9IDEKICAgICAgICBlbGlmIHBvaW50ICE9IENOTyBhbmQgdGVhY2hlcltpXSA9PSAwOgogICAgICAgICAgICBzY29yZSArPSAxCiAgICByZXR1cm4gc2NvcmUKCiMg44OH44O844K/6Kqt44G/6L6844G/CmRhdGEsIHRlYWNoZXIgPSByZWFkZGF0YV9mcm9tX3N0ZGluKCkKCiMg5o6i57Si77yI5pyA6Imv6Kej44Gu542y5b6X77yJCnJhbmRvbS5zZWVkKFNFRUQpCmJlc3RzY29yZSA9IDAKYmVzdGFuc3dlciA9IFswXSAqIENOTwoKZm9yIGkgaW4gcmFuZ2UoR0VOTUFYKToKICAgIGFuc3dlciA9IFtyYW5kb20ucmFuZGludCgwLCAyKSBmb3IgXyBpbiByYW5nZShDTk8pXQogICAgc2NvcmUgPSBjYWxjc2NvcmUoZGF0YSwgdGVhY2hlciwgYW5zd2VyKQogICAgaWYgc2NvcmUgPiBiZXN0c2NvcmU6CiAgICAgICAgYmVzdHNjb3JlID0gc2NvcmUKICAgICAgICBiZXN0YW5zd2VyID0gYW5zd2VyLmNvcHkoKQoKIyDjg5Hjgr/jg7zjg7NBLCBCLCBDLCBE44Gu5a6a576pCnBhdHRlcm5zID0gewogICAgJ+ODkeOCv+ODvOODs0EnOiBbMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMl0sCiAgICAn44OR44K/44O844OzQic6IGJlc3RhbnN3ZXIsCiAgICAn44OR44K/44O844OzQyc6IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSwKICAgICfjg5Hjgr/jg7zjg7NEJzogWzEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDJdCn0KCiMgLS0tIOWun+ihjOe1kOaenO+8iOOCueOCs+OCouihqOekuu+8iSAtLS0KcHJpbnQoIj09PSDlrp/ooYzntZDmnpwgKOWQhOODkeOCv+ODvOODs+OBruOCueOCs+OCoikgPT09IikKZm9yIHBfbmFtZSwgcF9hbnMgaW4gcGF0dGVybnMuaXRlbXMoKToKICAgIHMgPSBjYWxjc2NvcmUoZGF0YSwgdGVhY2hlciwgcF9hbnMpCiAgICBwcmludChmIntwX25hbWV9IHtwX2Fuc306IHNjb3JlID0ge3N9IikKCiMgLS0tIOihqDIuMiDjga7lh7rlipvvvIjjg4bjgq3jgrnjg4jlvaLlvI/vvIkgLS0tCnByaW50KCJcbj09PSDooagyLjIg5LqI5ris57WQ5p6c44Gu5q+U6LyDICjlhYjpoK0xMOS6i+S+iykgPT09IikKaGVhZGVyID0gZiJ7J+S6i+S+i05vJzo8Nn0gfCB7J+WFpeWKm+WxnuaAp+ODh+ODvOOCvyc6PDMwfSB8IHsn5q2j6KejJzo8NH0gfCB7J+ODkeOCv0EnOjw1fSB8IHsn44OR44K/Qic6PDV9IHwgeyfjg5Hjgr9DJzo8NX0gfCB7J+ODkeOCv0QnOjw1fSIKcHJpbnQoaGVhZGVyKQpwcmludCgiLSIgKiBsZW4oaGVhZGVyKSkKCmZvciBpIGluIHJhbmdlKG1pbigxMCwgbGVuKGRhdGEpKSk6CiAgICByb3dfc3RyID0gZiJ7aSsxOjw3fSB8IHtzdHIoZGF0YVtpXSk6PDMwfSB8IHt0ZWFjaGVyW2ldOjw2fSB8ICIKICAgIHByZWRzID0gW10KICAgIGZvciBwX25hbWUsIHBfYW5zIGluIHBhdHRlcm5zLml0ZW1zKCk6CiAgICAgICAgcG9pbnQgPSBzdW0oMSBmb3IgaiBpbiByYW5nZShDTk8pIGlmIHBfYW5zW2pdID09IDIgb3IgcF9hbnNbal0gPT0gZGF0YVtpXVtqXSkKICAgICAgICBwcmVkID0gMSBpZiBwb2ludCA9PSBDTk8gZWxzZSAwCiAgICAgICAgcHJlZHMuYXBwZW5kKHN0cihwcmVkKSkKICAgIHJvd19zdHIgKz0gIiB8ICIuam9pbihmIntwOjw1fSIgZm9yIHAgaW4gcHJlZHMpCiAgICBwcmludChyb3dfc3RyKQ==
=== 実行結果 (各パターンのスコア) ===
パターンA [2, 2, 2, 2, 2, 2, 2, 2, 2, 2]: score = 0
パターンB [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]: score = 0
パターンC [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]: score = 0
パターンD [1, 2, 2, 2, 2, 2, 2, 2, 2, 2]: score = 0
=== 表2.2 予測結果の比較 (先頭10事例) ===
事例No | 入力属性データ | 正解 | パタA | パタB | パタC | パタD
------------------------------------------------------------------------------