broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(preset, start, scans):
    acc = start
    ov = False
    un = False
    pcu = False
    pcd = False
    out = []
    for cu, cd, res in scans:
        cu = bool(cu)
        cd = bool(cd)
        if cu and not pcu:
            acc += 1
            if acc > 32767:
                acc = -32768
                ov = True
        elif cd and not pcd:
            acc -= 1
            if acc < -32768:
                acc = 32767
                un = True
        pcu = cu
        pcd = cd
        if res:
            acc = 0
            ov = False
            un = False
        out.append([acc, acc >= preset, ov, un])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['regression: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['control: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['control: scenario 1',
   [0,
    1,
    [[True, False, False],
     [True, False, False],
     [True, False, False],
     [False, True, True],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [False, False, False]]],
   [[2, True, False, False],
    [2, True, False, False],
    [2, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False]]],
  ['regression: scenario 2',
   [3,
    32766,
    [[True, True, False],
     [False, False, False],
     [True, True, False],
     [False, False, True],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, False]]],
   [[32766, True, False, False],
    [32766, True, False, False],
    [32766, True, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['regression: scenario 3',
   [0,
    32766,
    [[True, True, False],
     [True, True, False],
     [False, True, False],
     [True, True, False],
     [True, False, False],
     [False, True, True],
     [True, False, False],
     [True, False, False],
     [True, True, False],
     [False, False, False],
     [True, False, False]]],
   [[32766, True, False, False],
    [32766, True, False, False],
    [32766, True, False, False],
    [32767, True, False, False],
    [32767, True, False, False],
    [0, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [1, True, False, False]]]],
 [['regression: scenario 2',
   [2,
    0,
    [[True, False, False],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, False],
     [False, False, False],
     [True, True, False]]],
   [[1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['regression: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['control: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['regression: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: scenario 1',
   [2,
    -32767,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [False, True, False],
     [False, False, False],
     [True, False, False],
     [True, False, False]]],
   [[-32766, False, False, False],
    [-32766, False, False, False],
    [-32766, False, False, False],
    [-32766, False, False, False],
    [-32767, False, False, False],
    [-32767, False, False, False],
    [-32766, False, False, False],
    [-32766, False, False, False]]],
  ['regression: scenario 3',
   [-1,
    32765,
    [[False, False, False],
     [False, False, True],
     [True, False, False],
     [False, False, False],
     [True, True, False],
     [True, False, False]]],
   [[32765, True, False, False],
    [0, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False]]]],
 [['regression: scenario 3',
   [0,
    32767,
    [[False, False, False],
     [False, False, False],
     [True, True, False],
     [True, False, True],
     [False, False, False],
     [False, False, False],
     [False, True, False],
     [False, False, False],
     [False, True, False],
     [True, False, False],
     [True, False, False],
     [False, True, False],
     [False, False, False],
     [False, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [32767, True, True, True],
    [0, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [-1, False, False, False],
    [-1, False, False, False],
    [-2, False, False, False],
    [-1, False, False, False],
    [-1, False, False, False],
    [-2, False, False, False],
    [-2, False, False, False],
    [-2, False, False, False]]],
  ['regression: scenario 1',
   [3,
    32765,
    [[True, False, True],
     [True, False, False],
     [True, False, True],
     [False, True, False],
     [True, False, False],
     [True, True, True],
     [False, True, False],
     [False, False, False],
     [True, True, False],
     [False, True, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [-1, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [2, False, False, False],
    [1, False, False, False]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['control: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['regression: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['regression: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['regression: scenario 2',
   [0,
    32765,
    [[False, False, False],
     [False, True, True],
     [True, False, False],
     [True, True, False],
     [False, False, False],
     [False, True, False],
     [True, False, False],
     [True, False, True],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, False]]],
   [[32765, True, False, False],
    [0, True, False, False],
    [1, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [-1, False, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [-1, False, False, False],
    [-1, False, False, False]]]],
 [['regression: scenario 8',
   [2,
    32767,
    [[False, False, False],
     [True, True, False],
     [True, False, False],
     [False, True, False],
     [False, True, False],
     [False, False, True]]],
   [[32767, True, False, False],
    [32767, True, True, True],
    [32767, True, True, True],
    [32766, True, True, True],
    [32766, True, True, True],
    [0, False, False, False]]],
  ['regression: scenario 2',
   [32767,
    -2,
    [[False, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [True, True, False],
     [False, False, False],
     [False, False, False],
     [False, True, False],
     [True, True, False]]],
   [[-2, False, False, False],
    [-1, False, False, False],
    [-1, False, False, False],
    [-1, False, False, False],
    [-2, False, False, False],
    [-2, False, False, False],
    [-2, False, False, False],
    [-3, False, False, False],
    [-2, False, False, False]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['control: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['regression: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['regression: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['regression: scenario 1',
   [32767,
    32766,
    [[False, False, False],
     [True, True, False],
     [False, True, True],
     [True, True, False],
     [False, True, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, True, True],
     [True, False, False],
     [False, False, False],
     [False, False, False]]],
   [[32766, False, False, False],
    [32766, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [2, False, False, False],
    [2, False, False, False],
    [2, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False]]]],
 [['regression: scenario 9',
   [0,
    1,
    [[True, False, False],
     [False, True, False],
     [True, False, False],
     [True, False, False],
     [False, True, False],
     [False, False, False],
     [True, True, False],
     [True, False, False],
     [True, True, False],
     [True, False, False],
     [True, True, False]]],
   [[2, True, False, False],
    [1, True, False, False],
    [2, True, False, False],
    [2, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [-1, False, False, False]]],
  ['regression: scenario 4',
   [3,
    1,
    [[True, False, False],
     [False, False, False],
     [False, True, False],
     [False, True, True],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, True, False]]],
   [[2, False, False, False],
    [2, False, False, False],
    [1, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [2, False, False, False],
    [1, False, False, False]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['control: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['regression: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['regression: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['regression: scenario 1',
   [0,
    -2,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, False],
     [False, False, True],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, True, False],
     [False, False, False],
     [True, False, False]]],
   [[-1, False, False, False],
    [-1, False, False, False],
    [0, True, False, False],
    [-1, False, False, False],
    [-1, False, False, False],
    [0, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [1, True, False, False]]]]]
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)

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(preset, start, scans):
    acc = start
    ov = False
    un = False
    pcu = False
    pcd = False
    out = []
    for cu, cd, res in scans:
        cu = bool(cu)
        cd = bool(cd)
        if cu and not pcu:
            acc += 1
            if acc > 32767:
                acc = -32768
                ov = True
        if cd and not pcd and not cu:
            acc -= 1
            if acc < -32768:
                acc = 32767
                un = True
        pcu = cu
        pcd = cd
        if res:
            acc = 0
            ov = False
            un = False
        out.append([acc, acc >= preset, ov, un])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['regression: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['control: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['control: scenario 1',
   [0,
    1,
    [[True, False, False],
     [True, False, False],
     [True, False, False],
     [False, True, True],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [False, False, False]]],
   [[2, True, False, False],
    [2, True, False, False],
    [2, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False]]],
  ['regression: scenario 2',
   [3,
    32766,
    [[True, True, False],
     [False, False, False],
     [True, True, False],
     [False, False, True],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, False]]],
   [[32766, True, False, False],
    [32766, True, False, False],
    [32766, True, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['regression: scenario 3',
   [0,
    32766,
    [[True, True, False],
     [True, True, False],
     [False, True, False],
     [True, True, False],
     [True, False, False],
     [False, True, True],
     [True, False, False],
     [True, False, False],
     [True, True, False],
     [False, False, False],
     [True, False, False]]],
   [[32766, True, False, False],
    [32766, True, False, False],
    [32766, True, False, False],
    [32767, True, False, False],
    [32767, True, False, False],
    [0, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [1, True, False, False]]]],
 [['regression: scenario 2',
   [2,
    0,
    [[True, False, False],
     [False, False, False],
     [True, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, False],
     [False, False, False],
     [True, True, False]]],
   [[1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['regression: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['control: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['regression: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['control: scenario 1',
   [2,
    -32767,
    [[True, False, False],
     [True, False, False],
     [False, False, False],
     [False, False, False],
     [False, True, False],
     [False, False, False],
     [True, False, False],
     [True, False, False]]],
   [[-32766, False, False, False],
    [-32766, False, False, False],
    [-32766, False, False, False],
    [-32766, False, False, False],
    [-32767, False, False, False],
    [-32767, False, False, False],
    [-32766, False, False, False],
    [-32766, False, False, False]]],
  ['regression: scenario 3',
   [-1,
    32765,
    [[False, False, False],
     [False, False, True],
     [True, False, False],
     [False, False, False],
     [True, True, False],
     [True, False, False]]],
   [[32765, True, False, False],
    [0, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False]]]],
 [['regression: scenario 3',
   [0,
    32767,
    [[False, False, False],
     [False, False, False],
     [True, True, False],
     [True, False, True],
     [False, False, False],
     [False, False, False],
     [False, True, False],
     [False, False, False],
     [False, True, False],
     [True, False, False],
     [True, False, False],
     [False, True, False],
     [False, False, False],
     [False, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [32767, True, True, True],
    [0, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [-1, False, False, False],
    [-1, False, False, False],
    [-2, False, False, False],
    [-1, False, False, False],
    [-1, False, False, False],
    [-2, False, False, False],
    [-2, False, False, False],
    [-2, False, False, False]]],
  ['regression: scenario 1',
   [3,
    32765,
    [[True, False, True],
     [True, False, False],
     [True, False, True],
     [False, True, False],
     [True, False, False],
     [True, True, True],
     [False, True, False],
     [False, False, False],
     [True, True, False],
     [False, True, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [-1, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [2, False, False, False],
    [1, False, False, False]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['control: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['regression: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['regression: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['regression: scenario 2',
   [0,
    32765,
    [[False, False, False],
     [False, True, True],
     [True, False, False],
     [True, True, False],
     [False, False, False],
     [False, True, False],
     [True, False, False],
     [True, False, True],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, False]]],
   [[32765, True, False, False],
    [0, True, False, False],
    [1, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [-1, False, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [-1, False, False, False],
    [-1, False, False, False]]]],
 [['regression: scenario 8',
   [2,
    32767,
    [[False, False, False],
     [True, True, False],
     [True, False, False],
     [False, True, False],
     [False, True, False],
     [False, False, True]]],
   [[32767, True, False, False],
    [32767, True, True, True],
    [32767, True, True, True],
    [32766, True, True, True],
    [32766, True, True, True],
    [0, False, False, False]]],
  ['regression: scenario 2',
   [32767,
    -2,
    [[False, False, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [True, True, False],
     [False, False, False],
     [False, False, False],
     [False, True, False],
     [True, True, False]]],
   [[-2, False, False, False],
    [-1, False, False, False],
    [-1, False, False, False],
    [-1, False, False, False],
    [-2, False, False, False],
    [-2, False, False, False],
    [-2, False, False, False],
    [-3, False, False, False],
    [-2, False, False, False]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['control: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['regression: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['regression: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['regression: scenario 1',
   [32767,
    32766,
    [[False, False, False],
     [True, True, False],
     [False, True, True],
     [True, True, False],
     [False, True, False],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, True, True],
     [True, False, False],
     [False, False, False],
     [False, False, False]]],
   [[32766, False, False, False],
    [32766, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [2, False, False, False],
    [2, False, False, False],
    [2, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [1, False, False, False]]]],
 [['regression: scenario 9',
   [0,
    1,
    [[True, False, False],
     [False, True, False],
     [True, False, False],
     [True, False, False],
     [False, True, False],
     [False, False, False],
     [True, True, False],
     [True, False, False],
     [True, True, False],
     [True, False, False],
     [True, True, False]]],
   [[2, True, False, False],
    [1, True, False, False],
    [2, True, False, False],
    [2, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [-1, False, False, False]]],
  ['regression: scenario 4',
   [3,
    1,
    [[True, False, False],
     [False, False, False],
     [False, True, False],
     [False, True, True],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False],
     [True, True, False]]],
   [[2, False, False, False],
    [2, False, False, False],
    [1, False, False, False],
    [0, False, False, False],
    [0, False, False, False],
    [1, False, False, False],
    [1, False, False, False],
    [2, False, False, False],
    [1, False, False, False]]],
  ['control: held count input',
   [3, 0, [[True, False, False], [True, False, False], [False, False, False], [True, False, False]]],
   [[1, False, False, False], [1, False, False, False], [1, False, False, False], [2, False, False, False]]],
  ['control: overflow wrap',
   [0,
    32766,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [False, False, False],
     [True, False, False]]],
   [[32767, True, False, False],
    [32767, True, False, False],
    [-32768, False, True, False],
    [-32768, False, True, False],
    [-32767, False, True, False]]],
  ['control: underflow then reset',
   [0,
    -32767,
    [[False, True, False],
     [False, False, False],
     [False, True, False],
     [False, False, True],
     [False, False, False]]],
   [[-32768, False, False, False],
    [-32768, False, False, False],
    [32767, True, False, True],
    [0, True, False, False],
    [0, True, False, False]]],
  ['regression: simultaneous edges',
   [1,
    0,
    [[True, True, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [False, True, False]]],
   [[0, False, False, False],
    [0, False, False, False],
    [1, True, False, False],
    [0, False, False, False],
    [0, False, False, False]]],
  ['regression: count down while up held',
   [0, 5, [[True, False, False], [True, True, False], [True, False, False], [True, True, False]]],
   [[6, True, False, False], [5, True, False, False], [5, True, False, False], [4, True, False, False]]],
  ['regression: scenario 1',
   [0,
    -2,
    [[True, False, False],
     [False, False, False],
     [True, False, False],
     [True, True, False],
     [True, False, False],
     [False, False, True],
     [True, False, False],
     [True, False, False],
     [True, False, False],
     [False, True, False],
     [False, False, False],
     [True, False, False]]],
   [[-1, False, False, False],
    [-1, False, False, False],
    [0, True, False, False],
    [-1, False, False, False],
    [-1, False, False, False],
    [0, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [1, True, False, False],
    [0, True, False, False],
    [0, True, False, False],
    [1, True, False, False]]]]]
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)

prompt:
Coincident CU and CD edges net +1 instead of cancelling.

Up/down counter pair sharing one 16-bit signed accumulator, evaluated per scan; scans is a list of [cu, cd, res]. CU counts on its rising edge and CD on its own rising edge (both in one scan cancel). Incrementing 32767 wraps to -32768 and latches OV; decrementing -32768 wraps to 32767 and latches UN. A later RES rung clears ACC, OV and UN but not the edge memories. DN is ACC >= preset. Return [ACC, DN, OV, UN] per scan.

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(rungs, scans):
    phys = {}
    table = {}
    out = []
    for start, mid in scans:
        for tag, val in start:
            phys[tag] = bool(val)
        image = phys
        for i, (coil, branches) in enumerate(rungs):
            for at, tag, val in mid:
                if at == i:
                    phys[tag] = bool(val)
            def read(tag):
                if tag.startswith('I:'):
                    return image.get(tag, False)
                return table.get(tag, False)
            power = any(all(read(t) if k == 'XIC' else not read(t) for k, t in br) for br in branches)
            table[coil] = power
        out.append(sorted(t for t, v in table.items() if v and t.startswith('O:')))
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['regression: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['regression: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['regression: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['regression: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]],
  ['control: scenario 1',
   [[['O:0', [[['XIC', 'I:1'], ['XIC', 'O:0'], ['XIC', 'I:1']], [['XIO', 'O:0']]]],
     ['B:0', [[['XIO', 'I:0'], ['XIO', 'B:1'], ['XIC', 'O:0']], [['XIC', 'I:2'], ['XIC', 'I:2']]]],
     ['O:1', [[['XIC', 'O:2'], ['XIC', 'I:0'], ['XIC', 'O:0']]]],
     ['O:1',
      [[['XIO', 'O:1'], ['XIC', 'B:0'], ['XIC', 'B:0']], [['XIC', 'O:1'], ['XIC', 'B:0'], ['XIC', 'O:2']]]],
     ['O:1',
      [[['XIC', 'I:0'], ['XIO', 'I:0'], ['XIO', 'O:0']], [['XIC', 'O:2'], ['XIC', 'I:1'], ['XIO', 'B:0']]]]],
    [[[['I:0', True], ['I:1', False]], [[1, 'I:2', True]]],
     [[['I:2', True]], []],
     [[['I:2', True]], [[0, 'I:2', True]]],
     [[['I:0', True], ['I:2', False]], [[4, 'I:2', False], [4, 'I:2', True]]]]],
   [['O:0'], [], ['O:0'], []]],
  ['control: scenario 2',
   [[['O:1', [[['XIC', 'O:2'], ['XIO', 'O:0'], ['XIO', 'O:0']]]],
     ['O:0', [[['XIC', 'B:1'], ['XIC', 'O:0']]]],
     ['B:0', [[['XIC', 'O:2']], [['XIC', 'O:0']]]]],
    [[[['I:0', True], ['I:2', False]], []],
     [[['I:0', False], ['I:1', True], ['I:2', False]], []],
     [[['I:0', True]], []],
     [[['I:2', False]], [[0, 'I:2', False]]],
     [[['I:0', True], ['I:1', False], ['I:2', True]], [[1, 'I:0', False], [1, 'I:1', True]]],
     [[['I:1', False]], [[2, 'I:2', True], [0, 'I:2', True]]]]],
   [[], [], [], [], [], []]]],
 [['regression: scenario 1',
   [[['B:0', [[['XIO', 'I:1'], ['XIC', 'O:0'], ['XIC', 'O:2']]]],
     ['O:1', [[['XIC', 'O:1'], ['XIO', 'B:0'], ['XIO', 'B:0']]]],
     ['O:2', [[['XIC', 'O:2'], ['XIC', 'I:2'], ['XIC', 'I:1']], [['XIC', 'O:2'], ['XIC', 'O:0']]]],
     ['O:1', [[['XIC', 'I:0']], [['XIC', 'I:2'], ['XIO', 'I:0']]]]],
    [[[['I:2', False]], []],
     [[['I:0', False], ['I:2', False]], [[0, 'I:1', True]]],
     [[['I:0', False], ['I:1', True]], [[3, 'I:0', True], [0, 'I:0', True]]],
     [[['I:0', False]], [[3, 'I:0', False], [2, 'I:2', False]]],
     [[['I:0', True], ['I:1', True], ['I:2', False]], [[3, 'I:0', True]]],
     [[['I:2', True]], []]]],
   [[], [], [], [], ['O:1'], ['O:1']]],
  ['regression: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['regression: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['regression: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['regression: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['regression: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]],
  ['control: scenario 2',
   [[['B:1', [[['XIC', 'O:0'], ['XIC', 'I:2']], [['XIC', 'I:2'], ['XIC', 'B:0'], ['XIC', 'I:1']]]],
     ['B:1', [[['XIC', 'O:2']]]],
     ['O:0', [[['XIC', 'O:2']]]],
     ['B:1', [[['XIO', 'O:0']], [['XIC', 'I:0'], ['XIC', 'O:2'], ['XIO', 'O:1']]]]],
    [[[], [[2, 'I:2', True]]],
     [[['I:2', True]], []],
     [[['I:0', True], ['I:2', False]], [[2, 'I:1', False], [3, 'I:1', False]]],
     [[['I:1', True], ['I:2', False]], []]]],
   [[], [], [], []]]],
 [['regression: scenario 6',
   [[['O:1', [[['XIC', 'O:2'], ['XIC', 'O:0'], ['XIC', 'I:0']], [['XIC', 'O:0'], ['XIC', 'I:2']]]],
     ['O:1', [[['XIC', 'I:0'], ['XIC', 'I:1']], [['XIO', 'I:1']]]],
     ['B:0', [[['XIO', 'I:2'], ['XIO', 'B:1'], ['XIC', 'B:1']]]]],
    [[[], [[0, 'I:2', False], [1, 'I:1', True]]],
     [[], [[2, 'I:2', False], [1, 'I:2', False]]],
     [[['I:0', False], ['I:1', True], ['I:2', False]], [[0, 'I:2', True]]]]],
   [['O:1'], [], []]],
  ['regression: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['regression: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['regression: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['regression: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['regression: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]],
  ['control: scenario 1',
   [[['O:1', [[['XIC', 'O:2'], ['XIO', 'O:0']], [['XIO', 'I:1']]]],
     ['O:1', [[['XIC', 'I:0'], ['XIC', 'O:1']], [['XIO', 'I:1'], ['XIC', 'O:0']]]],
     ['B:0', [[['XIC', 'B:0'], ['XIC', 'B:0']]]]],
    [[[['I:0', False], ['I:1', True], ['I:2', False]], []],
     [[['I:0', True], ['I:1', True], ['I:2', True]], [[0, 'I:2', False]]],
     [[['I:1', True], ['I:2', False]], []],
     [[['I:0', False], ['I:1', False]], [[2, 'I:2', True]]],
     [[['I:0', False]], [[1, 'I:2', False], [2, 'I:2', True]]]]],
   [[], [], [], [], []]]],
 [['regression: scenario 10',
   [[['B:1', [[['XIC', 'I:2'], ['XIC', 'B:1'], ['XIO', 'B:1']], [['XIO', 'B:1']]]],
     ['B:0', [[['XIC', 'I:1'], ['XIC', 'B:1'], ['XIC', 'O:2']], [['XIC', 'I:1'], ['XIO', 'O:1']]]],
     ['O:2', [[['XIC', 'B:1']]]],
     ['B:1', [[['XIC', 'B:1'], ['XIO', 'B:0']], [['XIC', 'I:0'], ['XIC', 'I:0']]]],
     ['B:0', [[['XIC', 'O:0']], [['XIC', 'I:1'], ['XIO', 'O:0']]]]],
    [[[['I:1', True]], [[1, 'I:1', False]]],
     [[['I:1', False], ['I:2', False]], [[4, 'I:0', False]]],
     [[['I:0', True], ['I:1', True], ['I:2', True]], [[0, 'I:1', True], [4, 'I:0', True]]],
     [[['I:0', True]], [[3, 'I:1', True]]],
     [[['I:0', True], ['I:2', False]], [[3, 'I:0', True], [2, 'I:1', False]]]]],
   [['O:2'], ['O:2'], [], [], []]],
  ['regression: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['regression: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['regression: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['regression: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['regression: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]],
  ['control: scenario 1',
   [[['O:0', [[['XIC', 'O:1'], ['XIO', 'O:1'], ['XIC', 'O:0']]]],
     ['O:2', [[['XIC', 'I:2'], ['XIO', 'O:0'], ['XIC', 'I:0']]]],
     ['O:1', [[['XIC', 'O:2'], ['XIO', 'I:1']]]]],
    [[[['I:0', False], ['I:1', False], ['I:2', True]], []],
     [[['I:0', True], ['I:1', False], ['I:2', False]], [[1, 'I:0', False]]],
     [[['I:0', False], ['I:1', True]], [[2, 'I:2', True], [0, 'I:1', False]]],
     [[['I:1', False]], [[1, 'I:1', False], [1, 'I:0', False]]]]],
   [[], [], [], []]]],
 [['regression: scenario 26',
   [[['O:2', [[['XIO', 'I:2']], [['XIO', 'I:0'], ['XIC', 'I:2'], ['XIO', 'O:1']]]],
     ['O:1', [[['XIC', 'I:1'], ['XIC', 'O:0']]]],
     ['O:1', [[['XIO', 'O:1'], ['XIO', 'I:2'], ['XIO', 'I:2']]]],
     ['B:1', [[['XIO', 'I:0'], ['XIO', 'I:2']], [['XIO', 'O:0'], ['XIO', 'I:1']]]]],
    [[[['I:0', False], ['I:1', False]], [[1, 'I:2', False]]],
     [[['I:0', True], ['I:1', False], ['I:2', False]], []],
     [[['I:0', False]], [[2, 'I:1', False], [0, 'I:1', False]]],
     [[['I:0', False], ['I:1', False], ['I:2', True]], [[0, 'I:2', True]]],
     [[['I:1', True], ['I:2', True]], []],
     [[['I:1', True]], [[1, 'I:2', False], [2, 'I:2', False]]]]],
   [['O:1', 'O:2'], ['O:1', 'O:2'], ['O:1', 'O:2'], [], ['O:2'], ['O:2']]],
  ['regression: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]],
  ['regression: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['regression: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['regression: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['regression: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['regression: scenario 1',
   [[['B:0', [[['XIO', 'I:0']], [['XIO', 'I:0'], ['XIC', 'O:2'], ['XIC', 'B:0']]]],
     ['O:1', [[['XIO', 'I:2']]]],
     ['O:2', [[['XIC', 'B:0']], [['XIO', 'O:2']]]],
     ['B:1', [[['XIC', 'B:0']], [['XIC', 'B:0'], ['XIC', 'I:0'], ['XIC', 'B:0']]]]],
    [[[['I:0', False], ['I:1', True], ['I:2', True]], [[2, 'I:0', False]]],
     [[['I:1', False], ['I:2', False]], [[2, 'I:1', False], [2, 'I:1', False]]],
     [[['I:0', False], ['I:1', True], ['I:2', False]], [[0, 'I:1', False], [3, 'I:1', False]]],
     [[['I:0', False], ['I:1', True]], [[0, 'I:2', True], [3, 'I:2', True]]],
     [[], [[2, 'I:2', False]]],
     [[['I:0', False], ['I:1', False], ['I:2', False]], [[3, 'I:0', True], [2, 'I:2', True]]]]],
   [['O:2'], ['O:1', 'O:2'], ['O:1', 'O:2'], ['O:1', 'O:2'], ['O:2'], ['O:1', 'O:2']]]]]
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)

meaning: Fixture-count band, not measured model difficulty

deps: stdlib

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(rungs, scans):
    phys = {}
    table = {}
    image = {}
    out = []
    for start, mid in scans:
        for tag, val in start:
            phys[tag] = bool(val)
        for i, (coil, branches) in enumerate(rungs):
            for at, tag, val in mid:
                if at == i:
                    phys[tag] = bool(val)
            def read(tag):
                if tag.startswith('I:'):
                    return image.get(tag, False)
                return table.get(tag, False)
            power = any(all(read(t) if k == 'XIC' else not read(t) for k, t in br) for br in branches)
            table[coil] = power
        image = dict(phys)
        out.append(sorted(t for t, v in table.items() if v and t.startswith('O:')))
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['regression: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['regression: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['regression: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['regression: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]],
  ['control: scenario 1',
   [[['O:0', [[['XIC', 'I:1'], ['XIC', 'O:0'], ['XIC', 'I:1']], [['XIO', 'O:0']]]],
     ['B:0', [[['XIO', 'I:0'], ['XIO', 'B:1'], ['XIC', 'O:0']], [['XIC', 'I:2'], ['XIC', 'I:2']]]],
     ['O:1', [[['XIC', 'O:2'], ['XIC', 'I:0'], ['XIC', 'O:0']]]],
     ['O:1',
      [[['XIO', 'O:1'], ['XIC', 'B:0'], ['XIC', 'B:0']], [['XIC', 'O:1'], ['XIC', 'B:0'], ['XIC', 'O:2']]]],
     ['O:1',
      [[['XIC', 'I:0'], ['XIO', 'I:0'], ['XIO', 'O:0']], [['XIC', 'O:2'], ['XIC', 'I:1'], ['XIO', 'B:0']]]]],
    [[[['I:0', True], ['I:1', False]], [[1, 'I:2', True]]],
     [[['I:2', True]], []],
     [[['I:2', True]], [[0, 'I:2', True]]],
     [[['I:0', True], ['I:2', False]], [[4, 'I:2', False], [4, 'I:2', True]]]]],
   [['O:0'], [], ['O:0'], []]],
  ['control: scenario 2',
   [[['O:1', [[['XIC', 'O:2'], ['XIO', 'O:0'], ['XIO', 'O:0']]]],
     ['O:0', [[['XIC', 'B:1'], ['XIC', 'O:0']]]],
     ['B:0', [[['XIC', 'O:2']], [['XIC', 'O:0']]]]],
    [[[['I:0', True], ['I:2', False]], []],
     [[['I:0', False], ['I:1', True], ['I:2', False]], []],
     [[['I:0', True]], []],
     [[['I:2', False]], [[0, 'I:2', False]]],
     [[['I:0', True], ['I:1', False], ['I:2', True]], [[1, 'I:0', False], [1, 'I:1', True]]],
     [[['I:1', False]], [[2, 'I:2', True], [0, 'I:2', True]]]]],
   [[], [], [], [], [], []]]],
 [['regression: scenario 1',
   [[['B:0', [[['XIO', 'I:1'], ['XIC', 'O:0'], ['XIC', 'O:2']]]],
     ['O:1', [[['XIC', 'O:1'], ['XIO', 'B:0'], ['XIO', 'B:0']]]],
     ['O:2', [[['XIC', 'O:2'], ['XIC', 'I:2'], ['XIC', 'I:1']], [['XIC', 'O:2'], ['XIC', 'O:0']]]],
     ['O:1', [[['XIC', 'I:0']], [['XIC', 'I:2'], ['XIO', 'I:0']]]]],
    [[[['I:2', False]], []],
     [[['I:0', False], ['I:2', False]], [[0, 'I:1', True]]],
     [[['I:0', False], ['I:1', True]], [[3, 'I:0', True], [0, 'I:0', True]]],
     [[['I:0', False]], [[3, 'I:0', False], [2, 'I:2', False]]],
     [[['I:0', True], ['I:1', True], ['I:2', False]], [[3, 'I:0', True]]],
     [[['I:2', True]], []]]],
   [[], [], [], [], ['O:1'], ['O:1']]],
  ['regression: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['regression: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['regression: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['regression: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['regression: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]],
  ['control: scenario 2',
   [[['B:1', [[['XIC', 'O:0'], ['XIC', 'I:2']], [['XIC', 'I:2'], ['XIC', 'B:0'], ['XIC', 'I:1']]]],
     ['B:1', [[['XIC', 'O:2']]]],
     ['O:0', [[['XIC', 'O:2']]]],
     ['B:1', [[['XIO', 'O:0']], [['XIC', 'I:0'], ['XIC', 'O:2'], ['XIO', 'O:1']]]]],
    [[[], [[2, 'I:2', True]]],
     [[['I:2', True]], []],
     [[['I:0', True], ['I:2', False]], [[2, 'I:1', False], [3, 'I:1', False]]],
     [[['I:1', True], ['I:2', False]], []]]],
   [[], [], [], []]]],
 [['regression: scenario 6',
   [[['O:1', [[['XIC', 'O:2'], ['XIC', 'O:0'], ['XIC', 'I:0']], [['XIC', 'O:0'], ['XIC', 'I:2']]]],
     ['O:1', [[['XIC', 'I:0'], ['XIC', 'I:1']], [['XIO', 'I:1']]]],
     ['B:0', [[['XIO', 'I:2'], ['XIO', 'B:1'], ['XIC', 'B:1']]]]],
    [[[], [[0, 'I:2', False], [1, 'I:1', True]]],
     [[], [[2, 'I:2', False], [1, 'I:2', False]]],
     [[['I:0', False], ['I:1', True], ['I:2', False]], [[0, 'I:2', True]]]]],
   [['O:1'], [], []]],
  ['regression: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['regression: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['regression: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['regression: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['regression: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]],
  ['control: scenario 1',
   [[['O:1', [[['XIC', 'O:2'], ['XIO', 'O:0']], [['XIO', 'I:1']]]],
     ['O:1', [[['XIC', 'I:0'], ['XIC', 'O:1']], [['XIO', 'I:1'], ['XIC', 'O:0']]]],
     ['B:0', [[['XIC', 'B:0'], ['XIC', 'B:0']]]]],
    [[[['I:0', False], ['I:1', True], ['I:2', False]], []],
     [[['I:0', True], ['I:1', True], ['I:2', True]], [[0, 'I:2', False]]],
     [[['I:1', True], ['I:2', False]], []],
     [[['I:0', False], ['I:1', False]], [[2, 'I:2', True]]],
     [[['I:0', False]], [[1, 'I:2', False], [2, 'I:2', True]]]]],
   [[], [], [], [], []]]],
 [['regression: scenario 10',
   [[['B:1', [[['XIC', 'I:2'], ['XIC', 'B:1'], ['XIO', 'B:1']], [['XIO', 'B:1']]]],
     ['B:0', [[['XIC', 'I:1'], ['XIC', 'B:1'], ['XIC', 'O:2']], [['XIC', 'I:1'], ['XIO', 'O:1']]]],
     ['O:2', [[['XIC', 'B:1']]]],
     ['B:1', [[['XIC', 'B:1'], ['XIO', 'B:0']], [['XIC', 'I:0'], ['XIC', 'I:0']]]],
     ['B:0', [[['XIC', 'O:0']], [['XIC', 'I:1'], ['XIO', 'O:0']]]]],
    [[[['I:1', True]], [[1, 'I:1', False]]],
     [[['I:1', False], ['I:2', False]], [[4, 'I:0', False]]],
     [[['I:0', True], ['I:1', True], ['I:2', True]], [[0, 'I:1', True], [4, 'I:0', True]]],
     [[['I:0', True]], [[3, 'I:1', True]]],
     [[['I:0', True], ['I:2', False]], [[3, 'I:0', True], [2, 'I:1', False]]]]],
   [['O:2'], ['O:2'], [], [], []]],
  ['regression: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['regression: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['regression: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['regression: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['regression: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]],
  ['control: scenario 1',
   [[['O:0', [[['XIC', 'O:1'], ['XIO', 'O:1'], ['XIC', 'O:0']]]],
     ['O:2', [[['XIC', 'I:2'], ['XIO', 'O:0'], ['XIC', 'I:0']]]],
     ['O:1', [[['XIC', 'O:2'], ['XIO', 'I:1']]]]],
    [[[['I:0', False], ['I:1', False], ['I:2', True]], []],
     [[['I:0', True], ['I:1', False], ['I:2', False]], [[1, 'I:0', False]]],
     [[['I:0', False], ['I:1', True]], [[2, 'I:2', True], [0, 'I:1', False]]],
     [[['I:1', False]], [[1, 'I:1', False], [1, 'I:0', False]]]]],
   [[], [], [], []]]],
 [['regression: scenario 26',
   [[['O:2', [[['XIO', 'I:2']], [['XIO', 'I:0'], ['XIC', 'I:2'], ['XIO', 'O:1']]]],
     ['O:1', [[['XIC', 'I:1'], ['XIC', 'O:0']]]],
     ['O:1', [[['XIO', 'O:1'], ['XIO', 'I:2'], ['XIO', 'I:2']]]],
     ['B:1', [[['XIO', 'I:0'], ['XIO', 'I:2']], [['XIO', 'O:0'], ['XIO', 'I:1']]]]],
    [[[['I:0', False], ['I:1', False]], [[1, 'I:2', False]]],
     [[['I:0', True], ['I:1', False], ['I:2', False]], []],
     [[['I:0', False]], [[2, 'I:1', False], [0, 'I:1', False]]],
     [[['I:0', False], ['I:1', False], ['I:2', True]], [[0, 'I:2', True]]],
     [[['I:1', True], ['I:2', True]], []],
     [[['I:1', True]], [[1, 'I:2', False], [2, 'I:2', False]]]]],
   [['O:1', 'O:2'], ['O:1', 'O:2'], ['O:1', 'O:2'], [], ['O:2'], ['O:2']]],
  ['regression: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]],
  ['regression: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['regression: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['regression: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['regression: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['regression: scenario 1',
   [[['B:0', [[['XIO', 'I:0']], [['XIO', 'I:0'], ['XIC', 'O:2'], ['XIC', 'B:0']]]],
     ['O:1', [[['XIO', 'I:2']]]],
     ['O:2', [[['XIC', 'B:0']], [['XIO', 'O:2']]]],
     ['B:1', [[['XIC', 'B:0']], [['XIC', 'B:0'], ['XIC', 'I:0'], ['XIC', 'B:0']]]]],
    [[[['I:0', False], ['I:1', True], ['I:2', True]], [[2, 'I:0', False]]],
     [[['I:1', False], ['I:2', False]], [[2, 'I:1', False], [2, 'I:1', False]]],
     [[['I:0', False], ['I:1', True], ['I:2', False]], [[0, 'I:1', False], [3, 'I:1', False]]],
     [[['I:0', False], ['I:1', True]], [[0, 'I:2', True], [3, 'I:2', True]]],
     [[], [[2, 'I:2', False]]],
     [[['I:0', False], ['I:1', False], ['I:2', False]], [[3, 'I:0', True], [2, 'I:2', True]]]]],
   [['O:2'], ['O:1', 'O:2'], ['O:1', 'O:2'], ['O:1', 'O:2'], ['O:2'], ['O:1', 'O:2']]]]]
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)

prompt:
Two rungs examining the same input disagree within one scan when the field signal changes mid-scan.

Ladder program scan. rungs is a list of [coil, branches]; a branch is a series list of [XIC|XIO, tag] contacts and the rung is true if any branch is fully true. Each scan item is [start_changes, mid_changes]: start_changes [[tag, value]] update physical inputs before the input scan; the input image is then frozen for the program scan. mid_changes [[rung_index, tag, value]] change physical inputs just before that rung executes and are only seen by the next input scan. Non-input tags are read from the data table, where earlier rungs of the same scan have already written their coils (last OTE wins). Missing tags read false. Return the sorted energized O: tags after each scan.

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(rungs, scans):
    phys = {}
    table = {}
    out = []
    for start, mid in scans:
        for tag, val in start:
            phys[tag] = bool(val)
        image = dict(phys)
        snap = dict(table)
        for i, (coil, branches) in enumerate(rungs):
            for at, tag, val in mid:
                if at == i:
                    phys[tag] = bool(val)
            def read(tag):
                if tag.startswith('I:'):
                    return image.get(tag, False)
                return snap.get(tag, False)
            power = any(all(read(t) if k == 'XIC' else not read(t) for k, t in br) for br in branches)
            table[coil] = power
        out.append(sorted(t for t, v in table.items() if v and t.startswith('O:')))
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['regression: scenario 15',
   [[['O:2', [[['XIC', 'B:1'], ['XIC', 'I:1']]]],
     ['O:1', [[['XIC', 'O:0'], ['XIC', 'B:0']], [['XIC', 'I:1']]]],
     ['O:1',
      [[['XIC', 'I:2'], ['XIO', 'B:1'], ['XIC', 'O:1']], [['XIO', 'B:0'], ['XIO', 'I:0'], ['XIC', 'O:0']]]]],
    [[[['I:0', False], ['I:1', False], ['I:2', False]], [[0, 'I:1', False], [1, 'I:2', True]]],
     [[['I:0', False], ['I:1', True]], []],
     [[['I:0', False], ['I:2', True]], []],
     [[['I:0', True], ['I:1', False], ['I:2', False]], []],
     [[['I:0', True], ['I:1', False], ['I:2', False]], []],
     [[['I:1', False], ['I:2', True]], [[2, 'I:2', False]]]]],
   [[], ['O:1'], ['O:1'], [], [], []]],
  ['control: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['control: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['control: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['control: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['control: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]],
  ['control: scenario 1',
   [[['O:0', [[['XIC', 'I:1'], ['XIC', 'O:0'], ['XIC', 'I:1']], [['XIO', 'O:0']]]],
     ['B:0', [[['XIO', 'I:0'], ['XIO', 'B:1'], ['XIC', 'O:0']], [['XIC', 'I:2'], ['XIC', 'I:2']]]],
     ['O:1', [[['XIC', 'O:2'], ['XIC', 'I:0'], ['XIC', 'O:0']]]],
     ['O:1',
      [[['XIO', 'O:1'], ['XIC', 'B:0'], ['XIC', 'B:0']], [['XIC', 'O:1'], ['XIC', 'B:0'], ['XIC', 'O:2']]]],
     ['O:1',
      [[['XIC', 'I:0'], ['XIO', 'I:0'], ['XIO', 'O:0']], [['XIC', 'O:2'], ['XIC', 'I:1'], ['XIO', 'B:0']]]]],
    [[[['I:0', True], ['I:1', False]], [[1, 'I:2', True]]],
     [[['I:2', True]], []],
     [[['I:2', True]], [[0, 'I:2', True]]],
     [[['I:0', True], ['I:2', False]], [[4, 'I:2', False], [4, 'I:2', True]]]]],
   [['O:0'], [], ['O:0'], []]]],
 [['regression: scenario 3',
   [[['O:2', [[['XIO', 'O:1']], [['XIC', 'B:0'], ['XIC', 'I:1']]]],
     ['B:1', [[['XIC', 'O:2'], ['XIC', 'O:2']], [['XIC', 'O:0']]]],
     ['O:1', [[['XIC', 'B:1'], ['XIC', 'B:1']], [['XIC', 'O:1'], ['XIC', 'B:1']]]],
     ['B:0', [[['XIO', 'I:0']], [['XIC', 'I:1']]]]],
    [[[['I:1', False], ['I:2', False]], [[2, 'I:2', False]]],
     [[['I:0', False], ['I:1', False]], []],
     [[], [[2, 'I:1', True], [1, 'I:2', True]]]]],
   [['O:1', 'O:2'], [], ['O:1', 'O:2']]],
  ['regression: scenario 30',
   [[['B:1', [[['XIC', 'O:2']]]],
     ['O:2',
      [[['XIO', 'I:2'], ['XIO', 'O:2'], ['XIO', 'B:1']], [['XIO', 'I:2'], ['XIC', 'O:0'], ['XIC', 'B:1']]]],
     ['O:1', [[['XIC', 'I:1'], ['XIC', 'O:2'], ['XIO', 'O:1']]]]],
    [[[['I:0', True]], []],
     [[['I:1', True]], [[2, 'I:2', True], [1, 'I:0', True]]],
     [[['I:0', False], ['I:1', True], ['I:2', True]], [[2, 'I:0', False], [1, 'I:2', False]]],
     [[['I:1', False], ['I:2', False]], []],
     [[], []],
     [[['I:0', False], ['I:1', True], ['I:2', True]], [[0, 'I:2', True], [1, 'I:0', True]]]]],
   [['O:2'], [], [], ['O:2'], [], []]],
  ['control: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['control: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['control: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['control: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['control: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]]],
 [['regression: scenario 9',
   [[['O:1', [[['XIO', 'I:0'], ['XIC', 'O:1']], [['XIC', 'B:1']]]],
     ['B:1', [[['XIO', 'O:2']]]],
     ['B:0',
      [[['XIC', 'O:2'], ['XIO', 'O:1'], ['XIO', 'B:1']], [['XIO', 'O:2'], ['XIO', 'B:0'], ['XIO', 'O:0']]]],
     ['O:2', [[['XIC', 'B:0'], ['XIO', 'I:0'], ['XIC', 'I:1']], [['XIO', 'B:1'], ['XIC', 'I:2']]]],
     ['O:1', [[['XIO', 'O:2'], ['XIC', 'I:1']], [['XIO', 'B:0'], ['XIC', 'B:1']]]]],
    [[[['I:1', False]], [[1, 'I:0', True], [4, 'I:1', False]]],
     [[['I:1', True], ['I:2', True]], []],
     [[['I:1', False], ['I:2', True]], [[4, 'I:0', True], [2, 'I:0', True]]],
     [[['I:0', True], ['I:1', True], ['I:2', False]], [[2, 'I:1', True], [4, 'I:2', True]]]]],
   [[], ['O:1'], [], ['O:1']]],
  ['regression: scenario 24',
   [[['O:0', [[['XIC', 'O:2'], ['XIC', 'B:0']], [['XIC', 'I:2'], ['XIO', 'I:0']]]],
     ['O:2', [[['XIC', 'B:0']], [['XIC', 'I:1']]]],
     ['O:1', [[['XIC', 'O:2'], ['XIC', 'O:2']]]]],
    [[[['I:2', False]], [[0, 'I:0', False], [2, 'I:2', False]]],
     [[['I:0', True], ['I:1', True], ['I:2', True]], [[2, 'I:2', True], [1, 'I:2', True]]],
     [[['I:0', False], ['I:1', True]], [[1, 'I:2', True], [1, 'I:1', False]]]]],
   [[], ['O:1', 'O:2'], ['O:0', 'O:1', 'O:2']]],
  ['control: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['control: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['control: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['control: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['control: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]]],
 [['regression: scenario 10',
   [[['B:1', [[['XIC', 'I:2'], ['XIC', 'B:1'], ['XIO', 'B:1']], [['XIO', 'B:1']]]],
     ['B:0', [[['XIC', 'I:1'], ['XIC', 'B:1'], ['XIC', 'O:2']], [['XIC', 'I:1'], ['XIO', 'O:1']]]],
     ['O:2', [[['XIC', 'B:1']]]],
     ['B:1', [[['XIC', 'B:1'], ['XIO', 'B:0']], [['XIC', 'I:0'], ['XIC', 'I:0']]]],
     ['B:0', [[['XIC', 'O:0']], [['XIC', 'I:1'], ['XIO', 'O:0']]]]],
    [[[['I:1', True]], [[1, 'I:1', False]]],
     [[['I:1', False], ['I:2', False]], [[4, 'I:0', False]]],
     [[['I:0', True], ['I:1', True], ['I:2', True]], [[0, 'I:1', True], [4, 'I:0', True]]],
     [[['I:0', True]], [[3, 'I:1', True]]],
     [[['I:0', True], ['I:2', False]], [[3, 'I:0', True], [2, 'I:1', False]]]]],
   [['O:2'], ['O:2'], [], [], []]],
  ['regression: scenario 25',
   [[['O:0', [[['XIC', 'I:0'], ['XIC', 'O:0'], ['XIC', 'O:2']], [['XIC', 'O:2'], ['XIC', 'I:1']]]],
     ['O:0', [[['XIC', 'O:0'], ['XIC', 'O:0']]]],
     ['O:0', [[['XIO', 'O:0'], ['XIO', 'I:0']], [['XIC', 'O:2'], ['XIC', 'B:0']]]],
     ['O:2', [[['XIC', 'I:1'], ['XIO', 'O:2']], [['XIO', 'B:0'], ['XIO', 'I:1']]]],
     ['O:1', [[['XIC', 'O:0']], [['XIC', 'I:0'], ['XIC', 'B:1']]]]],
    [[[['I:1', True], ['I:2', True]], [[0, 'I:0', False]]],
     [[['I:0', False], ['I:1', True], ['I:2', True]], [[0, 'I:2', False], [2, 'I:1', True]]],
     [[['I:0', False], ['I:2', False]], [[3, 'I:1', False]]],
     [[], []],
     [[['I:0', True], ['I:2', False]], [[0, 'I:2', False]]],
     [[['I:1', True], ['I:2', True]], [[1, 'I:1', False]]]]],
   [['O:0', 'O:1', 'O:2'], [], ['O:0', 'O:1', 'O:2'], ['O:0', 'O:1', 'O:2'], ['O:2'], []]],
  ['control: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['control: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['control: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['control: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['control: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]]],
 [['regression: scenario 58',
   [[['O:1', [[['XIC', 'I:1']], [['XIC', 'O:1'], ['XIC', 'I:0']]]],
     ['O:0', [[['XIC', 'B:0']], [['XIO', 'I:2']]]],
     ['B:1',
      [[['XIC', 'I:1'], ['XIC', 'I:1'], ['XIC', 'O:0']], [['XIC', 'I:2'], ['XIO', 'O:0'], ['XIC', 'B:0']]]],
     ['O:0', [[['XIC', 'B:1'], ['XIC', 'O:2'], ['XIC', 'O:2']], [['XIC', 'I:2'], ['XIC', 'O:1']]]],
     ['O:2', [[['XIO', 'O:2'], ['XIO', 'I:2']]]]],
    [[[['I:0', True], ['I:1', False]], [[0, 'I:1', True], [0, 'I:0', False]]],
     [[['I:0', True]], [[0, 'I:1', True], [1, 'I:2', True]]],
     [[['I:1', True], ['I:2', False]], []],
     [[['I:1', True]], [[0, 'I:1', True]]]]],
   [['O:2'], ['O:0', 'O:1'], ['O:1', 'O:2'], ['O:0', 'O:1']]],
  ['regression: scenario 53',
   [[['O:2', [[['XIC', 'B:1']], [['XIC', 'O:0']]]],
     ['B:1', [[['XIO', 'I:1'], ['XIO', 'B:0']], [['XIC', 'I:2'], ['XIC', 'O:1']]]],
     ['O:2', [[['XIO', 'O:2']], [['XIC', 'B:1'], ['XIC', 'I:1']]]],
     ['B:1', [[['XIC', 'O:2'], ['XIC', 'O:2']], [['XIC', 'O:2']]]],
     ['O:0', [[['XIC', 'B:0'], ['XIC', 'O:2']], [['XIC', 'O:2'], ['XIO', 'O:1']]]]],
    [[[], [[2, 'I:0', False]]],
     [[['I:0', True], ['I:1', False]], [[3, 'I:2', True]]],
     [[['I:0', False], ['I:1', True], ['I:2', False]], []],
     [[['I:0', False], ['I:2', False]], [[0, 'I:1', False]]],
     [[['I:1', False], ['I:2', False]], []]]],
   [['O:0', 'O:2'], [], ['O:0', 'O:2'], [], ['O:0', 'O:2']]],
  ['control: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['control: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['control: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['control: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['control: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]]]]
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)

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(rungs, scans):
    phys = {}
    table = {}
    out = []
    for start, mid in scans:
        for tag, val in start:
            phys[tag] = bool(val)
        image = dict(phys)
        snap = dict(table)
        for i, (coil, branches) in enumerate(rungs):
            for at, tag, val in mid:
                if at == i:
                    phys[tag] = bool(val)
            def read(tag):
                if tag.startswith('I:'):
                    return image.get(tag, False)
                return (table if tag.startswith('B:') else snap).get(tag, False)
            power = any(all(read(t) if k == 'XIC' else not read(t) for k, t in br) for br in branches)
            table[coil] = power
        out.append(sorted(t for t, v in table.items() if v and t.startswith('O:')))
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['regression: scenario 15',
   [[['O:2', [[['XIC', 'B:1'], ['XIC', 'I:1']]]],
     ['O:1', [[['XIC', 'O:0'], ['XIC', 'B:0']], [['XIC', 'I:1']]]],
     ['O:1',
      [[['XIC', 'I:2'], ['XIO', 'B:1'], ['XIC', 'O:1']], [['XIO', 'B:0'], ['XIO', 'I:0'], ['XIC', 'O:0']]]]],
    [[[['I:0', False], ['I:1', False], ['I:2', False]], [[0, 'I:1', False], [1, 'I:2', True]]],
     [[['I:0', False], ['I:1', True]], []],
     [[['I:0', False], ['I:2', True]], []],
     [[['I:0', True], ['I:1', False], ['I:2', False]], []],
     [[['I:0', True], ['I:1', False], ['I:2', False]], []],
     [[['I:1', False], ['I:2', True]], [[2, 'I:2', False]]]]],
   [[], ['O:1'], ['O:1'], [], [], []]],
  ['control: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['control: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['control: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['control: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['control: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]],
  ['control: scenario 1',
   [[['O:0', [[['XIC', 'I:1'], ['XIC', 'O:0'], ['XIC', 'I:1']], [['XIO', 'O:0']]]],
     ['B:0', [[['XIO', 'I:0'], ['XIO', 'B:1'], ['XIC', 'O:0']], [['XIC', 'I:2'], ['XIC', 'I:2']]]],
     ['O:1', [[['XIC', 'O:2'], ['XIC', 'I:0'], ['XIC', 'O:0']]]],
     ['O:1',
      [[['XIO', 'O:1'], ['XIC', 'B:0'], ['XIC', 'B:0']], [['XIC', 'O:1'], ['XIC', 'B:0'], ['XIC', 'O:2']]]],
     ['O:1',
      [[['XIC', 'I:0'], ['XIO', 'I:0'], ['XIO', 'O:0']], [['XIC', 'O:2'], ['XIC', 'I:1'], ['XIO', 'B:0']]]]],
    [[[['I:0', True], ['I:1', False]], [[1, 'I:2', True]]],
     [[['I:2', True]], []],
     [[['I:2', True]], [[0, 'I:2', True]]],
     [[['I:0', True], ['I:2', False]], [[4, 'I:2', False], [4, 'I:2', True]]]]],
   [['O:0'], [], ['O:0'], []]]],
 [['regression: scenario 3',
   [[['O:2', [[['XIO', 'O:1']], [['XIC', 'B:0'], ['XIC', 'I:1']]]],
     ['B:1', [[['XIC', 'O:2'], ['XIC', 'O:2']], [['XIC', 'O:0']]]],
     ['O:1', [[['XIC', 'B:1'], ['XIC', 'B:1']], [['XIC', 'O:1'], ['XIC', 'B:1']]]],
     ['B:0', [[['XIO', 'I:0']], [['XIC', 'I:1']]]]],
    [[[['I:1', False], ['I:2', False]], [[2, 'I:2', False]]],
     [[['I:0', False], ['I:1', False]], []],
     [[], [[2, 'I:1', True], [1, 'I:2', True]]]]],
   [['O:1', 'O:2'], [], ['O:1', 'O:2']]],
  ['regression: scenario 30',
   [[['B:1', [[['XIC', 'O:2']]]],
     ['O:2',
      [[['XIO', 'I:2'], ['XIO', 'O:2'], ['XIO', 'B:1']], [['XIO', 'I:2'], ['XIC', 'O:0'], ['XIC', 'B:1']]]],
     ['O:1', [[['XIC', 'I:1'], ['XIC', 'O:2'], ['XIO', 'O:1']]]]],
    [[[['I:0', True]], []],
     [[['I:1', True]], [[2, 'I:2', True], [1, 'I:0', True]]],
     [[['I:0', False], ['I:1', True], ['I:2', True]], [[2, 'I:0', False], [1, 'I:2', False]]],
     [[['I:1', False], ['I:2', False]], []],
     [[], []],
     [[['I:0', False], ['I:1', True], ['I:2', True]], [[0, 'I:2', True], [1, 'I:0', True]]]]],
   [['O:2'], [], [], ['O:2'], [], []]],
  ['control: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['control: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['control: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['control: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['control: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]]],
 [['regression: scenario 9',
   [[['O:1', [[['XIO', 'I:0'], ['XIC', 'O:1']], [['XIC', 'B:1']]]],
     ['B:1', [[['XIO', 'O:2']]]],
     ['B:0',
      [[['XIC', 'O:2'], ['XIO', 'O:1'], ['XIO', 'B:1']], [['XIO', 'O:2'], ['XIO', 'B:0'], ['XIO', 'O:0']]]],
     ['O:2', [[['XIC', 'B:0'], ['XIO', 'I:0'], ['XIC', 'I:1']], [['XIO', 'B:1'], ['XIC', 'I:2']]]],
     ['O:1', [[['XIO', 'O:2'], ['XIC', 'I:1']], [['XIO', 'B:0'], ['XIC', 'B:1']]]]],
    [[[['I:1', False]], [[1, 'I:0', True], [4, 'I:1', False]]],
     [[['I:1', True], ['I:2', True]], []],
     [[['I:1', False], ['I:2', True]], [[4, 'I:0', True], [2, 'I:0', True]]],
     [[['I:0', True], ['I:1', True], ['I:2', False]], [[2, 'I:1', True], [4, 'I:2', True]]]]],
   [[], ['O:1'], [], ['O:1']]],
  ['regression: scenario 24',
   [[['O:0', [[['XIC', 'O:2'], ['XIC', 'B:0']], [['XIC', 'I:2'], ['XIO', 'I:0']]]],
     ['O:2', [[['XIC', 'B:0']], [['XIC', 'I:1']]]],
     ['O:1', [[['XIC', 'O:2'], ['XIC', 'O:2']]]]],
    [[[['I:2', False]], [[0, 'I:0', False], [2, 'I:2', False]]],
     [[['I:0', True], ['I:1', True], ['I:2', True]], [[2, 'I:2', True], [1, 'I:2', True]]],
     [[['I:0', False], ['I:1', True]], [[1, 'I:2', True], [1, 'I:1', False]]]]],
   [[], ['O:1', 'O:2'], ['O:0', 'O:1', 'O:2']]],
  ['control: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['control: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['control: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['control: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['control: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]]],
 [['regression: scenario 10',
   [[['B:1', [[['XIC', 'I:2'], ['XIC', 'B:1'], ['XIO', 'B:1']], [['XIO', 'B:1']]]],
     ['B:0', [[['XIC', 'I:1'], ['XIC', 'B:1'], ['XIC', 'O:2']], [['XIC', 'I:1'], ['XIO', 'O:1']]]],
     ['O:2', [[['XIC', 'B:1']]]],
     ['B:1', [[['XIC', 'B:1'], ['XIO', 'B:0']], [['XIC', 'I:0'], ['XIC', 'I:0']]]],
     ['B:0', [[['XIC', 'O:0']], [['XIC', 'I:1'], ['XIO', 'O:0']]]]],
    [[[['I:1', True]], [[1, 'I:1', False]]],
     [[['I:1', False], ['I:2', False]], [[4, 'I:0', False]]],
     [[['I:0', True], ['I:1', True], ['I:2', True]], [[0, 'I:1', True], [4, 'I:0', True]]],
     [[['I:0', True]], [[3, 'I:1', True]]],
     [[['I:0', True], ['I:2', False]], [[3, 'I:0', True], [2, 'I:1', False]]]]],
   [['O:2'], ['O:2'], [], [], []]],
  ['regression: scenario 25',
   [[['O:0', [[['XIC', 'I:0'], ['XIC', 'O:0'], ['XIC', 'O:2']], [['XIC', 'O:2'], ['XIC', 'I:1']]]],
     ['O:0', [[['XIC', 'O:0'], ['XIC', 'O:0']]]],
     ['O:0', [[['XIO', 'O:0'], ['XIO', 'I:0']], [['XIC', 'O:2'], ['XIC', 'B:0']]]],
     ['O:2', [[['XIC', 'I:1'], ['XIO', 'O:2']], [['XIO', 'B:0'], ['XIO', 'I:1']]]],
     ['O:1', [[['XIC', 'O:0']], [['XIC', 'I:0'], ['XIC', 'B:1']]]]],
    [[[['I:1', True], ['I:2', True]], [[0, 'I:0', False]]],
     [[['I:0', False], ['I:1', True], ['I:2', True]], [[0, 'I:2', False], [2, 'I:1', True]]],
     [[['I:0', False], ['I:2', False]], [[3, 'I:1', False]]],
     [[], []],
     [[['I:0', True], ['I:2', False]], [[0, 'I:2', False]]],
     [[['I:1', True], ['I:2', True]], [[1, 'I:1', False]]]]],
   [['O:0', 'O:1', 'O:2'], [], ['O:0', 'O:1', 'O:2'], ['O:0', 'O:1', 'O:2'], ['O:2'], []]],
  ['control: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['control: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['control: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['control: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['control: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]]],
 [['regression: scenario 58',
   [[['O:1', [[['XIC', 'I:1']], [['XIC', 'O:1'], ['XIC', 'I:0']]]],
     ['O:0', [[['XIC', 'B:0']], [['XIO', 'I:2']]]],
     ['B:1',
      [[['XIC', 'I:1'], ['XIC', 'I:1'], ['XIC', 'O:0']], [['XIC', 'I:2'], ['XIO', 'O:0'], ['XIC', 'B:0']]]],
     ['O:0', [[['XIC', 'B:1'], ['XIC', 'O:2'], ['XIC', 'O:2']], [['XIC', 'I:2'], ['XIC', 'O:1']]]],
     ['O:2', [[['XIO', 'O:2'], ['XIO', 'I:2']]]]],
    [[[['I:0', True], ['I:1', False]], [[0, 'I:1', True], [0, 'I:0', False]]],
     [[['I:0', True]], [[0, 'I:1', True], [1, 'I:2', True]]],
     [[['I:1', True], ['I:2', False]], []],
     [[['I:1', True]], [[0, 'I:1', True]]]]],
   [['O:2'], ['O:0', 'O:1'], ['O:1', 'O:2'], ['O:0', 'O:1']]],
  ['regression: scenario 53',
   [[['O:2', [[['XIC', 'B:1']], [['XIC', 'O:0']]]],
     ['B:1', [[['XIO', 'I:1'], ['XIO', 'B:0']], [['XIC', 'I:2'], ['XIC', 'O:1']]]],
     ['O:2', [[['XIO', 'O:2']], [['XIC', 'B:1'], ['XIC', 'I:1']]]],
     ['B:1', [[['XIC', 'O:2'], ['XIC', 'O:2']], [['XIC', 'O:2']]]],
     ['O:0', [[['XIC', 'B:0'], ['XIC', 'O:2']], [['XIC', 'O:2'], ['XIO', 'O:1']]]]],
    [[[], [[2, 'I:0', False]]],
     [[['I:0', True], ['I:1', False]], [[3, 'I:2', True]]],
     [[['I:0', False], ['I:1', True], ['I:2', False]], []],
     [[['I:0', False], ['I:2', False]], [[0, 'I:1', False]]],
     [[['I:1', False], ['I:2', False]], []]]],
   [['O:0', 'O:2'], [], ['O:0', 'O:2'], [], ['O:0', 'O:2']]],
  ['control: input changes mid scan',
   [[['O:0', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:0']]]]],
    [[[['I:0', False]], [[1, 'I:0', True]]], [[], []]]],
   [[], ['O:0', 'O:1']]],
  ['regression: later rung uses earlier coil',
   [[['B:0', [[['XIC', 'I:1']]]], ['O:0', [[['XIC', 'B:0']]]]],
    [[[['I:1', True]], []], [[['I:1', False]], []]]],
   [['O:0'], []]],
  ['control: earlier rung uses later coil',
   [[['O:0', [[['XIC', 'B:1']]]], ['B:1', [[['XIC', 'I:1']]]]],
    [[[['I:1', True]], []], [[], []], [[['I:1', False]], []]]],
   [[], ['O:0'], ['O:0']]],
  ['control: xio of unwritten tag',
   [[['O:2', [[['XIO', 'B:1']]]], ['O:1', [[['XIO', 'I:2']]]]], [[[], []], [[['I:2', True]], []]]],
   [['O:1', 'O:2'], ['O:2']]],
  ['control: parallel branch',
   [[['O:0', [[['XIC', 'I:0']], [['XIC', 'I:1'], ['XIO', 'I:2']]]]],
    [[[['I:0', False], ['I:1', True]], []], [[['I:0', True], ['I:1', False]], []]]],
   [['O:0'], ['O:0']]],
  ['control: duplicate coil',
   [[['O:1', [[['XIC', 'I:0']]]], ['O:1', [[['XIC', 'I:1']]]]],
    [[[['I:0', True], ['I:1', False]], []], [[['I:0', False], ['I:1', True]], []]]],
   [[], ['O:1']]]]]
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)

prompt:
An internal bit set by rung 1 only affects rung 2 one scan later, adding a scan of delay.

Ladder program scan. rungs is a list of [coil, branches]; a branch is a series list of [XIC|XIO, tag] contacts and the rung is true if any branch is fully true. Each scan item is [start_changes, mid_changes]: start_changes [[tag, value]] update physical inputs before the input scan; the input image is then frozen for the program scan. mid_changes [[rung_index, tag, value]] change physical inputs just before that rung executes and are only seen by the next input scan. Non-input tags are read from the data table, where earlier rungs of the same scan have already written their coils (last OTE wins). Missing tags read false. Return the sorted energized O: tags after each scan.

split: open-access