FA-82936 / Go territory scoring / Open access
The candidate position is appended to history before it is checked · case 01
Every move is reported as repeating itself.
ROOT CAUSE
The history is extended with the candidate before the repetition scan.
VERIFIED REPAIR
Check the candidate against prior history only, and record it afterwards.
Unsuccessful approach: Recording the candidate with the opposite mover only hides the self-match in situational mode.
Case contract
Input [history, candidate_board, player_to_move_after, mode]; history is a list of [board, player_to_move]. Positional mode forbids any earlier board equal to the candidate; situational mode additionally requires the same player to move. Return the earliest matching history index or "legal".
Why this case matters
Go servers and scoring tools compute this value automatically; a wrong answer changes a game result.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
history, cand, mover, mode = x
history = history + [[cand, mover]]
key = tuple(cand)
for idx, (past, to_move) in enumerate(history):
if tuple(past) != key:
continue
if mode == 'situational' and to_move != mover:
continue
return idx
return 'legal'
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[[['B.', 'W.'], 'W'], [['.W', 'W.'], 'W']], ['.B', '.B'], 'W', 'situational'], 'legal'], [[[[['B.', '..'], 'W'], [['.B', 'WB'], 'W'], [['WW', 'BW'], 'W']], ['.B', 'WB'], 'B', 'situational'], 'legal'], [[[[['.W', 'W.'], 'W'], [['BW', 'W.'], 'B'], [['.B', '..'], 'B'], [['.B', '.B'], 'B'], [['B.', 'WB'], 'W'], [['.B', '..'], 'W']], ['.B', '..'], 'W', 'situational'], 5], [[[[['W.', '.B'], 'B'], [['WB', 'WB'], 'W'], [['WB', 'WB'], 'W'], [['.B', 'BB'], 'B']], ['WB', 'WB'], 'W', 'situational'], 1], [[[[['BW', 'W.'], 'B'], [['W.', 'BB'], 'B']], ['BW', 'W.'], 'B', 'positional'], 0], [[[[['..', 'W.'], 'B'], [['.W', '..'], 'B'], [['B.', 'BW'], 'W']], ['..', 'W.'], 'B', 'positional'], 0], [[[[['...', '...', '.B.'], 'B'], [['.B.', '.BW', 'B.W'], 'B'], [['BW.', 'W.W', '.W.'], 'B']], ['B.W', '..B', 'W.W'], 'W', 'positional'], 'legal'], [[[[['BW.', '.W.', 'B.B'], 'B'], [['B..', 'B.B', '.BW'], 'W'], [['.WB', '...', '...'], 'W'], [['...', 'WWW', 'W.B'], 'W'], [['.WB', '..B', 'BW.'], 'B'], [['.B.', '.BB', '..B'], 'B']], ['..W', 'WBW', 'WB.'], 'W', 'positional'], 'legal']], [[[[[['.WW', '.B.', '..B'], 'B'], [['...', 'WWB', '..W'], 'B'], [['.WW', '.BW', '...'], 'B'], [['.WB', 'B.W', '...'], 'W'], [['WBW', '..B', 'WB.'], 'B']], ['WBW', '..B', 'WB.'], 'W', 'situational'], 'legal'], [[[[['.BW', '.BB', '..B'], 'B']], ['.BW', '.BB', '..B'], 'W', 'situational'], 'legal'], [[[[['B.', 'W.'], 'W'], [['..', '.B'], 'B'], [['W.', 'BW'], 'B'], [['BB', 'B.'], 'B']], ['..', '.B'], 'B', 'positional'], 1], [[[[['WB.', 'WB.', '.BB'], 'B'], [['BW.', 'B..', '.WB'], 'B'], [['..B', '..W', '...'], 'W'], [['..B', '..B', 'W..'], 'W']], ['BW.', 'B..', '.WB'], 'W', 'situational'], 'legal'], [[[[['...', 'BW.', 'BBW'], 'B'], [['.W.', '..B', 'BBW'], 'B'], [['W.B', '.W.', '...'], 'B'], [['.WB', '.BW', '..W'], 'W'], [['...', 'W.B', 'W.B'], 'B']], ['.WW', '.W.', 'BW.'], 'B', 'positional'], 'legal'], [[[[['WW', 'W.'], 'W'], [['.W', '.W'], 'W'], [['..', 'B.'], 'B'], [['.W', '.W'], 'B'], [['W.', '..'], 'W'], [['..', 'WB'], 'W']], ['.W', '.W'], 'W', 'situational'], 1], [[[[['B.B', '.W.', 'WWB'], 'B'], [['..B', 'WB.', '.B.'], 'W'], [['.B.', 'W..', '.W.'], 'B'], [['.WW', '..B', 'BWW'], 'B'], [['.B.', '.B.', 'W.W'], 'B'], [['..B', 'WB.', '.B.'], 'W'], [['B.B', '.B.', '.BB'], 'B']], ['..B', 'WB.', '.B.'], 'W', 'situational'], 1], [[[[['WWW', '..B', 'B..'], 'B'], [['..W', 'W.B', '.B.'], 'B'], [['..B', '...', '.B.'], 'W']], ['..W', '..W', 'B.W'], 'W', 'positional'], 'legal']], [[[[[['..B', 'BBB', '..B'], 'B'], [['.W.', 'WB.', 'BWB'], 'B'], [['WWB', 'BWW', '.BW'], 'B']], ['BB.', 'B.B', '.BB'], 'W', 'positional'], 'legal'], [[[[['...', '...', '.B.'], 'B'], [['.B.', '.BW', 'B.W'], 'B'], [['BW.', 'W.W', '.W.'], 'B']], ['B.W', '..B', 'W.W'], 'W', 'positional'], 'legal'], [[[[['.BW', '...', '.W.'], 'B'], [['W..', '.B.', 'BBB'], 'B'], [['WWW', 'WBB', '.WW'], 'B'], [['BW.', '.W.', '.B.'], 'W'], [['BBW', 'WW.', '...'], 'B'], [['WWW', 'WBB', '.WW'], 'B'], [['B..', '...', 'B.B'], 'B']], ['WWW', 'WBB', '.WW'], 'B', 'positional'], 2], [[[[['..W', '.BW', 'W.W'], 'W'], [['W..', '.W.', '.W.'], 'W'], [['WWW', 'W.W', '...'], 'B'], [['WBB', 'WWB', 'B..'], 'W'], [['BB.', '.WB', '..B'], 'W'], [['W.W', 'B.B', '.B.'], 'B']], ['BBW', 'B..', 'B.W'], 'W', 'situational'], 'legal'], [[[[['B.B', 'WB.', '...'], 'W'], [['.W.', 'BWW', 'W..'], 'B']], ['B.B', 'WB.', '...'], 'B', 'situational'], 'legal'], [[[[['..', 'B.'], 'W'], [['.B', 'WB'], 'B'], [['..', '.W'], 'B'], [['..', '.W'], 'W'], [['.B', 'B.'], 'B']], ['..', '.W'], 'W', 'situational'], 3], [[[[['B..', '..B', 'W.B'], 'W']], ['B..', '..B', 'W.B'], 'W', 'positional'], 0], [[[[['W.B', 'B..', '.BB'], 'W'], [['.BB', 'WB.', 'BB.'], 'W']], ['.BB', 'WB.', 'BB.'], 'B', 'situational'], 'legal']], [[[[[['...', 'BW.', 'BBW'], 'B'], [['.W.', '..B', 'BBW'], 'B'], [['W.B', '.W.', '...'], 'B'], [['.WB', '.BW', '..W'], 'W'], [['...', 'W.B', 'W.B'], 'B']], ['.WW', '.W.', 'BW.'], 'B', 'positional'], 'legal'], [[[[['W.', '..'], 'B'], [['..', 'B.'], 'W'], [['.B', '.B'], 'B'], [['B.', 'BW'], 'W'], [['BB', '..'], 'W']], ['..', 'WW'], 'B', 'situational'], 'legal'], [[[[['WWW', '..B', 'B..'], 'B'], [['..W', 'W.B', '.B.'], 'B'], [['..B', '...', '.B.'], 'W']], ['..W', '..W', 'B.W'], 'W', 'positional'], 'legal'], [[[[['.B', 'B.'], 'B'], [['.B', 'B.'], 'B'], [['BW', '..'], 'B'], [['.B', 'B.'], 'B'], [['.B', 'BB'], 'B']], ['.B', 'B.'], 'B', 'situational'], 0], [[[[['W.', '.W'], 'B'], [['B.', '..'], 'B'], [['WB', '..'], 'B'], [['BW', '.W'], 'W']], ['BW', '.W'], 'B', 'positional'], 3], [[[[['B.W', 'W.W', 'B.W'], 'W'], [['BWB', '.BW', 'B..'], 'W'], [['..W', 'B..', 'B..'], 'B'], [['WWW', 'B.B', 'WW.'], 'W'], [['.BB', '.WB', '..B'], 'B']], ['BBB', '.W.', 'W.W'], 'B', 'positional'], 'legal'], [[[[['...', '.W.', 'BWW'], 'B'], [['BWB', 'W.W', 'WBW'], 'B'], [['...', '...', '...'], 'B'], [['..W', '.WB', 'B..'], 'B'], [['WBW', 'WWB', 'WB.'], 'W']], ['...', '.W.', 'BWW'], 'W', 'positional'], 0], [[[[['.W.', 'W..', 'B.W'], 'W'], [['WW.', '.W.', '...'], 'B'], [['.BB', '..W', 'WBW'], 'B'], [['.W.', 'BW.', 'BB.'], 'W']], ['WWW', '..W', 'WW.'], 'B', 'positional'], 'legal']], [[[[[['...', 'BW.', 'BBW'], 'B'], [['.W.', '..B', 'BBW'], 'B'], [['W.B', '.W.', '...'], 'B'], [['.WB', '.BW', '..W'], 'W'], [['...', 'W.B', 'W.B'], 'B']], ['.WW', '.W.', 'BW.'], 'B', 'positional'], 'legal'], [[[[['W.B', 'B..', '.BB'], 'W'], [['.BB', 'WB.', 'BB.'], 'W']], ['.BB', 'WB.', 'BB.'], 'B', 'situational'], 'legal'], [[[[['.B', 'B.'], 'W'], [['B.', 'W.'], 'W']], ['.B', 'B.'], 'B', 'situational'], 'legal'], [[[[['.W.', 'W..', 'B.W'], 'W'], [['WW.', '.W.', '...'], 'B'], [['.BB', '..W', 'WBW'], 'B'], [['.W.', 'BW.', 'BB.'], 'W']], ['WWW', '..W', 'WW.'], 'B', 'positional'], 'legal'], [[[[['..W', 'BBW', '.W.'], 'B'], [['..B', 'WBW', 'BW.'], 'W'], [['.B.', '..B', 'B..'], 'W']], ['..W', 'BBW', '.W.'], 'B', 'situational'], 0], [[[[['BW.', 'W.B', '...'], 'B'], [['W.B', '.B.', 'WWB'], 'W'], [['W..', '.BB', '..W'], 'W'], [['.W.', 'BWW', '...'], 'B'], [['...', '.B.', 'B..'], 'W']], ['BW.', 'W.B', '...'], 'B', 'situational'], 0], [[[[['BB.', 'BB.', 'WBB'], 'B'], [['..B', 'BW.', 'BBB'], 'W']], ['..B', 'BW.', 'BBB'], 'B', 'situational'], 'legal'], [[[[['.W', '.B'], 'B'], [['.B', '..'], 'W'], [['.B', '..'], 'W'], [['BB', '.B'], 'B']], ['.B', '..'], 'W', 'positional'], 1]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("superko case %d" % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| superko case 0 | 2 | legal | Failed |
| superko case 1 | 3 | legal | Failed |
| superko case 2 | 5 | 5 | Passed |
| superko case 3 | 1 | 1 | Passed |
| superko case 4 | 0 | 0 | Passed |
| superko case 5 | 0 | 0 | Passed |
| superko case 6 | 3 | legal | Failed |
| superko case 7 | 6 | legal | Failed |
SHA-256 / c0871487a3e46fc116a007dc38d4c17c36ecf81ed918bf6e76927fae8c945daa
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
history, cand, mover, mode = x
history = history + [[cand, 'W' if mover == 'B' else 'B']]
key = tuple(cand)
for idx, (past, to_move) in enumerate(history):
if tuple(past) != key:
continue
if mode == 'situational' and to_move != mover:
continue
return idx
return 'legal'
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[[['B.', 'W.'], 'W'], [['.W', 'W.'], 'W']], ['.B', '.B'], 'W', 'situational'], 'legal'], [[[[['B.', '..'], 'W'], [['.B', 'WB'], 'W'], [['WW', 'BW'], 'W']], ['.B', 'WB'], 'B', 'situational'], 'legal'], [[[[['.W', 'W.'], 'W'], [['BW', 'W.'], 'B'], [['.B', '..'], 'B'], [['.B', '.B'], 'B'], [['B.', 'WB'], 'W'], [['.B', '..'], 'W']], ['.B', '..'], 'W', 'situational'], 5], [[[[['W.', '.B'], 'B'], [['WB', 'WB'], 'W'], [['WB', 'WB'], 'W'], [['.B', 'BB'], 'B']], ['WB', 'WB'], 'W', 'situational'], 1], [[[[['BW', 'W.'], 'B'], [['W.', 'BB'], 'B']], ['BW', 'W.'], 'B', 'positional'], 0], [[[[['..', 'W.'], 'B'], [['.W', '..'], 'B'], [['B.', 'BW'], 'W']], ['..', 'W.'], 'B', 'positional'], 0], [[[[['...', '...', '.B.'], 'B'], [['.B.', '.BW', 'B.W'], 'B'], [['BW.', 'W.W', '.W.'], 'B']], ['B.W', '..B', 'W.W'], 'W', 'positional'], 'legal'], [[[[['BW.', '.W.', 'B.B'], 'B'], [['B..', 'B.B', '.BW'], 'W'], [['.WB', '...', '...'], 'W'], [['...', 'WWW', 'W.B'], 'W'], [['.WB', '..B', 'BW.'], 'B'], [['.B.', '.BB', '..B'], 'B']], ['..W', 'WBW', 'WB.'], 'W', 'positional'], 'legal']], [[[[[['.WW', '.B.', '..B'], 'B'], [['...', 'WWB', '..W'], 'B'], [['.WW', '.BW', '...'], 'B'], [['.WB', 'B.W', '...'], 'W'], [['WBW', '..B', 'WB.'], 'B']], ['WBW', '..B', 'WB.'], 'W', 'situational'], 'legal'], [[[[['.BW', '.BB', '..B'], 'B']], ['.BW', '.BB', '..B'], 'W', 'situational'], 'legal'], [[[[['B.', 'W.'], 'W'], [['..', '.B'], 'B'], [['W.', 'BW'], 'B'], [['BB', 'B.'], 'B']], ['..', '.B'], 'B', 'positional'], 1], [[[[['WB.', 'WB.', '.BB'], 'B'], [['BW.', 'B..', '.WB'], 'B'], [['..B', '..W', '...'], 'W'], [['..B', '..B', 'W..'], 'W']], ['BW.', 'B..', '.WB'], 'W', 'situational'], 'legal'], [[[[['...', 'BW.', 'BBW'], 'B'], [['.W.', '..B', 'BBW'], 'B'], [['W.B', '.W.', '...'], 'B'], [['.WB', '.BW', '..W'], 'W'], [['...', 'W.B', 'W.B'], 'B']], ['.WW', '.W.', 'BW.'], 'B', 'positional'], 'legal'], [[[[['WW', 'W.'], 'W'], [['.W', '.W'], 'W'], [['..', 'B.'], 'B'], [['.W', '.W'], 'B'], [['W.', '..'], 'W'], [['..', 'WB'], 'W']], ['.W', '.W'], 'W', 'situational'], 1], [[[[['B.B', '.W.', 'WWB'], 'B'], [['..B', 'WB.', '.B.'], 'W'], [['.B.', 'W..', '.W.'], 'B'], [['.WW', '..B', 'BWW'], 'B'], [['.B.', '.B.', 'W.W'], 'B'], [['..B', 'WB.', '.B.'], 'W'], [['B.B', '.B.', '.BB'], 'B']], ['..B', 'WB.', '.B.'], 'W', 'situational'], 1], [[[[['WWW', '..B', 'B..'], 'B'], [['..W', 'W.B', '.B.'], 'B'], [['..B', '...', '.B.'], 'W']], ['..W', '..W', 'B.W'], 'W', 'positional'], 'legal']], [[[[[['..B', 'BBB', '..B'], 'B'], [['.W.', 'WB.', 'BWB'], 'B'], [['WWB', 'BWW', '.BW'], 'B']], ['BB.', 'B.B', '.BB'], 'W', 'positional'], 'legal'], [[[[['...', '...', '.B.'], 'B'], [['.B.', '.BW', 'B.W'], 'B'], [['BW.', 'W.W', '.W.'], 'B']], ['B.W', '..B', 'W.W'], 'W', 'positional'], 'legal'], [[[[['.BW', '...', '.W.'], 'B'], [['W..', '.B.', 'BBB'], 'B'], [['WWW', 'WBB', '.WW'], 'B'], [['BW.', '.W.', '.B.'], 'W'], [['BBW', 'WW.', '...'], 'B'], [['WWW', 'WBB', '.WW'], 'B'], [['B..', '...', 'B.B'], 'B']], ['WWW', 'WBB', '.WW'], 'B', 'positional'], 2], [[[[['..W', '.BW', 'W.W'], 'W'], [['W..', '.W.', '.W.'], 'W'], [['WWW', 'W.W', '...'], 'B'], [['WBB', 'WWB', 'B..'], 'W'], [['BB.', '.WB', '..B'], 'W'], [['W.W', 'B.B', '.B.'], 'B']], ['BBW', 'B..', 'B.W'], 'W', 'situational'], 'legal'], [[[[['B.B', 'WB.', '...'], 'W'], [['.W.', 'BWW', 'W..'], 'B']], ['B.B', 'WB.', '...'], 'B', 'situational'], 'legal'], [[[[['..', 'B.'], 'W'], [['.B', 'WB'], 'B'], [['..', '.W'], 'B'], [['..', '.W'], 'W'], [['.B', 'B.'], 'B']], ['..', '.W'], 'W', 'situational'], 3], [[[[['B..', '..B', 'W.B'], 'W']], ['B..', '..B', 'W.B'], 'W', 'positional'], 0], [[[[['W.B', 'B..', '.BB'], 'W'], [['.BB', 'WB.', 'BB.'], 'W']], ['.BB', 'WB.', 'BB.'], 'B', 'situational'], 'legal']], [[[[[['...', 'BW.', 'BBW'], 'B'], [['.W.', '..B', 'BBW'], 'B'], [['W.B', '.W.', '...'], 'B'], [['.WB', '.BW', '..W'], 'W'], [['...', 'W.B', 'W.B'], 'B']], ['.WW', '.W.', 'BW.'], 'B', 'positional'], 'legal'], [[[[['W.', '..'], 'B'], [['..', 'B.'], 'W'], [['.B', '.B'], 'B'], [['B.', 'BW'], 'W'], [['BB', '..'], 'W']], ['..', 'WW'], 'B', 'situational'], 'legal'], [[[[['WWW', '..B', 'B..'], 'B'], [['..W', 'W.B', '.B.'], 'B'], [['..B', '...', '.B.'], 'W']], ['..W', '..W', 'B.W'], 'W', 'positional'], 'legal'], [[[[['.B', 'B.'], 'B'], [['.B', 'B.'], 'B'], [['BW', '..'], 'B'], [['.B', 'B.'], 'B'], [['.B', 'BB'], 'B']], ['.B', 'B.'], 'B', 'situational'], 0], [[[[['W.', '.W'], 'B'], [['B.', '..'], 'B'], [['WB', '..'], 'B'], [['BW', '.W'], 'W']], ['BW', '.W'], 'B', 'positional'], 3], [[[[['B.W', 'W.W', 'B.W'], 'W'], [['BWB', '.BW', 'B..'], 'W'], [['..W', 'B..', 'B..'], 'B'], [['WWW', 'B.B', 'WW.'], 'W'], [['.BB', '.WB', '..B'], 'B']], ['BBB', '.W.', 'W.W'], 'B', 'positional'], 'legal'], [[[[['...', '.W.', 'BWW'], 'B'], [['BWB', 'W.W', 'WBW'], 'B'], [['...', '...', '...'], 'B'], [['..W', '.WB', 'B..'], 'B'], [['WBW', 'WWB', 'WB.'], 'W']], ['...', '.W.', 'BWW'], 'W', 'positional'], 0], [[[[['.W.', 'W..', 'B.W'], 'W'], [['WW.', '.W.', '...'], 'B'], [['.BB', '..W', 'WBW'], 'B'], [['.W.', 'BW.', 'BB.'], 'W']], ['WWW', '..W', 'WW.'], 'B', 'positional'], 'legal']], [[[[[['...', 'BW.', 'BBW'], 'B'], [['.W.', '..B', 'BBW'], 'B'], [['W.B', '.W.', '...'], 'B'], [['.WB', '.BW', '..W'], 'W'], [['...', 'W.B', 'W.B'], 'B']], ['.WW', '.W.', 'BW.'], 'B', 'positional'], 'legal'], [[[[['W.B', 'B..', '.BB'], 'W'], [['.BB', 'WB.', 'BB.'], 'W']], ['.BB', 'WB.', 'BB.'], 'B', 'situational'], 'legal'], [[[[['.B', 'B.'], 'W'], [['B.', 'W.'], 'W']], ['.B', 'B.'], 'B', 'situational'], 'legal'], [[[[['.W.', 'W..', 'B.W'], 'W'], [['WW.', '.W.', '...'], 'B'], [['.BB', '..W', 'WBW'], 'B'], [['.W.', 'BW.', 'BB.'], 'W']], ['WWW', '..W', 'WW.'], 'B', 'positional'], 'legal'], [[[[['..W', 'BBW', '.W.'], 'B'], [['..B', 'WBW', 'BW.'], 'W'], [['.B.', '..B', 'B..'], 'W']], ['..W', 'BBW', '.W.'], 'B', 'situational'], 0], [[[[['BW.', 'W.B', '...'], 'B'], [['W.B', '.B.', 'WWB'], 'W'], [['W..', '.BB', '..W'], 'W'], [['.W.', 'BWW', '...'], 'B'], [['...', '.B.', 'B..'], 'W']], ['BW.', 'W.B', '...'], 'B', 'situational'], 0], [[[[['BB.', 'BB.', 'WBB'], 'B'], [['..B', 'BW.', 'BBB'], 'W']], ['..B', 'BW.', 'BBB'], 'B', 'situational'], 'legal'], [[[[['.W', '.B'], 'B'], [['.B', '..'], 'W'], [['.B', '..'], 'W'], [['BB', '.B'], 'B']], ['.B', '..'], 'W', 'positional'], 1]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("superko case %d" % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| superko case 0 | legal | legal | Passed |
| superko case 1 | legal | legal | Passed |
| superko case 2 | 5 | 5 | Passed |
| superko case 3 | 1 | 1 | Passed |
| superko case 4 | 0 | 0 | Passed |
| superko case 5 | 0 | 0 | Passed |
| superko case 6 | 3 | legal | Failed |
| superko case 7 | 6 | legal | Failed |
SHA-256 / 0ff4ef0041ac81536a4dbab55f9a499202ec23a556f6da6404b5c48b7f8508e8
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
history, cand, mover, mode = x
key = tuple(cand)
for idx, (past, to_move) in enumerate(history):
if tuple(past) != key:
continue
if mode == 'situational' and to_move != mover:
continue
return idx
return 'legal'
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[[['B.', 'W.'], 'W'], [['.W', 'W.'], 'W']], ['.B', '.B'], 'W', 'situational'], 'legal'], [[[[['B.', '..'], 'W'], [['.B', 'WB'], 'W'], [['WW', 'BW'], 'W']], ['.B', 'WB'], 'B', 'situational'], 'legal'], [[[[['.W', 'W.'], 'W'], [['BW', 'W.'], 'B'], [['.B', '..'], 'B'], [['.B', '.B'], 'B'], [['B.', 'WB'], 'W'], [['.B', '..'], 'W']], ['.B', '..'], 'W', 'situational'], 5], [[[[['W.', '.B'], 'B'], [['WB', 'WB'], 'W'], [['WB', 'WB'], 'W'], [['.B', 'BB'], 'B']], ['WB', 'WB'], 'W', 'situational'], 1], [[[[['BW', 'W.'], 'B'], [['W.', 'BB'], 'B']], ['BW', 'W.'], 'B', 'positional'], 0], [[[[['..', 'W.'], 'B'], [['.W', '..'], 'B'], [['B.', 'BW'], 'W']], ['..', 'W.'], 'B', 'positional'], 0], [[[[['...', '...', '.B.'], 'B'], [['.B.', '.BW', 'B.W'], 'B'], [['BW.', 'W.W', '.W.'], 'B']], ['B.W', '..B', 'W.W'], 'W', 'positional'], 'legal'], [[[[['BW.', '.W.', 'B.B'], 'B'], [['B..', 'B.B', '.BW'], 'W'], [['.WB', '...', '...'], 'W'], [['...', 'WWW', 'W.B'], 'W'], [['.WB', '..B', 'BW.'], 'B'], [['.B.', '.BB', '..B'], 'B']], ['..W', 'WBW', 'WB.'], 'W', 'positional'], 'legal']], [[[[[['.WW', '.B.', '..B'], 'B'], [['...', 'WWB', '..W'], 'B'], [['.WW', '.BW', '...'], 'B'], [['.WB', 'B.W', '...'], 'W'], [['WBW', '..B', 'WB.'], 'B']], ['WBW', '..B', 'WB.'], 'W', 'situational'], 'legal'], [[[[['.BW', '.BB', '..B'], 'B']], ['.BW', '.BB', '..B'], 'W', 'situational'], 'legal'], [[[[['B.', 'W.'], 'W'], [['..', '.B'], 'B'], [['W.', 'BW'], 'B'], [['BB', 'B.'], 'B']], ['..', '.B'], 'B', 'positional'], 1], [[[[['WB.', 'WB.', '.BB'], 'B'], [['BW.', 'B..', '.WB'], 'B'], [['..B', '..W', '...'], 'W'], [['..B', '..B', 'W..'], 'W']], ['BW.', 'B..', '.WB'], 'W', 'situational'], 'legal'], [[[[['...', 'BW.', 'BBW'], 'B'], [['.W.', '..B', 'BBW'], 'B'], [['W.B', '.W.', '...'], 'B'], [['.WB', '.BW', '..W'], 'W'], [['...', 'W.B', 'W.B'], 'B']], ['.WW', '.W.', 'BW.'], 'B', 'positional'], 'legal'], [[[[['WW', 'W.'], 'W'], [['.W', '.W'], 'W'], [['..', 'B.'], 'B'], [['.W', '.W'], 'B'], [['W.', '..'], 'W'], [['..', 'WB'], 'W']], ['.W', '.W'], 'W', 'situational'], 1], [[[[['B.B', '.W.', 'WWB'], 'B'], [['..B', 'WB.', '.B.'], 'W'], [['.B.', 'W..', '.W.'], 'B'], [['.WW', '..B', 'BWW'], 'B'], [['.B.', '.B.', 'W.W'], 'B'], [['..B', 'WB.', '.B.'], 'W'], [['B.B', '.B.', '.BB'], 'B']], ['..B', 'WB.', '.B.'], 'W', 'situational'], 1], [[[[['WWW', '..B', 'B..'], 'B'], [['..W', 'W.B', '.B.'], 'B'], [['..B', '...', '.B.'], 'W']], ['..W', '..W', 'B.W'], 'W', 'positional'], 'legal']], [[[[[['..B', 'BBB', '..B'], 'B'], [['.W.', 'WB.', 'BWB'], 'B'], [['WWB', 'BWW', '.BW'], 'B']], ['BB.', 'B.B', '.BB'], 'W', 'positional'], 'legal'], [[[[['...', '...', '.B.'], 'B'], [['.B.', '.BW', 'B.W'], 'B'], [['BW.', 'W.W', '.W.'], 'B']], ['B.W', '..B', 'W.W'], 'W', 'positional'], 'legal'], [[[[['.BW', '...', '.W.'], 'B'], [['W..', '.B.', 'BBB'], 'B'], [['WWW', 'WBB', '.WW'], 'B'], [['BW.', '.W.', '.B.'], 'W'], [['BBW', 'WW.', '...'], 'B'], [['WWW', 'WBB', '.WW'], 'B'], [['B..', '...', 'B.B'], 'B']], ['WWW', 'WBB', '.WW'], 'B', 'positional'], 2], [[[[['..W', '.BW', 'W.W'], 'W'], [['W..', '.W.', '.W.'], 'W'], [['WWW', 'W.W', '...'], 'B'], [['WBB', 'WWB', 'B..'], 'W'], [['BB.', '.WB', '..B'], 'W'], [['W.W', 'B.B', '.B.'], 'B']], ['BBW', 'B..', 'B.W'], 'W', 'situational'], 'legal'], [[[[['B.B', 'WB.', '...'], 'W'], [['.W.', 'BWW', 'W..'], 'B']], ['B.B', 'WB.', '...'], 'B', 'situational'], 'legal'], [[[[['..', 'B.'], 'W'], [['.B', 'WB'], 'B'], [['..', '.W'], 'B'], [['..', '.W'], 'W'], [['.B', 'B.'], 'B']], ['..', '.W'], 'W', 'situational'], 3], [[[[['B..', '..B', 'W.B'], 'W']], ['B..', '..B', 'W.B'], 'W', 'positional'], 0], [[[[['W.B', 'B..', '.BB'], 'W'], [['.BB', 'WB.', 'BB.'], 'W']], ['.BB', 'WB.', 'BB.'], 'B', 'situational'], 'legal']], [[[[[['...', 'BW.', 'BBW'], 'B'], [['.W.', '..B', 'BBW'], 'B'], [['W.B', '.W.', '...'], 'B'], [['.WB', '.BW', '..W'], 'W'], [['...', 'W.B', 'W.B'], 'B']], ['.WW', '.W.', 'BW.'], 'B', 'positional'], 'legal'], [[[[['W.', '..'], 'B'], [['..', 'B.'], 'W'], [['.B', '.B'], 'B'], [['B.', 'BW'], 'W'], [['BB', '..'], 'W']], ['..', 'WW'], 'B', 'situational'], 'legal'], [[[[['WWW', '..B', 'B..'], 'B'], [['..W', 'W.B', '.B.'], 'B'], [['..B', '...', '.B.'], 'W']], ['..W', '..W', 'B.W'], 'W', 'positional'], 'legal'], [[[[['.B', 'B.'], 'B'], [['.B', 'B.'], 'B'], [['BW', '..'], 'B'], [['.B', 'B.'], 'B'], [['.B', 'BB'], 'B']], ['.B', 'B.'], 'B', 'situational'], 0], [[[[['W.', '.W'], 'B'], [['B.', '..'], 'B'], [['WB', '..'], 'B'], [['BW', '.W'], 'W']], ['BW', '.W'], 'B', 'positional'], 3], [[[[['B.W', 'W.W', 'B.W'], 'W'], [['BWB', '.BW', 'B..'], 'W'], [['..W', 'B..', 'B..'], 'B'], [['WWW', 'B.B', 'WW.'], 'W'], [['.BB', '.WB', '..B'], 'B']], ['BBB', '.W.', 'W.W'], 'B', 'positional'], 'legal'], [[[[['...', '.W.', 'BWW'], 'B'], [['BWB', 'W.W', 'WBW'], 'B'], [['...', '...', '...'], 'B'], [['..W', '.WB', 'B..'], 'B'], [['WBW', 'WWB', 'WB.'], 'W']], ['...', '.W.', 'BWW'], 'W', 'positional'], 0], [[[[['.W.', 'W..', 'B.W'], 'W'], [['WW.', '.W.', '...'], 'B'], [['.BB', '..W', 'WBW'], 'B'], [['.W.', 'BW.', 'BB.'], 'W']], ['WWW', '..W', 'WW.'], 'B', 'positional'], 'legal']], [[[[[['...', 'BW.', 'BBW'], 'B'], [['.W.', '..B', 'BBW'], 'B'], [['W.B', '.W.', '...'], 'B'], [['.WB', '.BW', '..W'], 'W'], [['...', 'W.B', 'W.B'], 'B']], ['.WW', '.W.', 'BW.'], 'B', 'positional'], 'legal'], [[[[['W.B', 'B..', '.BB'], 'W'], [['.BB', 'WB.', 'BB.'], 'W']], ['.BB', 'WB.', 'BB.'], 'B', 'situational'], 'legal'], [[[[['.B', 'B.'], 'W'], [['B.', 'W.'], 'W']], ['.B', 'B.'], 'B', 'situational'], 'legal'], [[[[['.W.', 'W..', 'B.W'], 'W'], [['WW.', '.W.', '...'], 'B'], [['.BB', '..W', 'WBW'], 'B'], [['.W.', 'BW.', 'BB.'], 'W']], ['WWW', '..W', 'WW.'], 'B', 'positional'], 'legal'], [[[[['..W', 'BBW', '.W.'], 'B'], [['..B', 'WBW', 'BW.'], 'W'], [['.B.', '..B', 'B..'], 'W']], ['..W', 'BBW', '.W.'], 'B', 'situational'], 0], [[[[['BW.', 'W.B', '...'], 'B'], [['W.B', '.B.', 'WWB'], 'W'], [['W..', '.BB', '..W'], 'W'], [['.W.', 'BWW', '...'], 'B'], [['...', '.B.', 'B..'], 'W']], ['BW.', 'W.B', '...'], 'B', 'situational'], 0], [[[[['BB.', 'BB.', 'WBB'], 'B'], [['..B', 'BW.', 'BBB'], 'W']], ['..B', 'BW.', 'BBB'], 'B', 'situational'], 'legal'], [[[[['.W', '.B'], 'B'], [['.B', '..'], 'W'], [['.B', '..'], 'W'], [['BB', '.B'], 'B']], ['.B', '..'], 'W', 'positional'], 1]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("superko case %d" % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| superko case 0 | legal | legal | Passed |
| superko case 1 | legal | legal | Passed |
| superko case 2 | 5 | 5 | Passed |
| superko case 3 | 1 | 1 | Passed |
| superko case 4 | 0 | 0 | Passed |
| superko case 5 | 0 | 0 | Passed |
| superko case 6 | legal | legal | Passed |
| superko case 7 | legal | legal | Passed |
SHA-256 / 31f2f9e9cd02f11d13ca83b180801879683c3f1b3db6354a3681aea4e78946d8
Verification & scope
Small rectangular toy boards given as strings of B, W and dot; a bounded teaching model of one scoring or bookkeeping rule, not a complete rules engine or server implementation. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:50:16.664810+00:00.
Case digest / 127de2c3bb08593ac5a615e5a3f2a8a8a9098a82539386682083227592eb6833