FA-97476 / Knitting and sewing pattern grading / Open access
Knitting chart row reader: WS swap and direction · case 01
Wrong-side rows tell the knitter to knit stitches that should be purled.
ROOT CAUSE
WS rows are read left-to-right but symbols are not converted to their WS equivalents.
VERIFIED REPAIR
Swap each symbol for its WS equivalent and read left-to-right.
Unsuccessful approach: Reversing the row after swapping reads WS rows in the RS direction.
Case contract
chart rows are listed bottom-up (row 1 first), cells left-to-right as drawn. Rounds and RS rows read right-to-left unchanged. Flat WS rows (even rows, or odd rows when start_ws) read left-to-right with swaps k<->p, k2tog->p2tog, ssk->ssp, yo stays. Runs of identical stitches merge: k/p as "k3", others as "yo" or "yo x2". Row outside 1..len -> error.
Why this case matters
Chart readers must flip reading direction and stitch meaning on wrong-side rows.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(chart, row, in_round, start_ws):
SWAP = {'k': 'p', 'p': 'k', 'k2tog': 'p2tog', 'ssk': 'ssp', 'yo': 'yo'}
if not 1 <= row <= len(chart):
return 'error: no such row'
cells = list(chart[row - 1])
ws = (not in_round) and ((row % 2 == 0) != start_ws)
if ws:
seq = list(cells)
else:
seq = cells[::-1]
out = []
for c in seq:
if out and out[-1][0] == c:
out[-1][1] += 1
else:
out.append([c, 1])
return ', '.join(c + str(n) if c in ('k', 'p') else (c if n == 1 else '%s x%d' % (c, n)) for c, n in out)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
'k2tog, yo, p1, k2'],
['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
'k2, p1, ssp, p1'],
['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
['regression: WS swap and direction',
[[['yo', 'yo', 'k', 'p', 'k', 'yo', 'yo'], ['p', 'yo', 'yo', 'yo', 'ssk', 'ssk', 'k'],
['yo', 'k', 'k2tog', 'yo', 'p', 'p', 'ssk']],
3, False, True],
'yo, p1, p2tog, yo, k2, ssp'],
['repair check: WS swap and direction',
[[['k2tog', 'yo', 'yo', 'k2tog', 'ssk', 'yo', 'ssk', 'ssk'],
['p', 'k', 'yo', 'ssk', 'yo', 'k', 'yo', 'yo'],
['ssk', 'ssk', 'k2tog', 'k2tog', 'ssk', 'yo', 'ssk', 'yo'],
['ssk', 'k2tog', 'p', 'ssk', 'k', 'p', 'yo', 'yo']],
2, False, False],
'k1, p1, yo, ssp, yo, p1, yo x2'],
['generated control 1',
[[['ssk', 'k2tog', 'yo', 'yo', 'k'], ['ssk', 'p', 'ssk', 'p', 'k'], ['k2tog', 'k', 'ssk', 'ssk', 'yo']], 3,
False, False],
'yo, ssk x2, k1, k2tog'],
['generated control 2',
[[['k2tog', 'yo', 'yo', 'k', 'p', 'ssk'], ['ssk', 'k', 'p', 'p', 'p', 'k2tog'],
['k2tog', 'k', 'ssk', 'yo', 'p', 'k2tog'], ['ssk', 'ssk', 'k2tog', 'p', 'ssk', 'ssk']],
1, False, False],
'ssk, p1, k1, yo x2, k2tog'],
['generated control 3',
[[['p', 'p', 'k', 'p', 'yo', 'yo'], ['p', 'k2tog', 'yo', 'p', 'ssk', 'k2tog'],
['k2tog', 'yo', 'yo', 'ssk', 'k2tog', 'k'], ['k', 'yo', 'ssk', 'yo', 'yo', 'k'],
['k2tog', 'yo', 'yo', 'yo', 'k', 'k']],
4, False, False],
'p1, yo, ssp, yo x2, p1']],
[['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
'k2, p1, ssp, p1'],
['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
['out of range', [[['k']], 3, False, False], 'error: no such row'],
['regression: WS swap and direction',
[[['k', 'k2tog', 'k2tog'], ['k', 'yo', 'p'], ['ssk', 'k', 'yo'], ['yo', 'ssk', 'yo'], ['yo', 'p', 'ssk']],
2, False, False],
'p1, yo, k1'],
['repair check: WS swap and direction',
[[['ssk', 'yo', 'yo', 'k2tog'], ['ssk', 'p', 'yo', 'p']], 2, False, False], 'ssp, k1, yo, k1'],
['generated control 1',
[[['yo', 'ssk', 'k', 'yo', 'yo', 'yo', 'k', 'ssk'],
['k2tog', 'p', 'k2tog', 'yo', 'ssk', 'yo', 'yo', 'k2tog'],
['k2tog', 'yo', 'p', 'ssk', 'k', 'ssk', 'ssk', 'k2tog'],
['ssk', 'ssk', 'k', 'yo', 'ssk', 'k', 'k', 'p']],
3, True, False],
'k2tog, ssk x2, k1, ssk, p1, yo, k2tog'],
['generated control 2',
[[['yo', 'k2tog', 'ssk', 'yo', 'ssk', 'p', 'k2tog', 'yo'],
['p', 'k2tog', 'p', 'k', 'k2tog', 'ssk', 'ssk', 'p']],
1, True, True],
'yo, k2tog, p1, ssk, yo, ssk, k2tog, yo'],
['generated control 3',
[[['k2tog', 'k', 'yo', 'yo', 'yo', 'k2tog', 'ssk', 'k2tog'],
['yo', 'p', 'ssk', 'yo', 'k2tog', 'k2tog', 'ssk', 'p']],
1, False, False],
'k2tog, ssk, k2tog, yo x3, k1, k2tog']],
[['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
['out of range', [[['k']], 3, False, False], 'error: no such row'],
['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
'k2tog, yo, p1, k2'],
['regression: WS swap and direction',
[[['yo', 'yo', 'k', 'p', 'k2tog', 'p'], ['ssk', 'p', 'p', 'ssk', 'yo', 'ssk'],
['yo', 'ssk', 'k', 'ssk', 'p', 'ssk'], ['p', 'p', 'ssk', 'yo', 'yo', 'k2tog'],
['k2tog', 'ssk', 'p', 'p', 'p', 'ssk']],
2, False, False],
'ssp, k2, ssp, yo, ssp'],
['repair check: WS swap and direction',
[[['yo', 'p', 'yo', 'yo', 'yo'], ['ssk', 'k2tog', 'k2tog', 'p', 'yo'],
['yo', 'k2tog', 'ssk', 'k2tog', 'yo'], ['yo', 'k2tog', 'ssk', 'p', 'k'], ['p', 'ssk', 'k', 'k', 'yo'],
['k2tog', 'p', 'k', 'p', 'yo']],
6, False, False],
'p2tog, k1, p1, k1, yo'],
['generated control 1',
[[['yo', 'yo', 'k2tog', 'k2tog', 'ssk', 'k2tog', 'p'],
['ssk', 'ssk', 'k2tog', 'p', 'k2tog', 'k2tog', 'k2tog'], ['yo', 'p', 'ssk', 'ssk', 'k', 'k2tog', 'p'],
['k', 'ssk', 'k', 'ssk', 'yo', 'k2tog', 'ssk']],
1, False, False],
'p1, k2tog, ssk, k2tog x2, yo x2'],
['generated control 2',
[[['ssk', 'yo', 'k2tog', 'k', 'yo', 'yo', 'yo', 'ssk'],
['k2tog', 'k2tog', 'k', 'p', 'p', 'k2tog', 'yo', 'yo'],
['k2tog', 'ssk', 'k2tog', 'yo', 'k2tog', 'k', 'k2tog', 'k2tog']],
3, True, False],
'k2tog x2, k1, k2tog, yo, k2tog, ssk, k2tog'],
['generated control 3',
[[['k2tog', 'k', 'k', 'k2tog', 'k2tog', 'k'], ['k', 'ssk', 'yo', 'ssk', 'yo', 'k'],
['yo', 'k2tog', 'k2tog', 'p', 'yo', 'p'], ['p', 'k', 'ssk', 'p', 'k', 'yo']],
2, True, True],
'k1, yo, ssk, yo, ssk, k1']],
[['out of range', [[['k']], 3, False, False], 'error: no such row'],
['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
'k2tog, yo, p1, k2'],
['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
'k2, p1, ssp, p1'],
['regression: WS swap and direction',
[[['p', 'p', 'yo', 'yo', 'ssk', 'yo'], ['k2tog', 'ssk', 'k', 'k2tog', 'yo', 'p']], 2, False, False],
'p2tog, ssp, p1, p2tog, yo, k1'],
['repair check: WS swap and direction',
[[['k2tog', 'p', 'k', 'p', 'ssk', 'p', 'p', 'yo'], ['yo', 'ssk', 'k', 'k2tog', 'ssk', 'p', 'p', 'k2tog'],
['k2tog', 'k', 'ssk', 'k', 'ssk', 'k2tog', 'yo', 'k2tog']],
3, False, True],
'p2tog, p1, ssp, p1, ssp, p2tog, yo, p2tog'],
['generated control 1',
[[['k', 'k', 'yo', 'k', 'p', 'k2tog', 'ssk'], ['yo', 'ssk', 'k', 'p', 'p', 'yo', 'k']], 2, True, False],
'k1, yo, p2, k1, ssk, yo'],
['generated control 2',
[[['p', 'ssk', 'yo', 'k2tog', 'ssk', 'yo', 'yo'], ['ssk', 'p', 'p', 'p', 'k', 'k', 'p'],
['k2tog', 'k', 'k', 'ssk', 'k', 'ssk', 'k'], ['k', 'p', 'ssk', 'ssk', 'k', 'yo', 'yo'],
['k', 'k2tog', 'p', 'yo', 'k2tog', 'p', 'k2tog']],
1, False, False],
'yo x2, ssk, k2tog, yo, ssk, p1'],
['generated control 3',
[[['ssk', 'k2tog', 'ssk', 'p', 'ssk', 'p'], ['ssk', 'k', 'k', 'k2tog', 'p', 'ssk'],
['yo', 'yo', 'p', 'ssk', 'p', 'k']],
1, True, False],
'p1, ssk, p1, ssk, k2tog, ssk']],
[['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
'k2tog, yo, p1, k2'],
['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
'k2, p1, ssp, p1'],
['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
['regression: WS swap and direction',
[[['k2tog', 'k', 'k', 'k', 'yo', 'k2tog', 'ssk', 'ssk'], ['ssk', 'k', 'ssk', 'p', 'p', 'k', 'p', 'k2tog'],
['k2tog', 'p', 'k', 'k2tog', 'k2tog', 'ssk', 'yo', 'k2tog'],
['k', 'p', 'k2tog', 'k2tog', 'yo', 'k2tog', 'p', 'yo'],
['ssk', 'p', 'yo', 'p', 'p', 'k2tog', 'yo', 'k2tog']],
1, False, True],
'p2tog, p3, yo, p2tog, ssp x2'],
['repair check: WS swap and direction',
[[['ssk', 'k2tog', 'k', 'k', 'yo', 'yo', 'yo', 'yo'], ['ssk', 'p', 'p', 'yo', 'ssk', 'p', 'p', 'k'],
['yo', 'k', 'ssk', 'yo', 'k2tog', 'k', 'k', 'p'],
['ssk', 'p', 'p', 'ssk', 'yo', 'k2tog', 'k2tog', 'k']],
3, False, True],
'yo, p1, ssp, yo, p2tog, p2, k1'],
['generated control 1',
[[['ssk', 'ssk', 'ssk', 'yo'], ['ssk', 'k', 'yo', 'yo'], ['k2tog', 'k', 'k2tog', 'yo'],
['k', 'k', 'k', 'k2tog'], ['p', 'k', 'p', 'p']],
5, True, False],
'p2, k1, p1'],
['generated control 2',
[[['k2tog', 'ssk', 'yo', 'k', 'yo', 'yo', 'k'], ['k2tog', 'k2tog', 'k', 'ssk', 'k', 'yo', 'k2tog'],
['ssk', 'ssk', 'k', 'p', 'p', 'k2tog', 'p']],
2, False, False],
'p2tog x2, p1, ssp, p1, yo, p2tog'],
['generated control 3',
[[['k2tog', 'p', 'p', 'p'], ['p', 'yo', 'k', 'k'], ['k2tog', 'k', 'k', 'ssk']], 1, True, False],
'p3, k2tog']]]
for label, args, expected in fixtures[N - 1]:
check(label, 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 |
|---|---|---|---|
| RS row | k2tog, yo, p1, k2 | k2tog, yo, p1, k2 | Passed |
| WS row swapped | p2, k1, ssk, k1 | k2, p1, ssp, p1 | Failed |
| in the round | k1, ssk | k1, ssk | Passed |
| regression: WS swap and direction | yo, k1, k2tog, yo, p2, ssk | yo, p1, p2tog, yo, k2, ssp | Failed |
| repair check: WS swap and direction | p1, k1, yo, ssk, yo, k1, yo x2 | k1, p1, yo, ssp, yo, p1, yo x2 | Failed |
| generated control 1 | yo, ssk x2, k1, k2tog | yo, ssk x2, k1, k2tog | Passed |
| generated control 2 | ssk, p1, k1, yo x2, k2tog | ssk, p1, k1, yo x2, k2tog | Passed |
| generated control 3 | k1, yo, ssk, yo x2, k1 | p1, yo, ssp, yo x2, p1 | Failed |
SHA-256 / c4cd459770dc59c48076aed3e6ecae218c58c15083715c8d89bc25900ca8d059
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(chart, row, in_round, start_ws):
SWAP = {'k': 'p', 'p': 'k', 'k2tog': 'p2tog', 'ssk': 'ssp', 'yo': 'yo'}
if not 1 <= row <= len(chart):
return 'error: no such row'
cells = list(chart[row - 1])
ws = (not in_round) and ((row % 2 == 0) != start_ws)
if ws:
seq = [SWAP.get(c, c) for c in cells[::-1]]
else:
seq = cells[::-1]
out = []
for c in seq:
if out and out[-1][0] == c:
out[-1][1] += 1
else:
out.append([c, 1])
return ', '.join(c + str(n) if c in ('k', 'p') else (c if n == 1 else '%s x%d' % (c, n)) for c, n in out)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
'k2tog, yo, p1, k2'],
['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
'k2, p1, ssp, p1'],
['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
['regression: WS swap and direction',
[[['yo', 'yo', 'k', 'p', 'k', 'yo', 'yo'], ['p', 'yo', 'yo', 'yo', 'ssk', 'ssk', 'k'],
['yo', 'k', 'k2tog', 'yo', 'p', 'p', 'ssk']],
3, False, True],
'yo, p1, p2tog, yo, k2, ssp'],
['repair check: WS swap and direction',
[[['k2tog', 'yo', 'yo', 'k2tog', 'ssk', 'yo', 'ssk', 'ssk'],
['p', 'k', 'yo', 'ssk', 'yo', 'k', 'yo', 'yo'],
['ssk', 'ssk', 'k2tog', 'k2tog', 'ssk', 'yo', 'ssk', 'yo'],
['ssk', 'k2tog', 'p', 'ssk', 'k', 'p', 'yo', 'yo']],
2, False, False],
'k1, p1, yo, ssp, yo, p1, yo x2'],
['generated control 1',
[[['ssk', 'k2tog', 'yo', 'yo', 'k'], ['ssk', 'p', 'ssk', 'p', 'k'], ['k2tog', 'k', 'ssk', 'ssk', 'yo']], 3,
False, False],
'yo, ssk x2, k1, k2tog'],
['generated control 2',
[[['k2tog', 'yo', 'yo', 'k', 'p', 'ssk'], ['ssk', 'k', 'p', 'p', 'p', 'k2tog'],
['k2tog', 'k', 'ssk', 'yo', 'p', 'k2tog'], ['ssk', 'ssk', 'k2tog', 'p', 'ssk', 'ssk']],
1, False, False],
'ssk, p1, k1, yo x2, k2tog'],
['generated control 3',
[[['p', 'p', 'k', 'p', 'yo', 'yo'], ['p', 'k2tog', 'yo', 'p', 'ssk', 'k2tog'],
['k2tog', 'yo', 'yo', 'ssk', 'k2tog', 'k'], ['k', 'yo', 'ssk', 'yo', 'yo', 'k'],
['k2tog', 'yo', 'yo', 'yo', 'k', 'k']],
4, False, False],
'p1, yo, ssp, yo x2, p1']],
[['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
'k2, p1, ssp, p1'],
['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
['out of range', [[['k']], 3, False, False], 'error: no such row'],
['regression: WS swap and direction',
[[['k', 'k2tog', 'k2tog'], ['k', 'yo', 'p'], ['ssk', 'k', 'yo'], ['yo', 'ssk', 'yo'], ['yo', 'p', 'ssk']],
2, False, False],
'p1, yo, k1'],
['repair check: WS swap and direction',
[[['ssk', 'yo', 'yo', 'k2tog'], ['ssk', 'p', 'yo', 'p']], 2, False, False], 'ssp, k1, yo, k1'],
['generated control 1',
[[['yo', 'ssk', 'k', 'yo', 'yo', 'yo', 'k', 'ssk'],
['k2tog', 'p', 'k2tog', 'yo', 'ssk', 'yo', 'yo', 'k2tog'],
['k2tog', 'yo', 'p', 'ssk', 'k', 'ssk', 'ssk', 'k2tog'],
['ssk', 'ssk', 'k', 'yo', 'ssk', 'k', 'k', 'p']],
3, True, False],
'k2tog, ssk x2, k1, ssk, p1, yo, k2tog'],
['generated control 2',
[[['yo', 'k2tog', 'ssk', 'yo', 'ssk', 'p', 'k2tog', 'yo'],
['p', 'k2tog', 'p', 'k', 'k2tog', 'ssk', 'ssk', 'p']],
1, True, True],
'yo, k2tog, p1, ssk, yo, ssk, k2tog, yo'],
['generated control 3',
[[['k2tog', 'k', 'yo', 'yo', 'yo', 'k2tog', 'ssk', 'k2tog'],
['yo', 'p', 'ssk', 'yo', 'k2tog', 'k2tog', 'ssk', 'p']],
1, False, False],
'k2tog, ssk, k2tog, yo x3, k1, k2tog']],
[['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
['out of range', [[['k']], 3, False, False], 'error: no such row'],
['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
'k2tog, yo, p1, k2'],
['regression: WS swap and direction',
[[['yo', 'yo', 'k', 'p', 'k2tog', 'p'], ['ssk', 'p', 'p', 'ssk', 'yo', 'ssk'],
['yo', 'ssk', 'k', 'ssk', 'p', 'ssk'], ['p', 'p', 'ssk', 'yo', 'yo', 'k2tog'],
['k2tog', 'ssk', 'p', 'p', 'p', 'ssk']],
2, False, False],
'ssp, k2, ssp, yo, ssp'],
['repair check: WS swap and direction',
[[['yo', 'p', 'yo', 'yo', 'yo'], ['ssk', 'k2tog', 'k2tog', 'p', 'yo'],
['yo', 'k2tog', 'ssk', 'k2tog', 'yo'], ['yo', 'k2tog', 'ssk', 'p', 'k'], ['p', 'ssk', 'k', 'k', 'yo'],
['k2tog', 'p', 'k', 'p', 'yo']],
6, False, False],
'p2tog, k1, p1, k1, yo'],
['generated control 1',
[[['yo', 'yo', 'k2tog', 'k2tog', 'ssk', 'k2tog', 'p'],
['ssk', 'ssk', 'k2tog', 'p', 'k2tog', 'k2tog', 'k2tog'], ['yo', 'p', 'ssk', 'ssk', 'k', 'k2tog', 'p'],
['k', 'ssk', 'k', 'ssk', 'yo', 'k2tog', 'ssk']],
1, False, False],
'p1, k2tog, ssk, k2tog x2, yo x2'],
['generated control 2',
[[['ssk', 'yo', 'k2tog', 'k', 'yo', 'yo', 'yo', 'ssk'],
['k2tog', 'k2tog', 'k', 'p', 'p', 'k2tog', 'yo', 'yo'],
['k2tog', 'ssk', 'k2tog', 'yo', 'k2tog', 'k', 'k2tog', 'k2tog']],
3, True, False],
'k2tog x2, k1, k2tog, yo, k2tog, ssk, k2tog'],
['generated control 3',
[[['k2tog', 'k', 'k', 'k2tog', 'k2tog', 'k'], ['k', 'ssk', 'yo', 'ssk', 'yo', 'k'],
['yo', 'k2tog', 'k2tog', 'p', 'yo', 'p'], ['p', 'k', 'ssk', 'p', 'k', 'yo']],
2, True, True],
'k1, yo, ssk, yo, ssk, k1']],
[['out of range', [[['k']], 3, False, False], 'error: no such row'],
['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
'k2tog, yo, p1, k2'],
['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
'k2, p1, ssp, p1'],
['regression: WS swap and direction',
[[['p', 'p', 'yo', 'yo', 'ssk', 'yo'], ['k2tog', 'ssk', 'k', 'k2tog', 'yo', 'p']], 2, False, False],
'p2tog, ssp, p1, p2tog, yo, k1'],
['repair check: WS swap and direction',
[[['k2tog', 'p', 'k', 'p', 'ssk', 'p', 'p', 'yo'], ['yo', 'ssk', 'k', 'k2tog', 'ssk', 'p', 'p', 'k2tog'],
['k2tog', 'k', 'ssk', 'k', 'ssk', 'k2tog', 'yo', 'k2tog']],
3, False, True],
'p2tog, p1, ssp, p1, ssp, p2tog, yo, p2tog'],
['generated control 1',
[[['k', 'k', 'yo', 'k', 'p', 'k2tog', 'ssk'], ['yo', 'ssk', 'k', 'p', 'p', 'yo', 'k']], 2, True, False],
'k1, yo, p2, k1, ssk, yo'],
['generated control 2',
[[['p', 'ssk', 'yo', 'k2tog', 'ssk', 'yo', 'yo'], ['ssk', 'p', 'p', 'p', 'k', 'k', 'p'],
['k2tog', 'k', 'k', 'ssk', 'k', 'ssk', 'k'], ['k', 'p', 'ssk', 'ssk', 'k', 'yo', 'yo'],
['k', 'k2tog', 'p', 'yo', 'k2tog', 'p', 'k2tog']],
1, False, False],
'yo x2, ssk, k2tog, yo, ssk, p1'],
['generated control 3',
[[['ssk', 'k2tog', 'ssk', 'p', 'ssk', 'p'], ['ssk', 'k', 'k', 'k2tog', 'p', 'ssk'],
['yo', 'yo', 'p', 'ssk', 'p', 'k']],
1, True, False],
'p1, ssk, p1, ssk, k2tog, ssk']],
[['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
'k2tog, yo, p1, k2'],
['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
'k2, p1, ssp, p1'],
['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
['regression: WS swap and direction',
[[['k2tog', 'k', 'k', 'k', 'yo', 'k2tog', 'ssk', 'ssk'], ['ssk', 'k', 'ssk', 'p', 'p', 'k', 'p', 'k2tog'],
['k2tog', 'p', 'k', 'k2tog', 'k2tog', 'ssk', 'yo', 'k2tog'],
['k', 'p', 'k2tog', 'k2tog', 'yo', 'k2tog', 'p', 'yo'],
['ssk', 'p', 'yo', 'p', 'p', 'k2tog', 'yo', 'k2tog']],
1, False, True],
'p2tog, p3, yo, p2tog, ssp x2'],
['repair check: WS swap and direction',
[[['ssk', 'k2tog', 'k', 'k', 'yo', 'yo', 'yo', 'yo'], ['ssk', 'p', 'p', 'yo', 'ssk', 'p', 'p', 'k'],
['yo', 'k', 'ssk', 'yo', 'k2tog', 'k', 'k', 'p'],
['ssk', 'p', 'p', 'ssk', 'yo', 'k2tog', 'k2tog', 'k']],
3, False, True],
'yo, p1, ssp, yo, p2tog, p2, k1'],
['generated control 1',
[[['ssk', 'ssk', 'ssk', 'yo'], ['ssk', 'k', 'yo', 'yo'], ['k2tog', 'k', 'k2tog', 'yo'],
['k', 'k', 'k', 'k2tog'], ['p', 'k', 'p', 'p']],
5, True, False],
'p2, k1, p1'],
['generated control 2',
[[['k2tog', 'ssk', 'yo', 'k', 'yo', 'yo', 'k'], ['k2tog', 'k2tog', 'k', 'ssk', 'k', 'yo', 'k2tog'],
['ssk', 'ssk', 'k', 'p', 'p', 'k2tog', 'p']],
2, False, False],
'p2tog x2, p1, ssp, p1, yo, p2tog'],
['generated control 3',
[[['k2tog', 'p', 'p', 'p'], ['p', 'yo', 'k', 'k'], ['k2tog', 'k', 'k', 'ssk']], 1, True, False],
'p3, k2tog']]]
for label, args, expected in fixtures[N - 1]:
check(label, 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 |
|---|---|---|---|
| RS row | k2tog, yo, p1, k2 | k2tog, yo, p1, k2 | Passed |
| WS row swapped | p1, ssp, p1, k2 | k2, p1, ssp, p1 | Failed |
| in the round | k1, ssk | k1, ssk | Passed |
| regression: WS swap and direction | ssp, k2, yo, p2tog, p1, yo | yo, p1, p2tog, yo, k2, ssp | Failed |
| repair check: WS swap and direction | yo x2, p1, yo, ssp, yo, p1, k1 | k1, p1, yo, ssp, yo, p1, yo x2 | Failed |
| generated control 1 | yo, ssk x2, k1, k2tog | yo, ssk x2, k1, k2tog | Passed |
| generated control 2 | ssk, p1, k1, yo x2, k2tog | ssk, p1, k1, yo x2, k2tog | Passed |
| generated control 3 | p1, yo x2, ssp, yo, p1 | p1, yo, ssp, yo x2, p1 | Failed |
SHA-256 / fc0edb87d4301c479cb18dcb6e29b0595ddfbe34955b1c72fcf077e4aec0cffe
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(chart, row, in_round, start_ws):
SWAP = {'k': 'p', 'p': 'k', 'k2tog': 'p2tog', 'ssk': 'ssp', 'yo': 'yo'}
if not 1 <= row <= len(chart):
return 'error: no such row'
cells = list(chart[row - 1])
ws = (not in_round) and ((row % 2 == 0) != start_ws)
if ws:
seq = [SWAP.get(c, c) for c in cells]
else:
seq = cells[::-1]
out = []
for c in seq:
if out and out[-1][0] == c:
out[-1][1] += 1
else:
out.append([c, 1])
return ', '.join(c + str(n) if c in ('k', 'p') else (c if n == 1 else '%s x%d' % (c, n)) for c, n in out)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
'k2tog, yo, p1, k2'],
['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
'k2, p1, ssp, p1'],
['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
['regression: WS swap and direction',
[[['yo', 'yo', 'k', 'p', 'k', 'yo', 'yo'], ['p', 'yo', 'yo', 'yo', 'ssk', 'ssk', 'k'],
['yo', 'k', 'k2tog', 'yo', 'p', 'p', 'ssk']],
3, False, True],
'yo, p1, p2tog, yo, k2, ssp'],
['repair check: WS swap and direction',
[[['k2tog', 'yo', 'yo', 'k2tog', 'ssk', 'yo', 'ssk', 'ssk'],
['p', 'k', 'yo', 'ssk', 'yo', 'k', 'yo', 'yo'],
['ssk', 'ssk', 'k2tog', 'k2tog', 'ssk', 'yo', 'ssk', 'yo'],
['ssk', 'k2tog', 'p', 'ssk', 'k', 'p', 'yo', 'yo']],
2, False, False],
'k1, p1, yo, ssp, yo, p1, yo x2'],
['generated control 1',
[[['ssk', 'k2tog', 'yo', 'yo', 'k'], ['ssk', 'p', 'ssk', 'p', 'k'], ['k2tog', 'k', 'ssk', 'ssk', 'yo']], 3,
False, False],
'yo, ssk x2, k1, k2tog'],
['generated control 2',
[[['k2tog', 'yo', 'yo', 'k', 'p', 'ssk'], ['ssk', 'k', 'p', 'p', 'p', 'k2tog'],
['k2tog', 'k', 'ssk', 'yo', 'p', 'k2tog'], ['ssk', 'ssk', 'k2tog', 'p', 'ssk', 'ssk']],
1, False, False],
'ssk, p1, k1, yo x2, k2tog'],
['generated control 3',
[[['p', 'p', 'k', 'p', 'yo', 'yo'], ['p', 'k2tog', 'yo', 'p', 'ssk', 'k2tog'],
['k2tog', 'yo', 'yo', 'ssk', 'k2tog', 'k'], ['k', 'yo', 'ssk', 'yo', 'yo', 'k'],
['k2tog', 'yo', 'yo', 'yo', 'k', 'k']],
4, False, False],
'p1, yo, ssp, yo x2, p1']],
[['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
'k2, p1, ssp, p1'],
['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
['out of range', [[['k']], 3, False, False], 'error: no such row'],
['regression: WS swap and direction',
[[['k', 'k2tog', 'k2tog'], ['k', 'yo', 'p'], ['ssk', 'k', 'yo'], ['yo', 'ssk', 'yo'], ['yo', 'p', 'ssk']],
2, False, False],
'p1, yo, k1'],
['repair check: WS swap and direction',
[[['ssk', 'yo', 'yo', 'k2tog'], ['ssk', 'p', 'yo', 'p']], 2, False, False], 'ssp, k1, yo, k1'],
['generated control 1',
[[['yo', 'ssk', 'k', 'yo', 'yo', 'yo', 'k', 'ssk'],
['k2tog', 'p', 'k2tog', 'yo', 'ssk', 'yo', 'yo', 'k2tog'],
['k2tog', 'yo', 'p', 'ssk', 'k', 'ssk', 'ssk', 'k2tog'],
['ssk', 'ssk', 'k', 'yo', 'ssk', 'k', 'k', 'p']],
3, True, False],
'k2tog, ssk x2, k1, ssk, p1, yo, k2tog'],
['generated control 2',
[[['yo', 'k2tog', 'ssk', 'yo', 'ssk', 'p', 'k2tog', 'yo'],
['p', 'k2tog', 'p', 'k', 'k2tog', 'ssk', 'ssk', 'p']],
1, True, True],
'yo, k2tog, p1, ssk, yo, ssk, k2tog, yo'],
['generated control 3',
[[['k2tog', 'k', 'yo', 'yo', 'yo', 'k2tog', 'ssk', 'k2tog'],
['yo', 'p', 'ssk', 'yo', 'k2tog', 'k2tog', 'ssk', 'p']],
1, False, False],
'k2tog, ssk, k2tog, yo x3, k1, k2tog']],
[['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
['out of range', [[['k']], 3, False, False], 'error: no such row'],
['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
'k2tog, yo, p1, k2'],
['regression: WS swap and direction',
[[['yo', 'yo', 'k', 'p', 'k2tog', 'p'], ['ssk', 'p', 'p', 'ssk', 'yo', 'ssk'],
['yo', 'ssk', 'k', 'ssk', 'p', 'ssk'], ['p', 'p', 'ssk', 'yo', 'yo', 'k2tog'],
['k2tog', 'ssk', 'p', 'p', 'p', 'ssk']],
2, False, False],
'ssp, k2, ssp, yo, ssp'],
['repair check: WS swap and direction',
[[['yo', 'p', 'yo', 'yo', 'yo'], ['ssk', 'k2tog', 'k2tog', 'p', 'yo'],
['yo', 'k2tog', 'ssk', 'k2tog', 'yo'], ['yo', 'k2tog', 'ssk', 'p', 'k'], ['p', 'ssk', 'k', 'k', 'yo'],
['k2tog', 'p', 'k', 'p', 'yo']],
6, False, False],
'p2tog, k1, p1, k1, yo'],
['generated control 1',
[[['yo', 'yo', 'k2tog', 'k2tog', 'ssk', 'k2tog', 'p'],
['ssk', 'ssk', 'k2tog', 'p', 'k2tog', 'k2tog', 'k2tog'], ['yo', 'p', 'ssk', 'ssk', 'k', 'k2tog', 'p'],
['k', 'ssk', 'k', 'ssk', 'yo', 'k2tog', 'ssk']],
1, False, False],
'p1, k2tog, ssk, k2tog x2, yo x2'],
['generated control 2',
[[['ssk', 'yo', 'k2tog', 'k', 'yo', 'yo', 'yo', 'ssk'],
['k2tog', 'k2tog', 'k', 'p', 'p', 'k2tog', 'yo', 'yo'],
['k2tog', 'ssk', 'k2tog', 'yo', 'k2tog', 'k', 'k2tog', 'k2tog']],
3, True, False],
'k2tog x2, k1, k2tog, yo, k2tog, ssk, k2tog'],
['generated control 3',
[[['k2tog', 'k', 'k', 'k2tog', 'k2tog', 'k'], ['k', 'ssk', 'yo', 'ssk', 'yo', 'k'],
['yo', 'k2tog', 'k2tog', 'p', 'yo', 'p'], ['p', 'k', 'ssk', 'p', 'k', 'yo']],
2, True, True],
'k1, yo, ssk, yo, ssk, k1']],
[['out of range', [[['k']], 3, False, False], 'error: no such row'],
['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
'k2tog, yo, p1, k2'],
['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
'k2, p1, ssp, p1'],
['regression: WS swap and direction',
[[['p', 'p', 'yo', 'yo', 'ssk', 'yo'], ['k2tog', 'ssk', 'k', 'k2tog', 'yo', 'p']], 2, False, False],
'p2tog, ssp, p1, p2tog, yo, k1'],
['repair check: WS swap and direction',
[[['k2tog', 'p', 'k', 'p', 'ssk', 'p', 'p', 'yo'], ['yo', 'ssk', 'k', 'k2tog', 'ssk', 'p', 'p', 'k2tog'],
['k2tog', 'k', 'ssk', 'k', 'ssk', 'k2tog', 'yo', 'k2tog']],
3, False, True],
'p2tog, p1, ssp, p1, ssp, p2tog, yo, p2tog'],
['generated control 1',
[[['k', 'k', 'yo', 'k', 'p', 'k2tog', 'ssk'], ['yo', 'ssk', 'k', 'p', 'p', 'yo', 'k']], 2, True, False],
'k1, yo, p2, k1, ssk, yo'],
['generated control 2',
[[['p', 'ssk', 'yo', 'k2tog', 'ssk', 'yo', 'yo'], ['ssk', 'p', 'p', 'p', 'k', 'k', 'p'],
['k2tog', 'k', 'k', 'ssk', 'k', 'ssk', 'k'], ['k', 'p', 'ssk', 'ssk', 'k', 'yo', 'yo'],
['k', 'k2tog', 'p', 'yo', 'k2tog', 'p', 'k2tog']],
1, False, False],
'yo x2, ssk, k2tog, yo, ssk, p1'],
['generated control 3',
[[['ssk', 'k2tog', 'ssk', 'p', 'ssk', 'p'], ['ssk', 'k', 'k', 'k2tog', 'p', 'ssk'],
['yo', 'yo', 'p', 'ssk', 'p', 'k']],
1, True, False],
'p1, ssk, p1, ssk, k2tog, ssk']],
[['RS row', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'k', 'k']], 1, False, False],
'k2tog, yo, p1, k2'],
['WS row swapped', [[['k', 'k', 'p', 'yo', 'k2tog'], ['p', 'p', 'k', 'ssk', 'k']], 2, False, False],
'k2, p1, ssp, p1'],
['in the round', [[['k', 'p'], ['ssk', 'k']], 2, True, False], 'k1, ssk'],
['regression: WS swap and direction',
[[['k2tog', 'k', 'k', 'k', 'yo', 'k2tog', 'ssk', 'ssk'], ['ssk', 'k', 'ssk', 'p', 'p', 'k', 'p', 'k2tog'],
['k2tog', 'p', 'k', 'k2tog', 'k2tog', 'ssk', 'yo', 'k2tog'],
['k', 'p', 'k2tog', 'k2tog', 'yo', 'k2tog', 'p', 'yo'],
['ssk', 'p', 'yo', 'p', 'p', 'k2tog', 'yo', 'k2tog']],
1, False, True],
'p2tog, p3, yo, p2tog, ssp x2'],
['repair check: WS swap and direction',
[[['ssk', 'k2tog', 'k', 'k', 'yo', 'yo', 'yo', 'yo'], ['ssk', 'p', 'p', 'yo', 'ssk', 'p', 'p', 'k'],
['yo', 'k', 'ssk', 'yo', 'k2tog', 'k', 'k', 'p'],
['ssk', 'p', 'p', 'ssk', 'yo', 'k2tog', 'k2tog', 'k']],
3, False, True],
'yo, p1, ssp, yo, p2tog, p2, k1'],
['generated control 1',
[[['ssk', 'ssk', 'ssk', 'yo'], ['ssk', 'k', 'yo', 'yo'], ['k2tog', 'k', 'k2tog', 'yo'],
['k', 'k', 'k', 'k2tog'], ['p', 'k', 'p', 'p']],
5, True, False],
'p2, k1, p1'],
['generated control 2',
[[['k2tog', 'ssk', 'yo', 'k', 'yo', 'yo', 'k'], ['k2tog', 'k2tog', 'k', 'ssk', 'k', 'yo', 'k2tog'],
['ssk', 'ssk', 'k', 'p', 'p', 'k2tog', 'p']],
2, False, False],
'p2tog x2, p1, ssp, p1, yo, p2tog'],
['generated control 3',
[[['k2tog', 'p', 'p', 'p'], ['p', 'yo', 'k', 'k'], ['k2tog', 'k', 'k', 'ssk']], 1, True, False],
'p3, k2tog']]]
for label, args, expected in fixtures[N - 1]:
check(label, 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 |
|---|---|---|---|
| RS row | k2tog, yo, p1, k2 | k2tog, yo, p1, k2 | Passed |
| WS row swapped | k2, p1, ssp, p1 | k2, p1, ssp, p1 | Passed |
| in the round | k1, ssk | k1, ssk | Passed |
| regression: WS swap and direction | yo, p1, p2tog, yo, k2, ssp | yo, p1, p2tog, yo, k2, ssp | Passed |
| repair check: WS swap and direction | k1, p1, yo, ssp, yo, p1, yo x2 | k1, p1, yo, ssp, yo, p1, yo x2 | Passed |
| generated control 1 | yo, ssk x2, k1, k2tog | yo, ssk x2, k1, k2tog | Passed |
| generated control 2 | ssk, p1, k1, yo x2, k2tog | ssk, p1, k1, yo x2, k2tog | Passed |
| generated control 3 | p1, yo, ssp, yo x2, p1 | p1, yo, ssp, yo x2, p1 | Passed |
SHA-256 / 52a028df8b2252d414d1100727e82de1f0b59c885e9a04fdaa4222f4b07b8486
Verification & scope
A deterministic toy contract stated in full here; it is a bounded teaching model, not an authoritative reference or standards 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:52:32.565205+00:00.
Case digest / 38e95aa86841b2da8899ebab017fab38e483a6eb6a8fde5ae7411cc9e594738c