FA-91901 / PLC ladder logic scan cycles / Open access
RES rung is applied before the RTO rung in the same scan · case 01
On a reset scan with the timer enabled, ACC ends the scan non-zero instead of cleared.
ROOT CAUSE
The reset is processed at the top of the scan, so the later RTO rung re-accumulates in the same scan.
VERIFIED REPAIR
Apply RES after the RTO instruction, matching its later rung position.
Unsuccessful approach: Moving the reset first and also clearing the enable edge memory still loses the next scan's credit.
Case contract
Retentive timer (RTO) on rung 1 and its reset (RES) on a later rung, evaluated per scan; scans is a list of [enable, reset, elapsed_ms]. An enabled scan whose previous scan was also enabled adds the elapsed time (clamped at preset); DN sets when ACC >= preset while enabled. A disabled rung retains ACC and DN. Because RES is a later rung, a reset in a scan clears ACC and DN after the RTO has run; the enable edge memory is not touched by RES. Return [DN, ACC] per scan.
Why this case matters
Ladder programs are executed as repeated scans; each defect here changes what a rung, timer, counter or data-table instruction reports on a particular scan, which is how commissioning and field faults are actually observed.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(preset, scans):
acc = 0
dn = False
prev = False
out = []
for en, res, dt in scans:
en = bool(en)
if res:
acc = 0
dn = False
if en:
if prev:
acc = min(preset, acc + dt)
if acc >= preset:
dn = True
prev = en
out.append([dn, acc])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: scenario 5',
[0,
[[True, False, 20],
[False, False, 10],
[True, False, 50],
[True, False, 50],
[True, False, 50],
[True, True, 20],
[True, False, 50],
[True, False, 30],
[False, True, 40],
[True, False, 10],
[False, False, 20],
[False, True, 40]]],
[[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[False, 0]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[100,
[[False, False, 10],
[False, False, 50],
[False, False, 40],
[True, True, 20],
[False, False, 40],
[True, False, 40],
[True, False, 20],
[False, False, 40]]],
[[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 20], [False, 20]]],
['control: scenario 2',
[50,
[[False, False, 30],
[False, False, 30],
[True, False, 50],
[False, False, 50],
[False, False, 10],
[True, False, 30],
[False, False, 50],
[True, False, 30],
[True, False, 40]]],
[[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 40]]],
['regression: scenario 3',
[100,
[[False, False, 50],
[False, False, 20],
[True, False, 50],
[True, False, 10],
[True, False, 20],
[True, False, 20],
[True, False, 50],
[True, False, 50],
[True, True, 10],
[True, False, 50]]],
[[False, 0],
[False, 0],
[False, 0],
[False, 10],
[False, 30],
[False, 50],
[True, 100],
[True, 100],
[False, 0],
[False, 50]]]],
[['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['regression: scenario 6',
[0,
[[True, True, 10],
[True, False, 40],
[False, True, 40],
[True, True, 20],
[True, False, 30],
[False, True, 20],
[True, False, 10],
[True, False, 30],
[True, False, 40],
[False, False, 10],
[False, False, 20],
[False, False, 10]]],
[[False, 0],
[True, 0],
[False, 0],
[False, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['regression: scenario 1',
[80,
[[False, False, 10],
[True, False, 30],
[True, False, 10],
[True, True, 40],
[True, False, 50],
[False, False, 40],
[False, False, 50],
[False, False, 40]]],
[[False, 0], [False, 0], [False, 10], [False, 0], [False, 50], [False, 50], [False, 50], [False, 50]]],
['regression: scenario 2',
[0,
[[True, False, 10],
[False, False, 30],
[True, False, 20],
[True, False, 30],
[True, False, 50],
[True, False, 50],
[True, True, 20],
[True, False, 20],
[False, False, 40]]],
[[True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [False, 0], [True, 0], [True, 0]]],
['control: scenario 3',
[50,
[[True, True, 10],
[True, False, 20],
[True, False, 10],
[True, False, 20],
[True, False, 40],
[True, False, 50],
[True, False, 30],
[False, False, 20],
[True, False, 40],
[False, True, 20]]],
[[False, 0],
[False, 20],
[False, 30],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[False, 0]]]],
[['regression: scenario 4',
[150,
[[True, False, 20],
[True, False, 20],
[True, False, 40],
[True, False, 30],
[True, False, 20],
[False, True, 20],
[True, True, 10],
[True, True, 40],
[True, False, 40],
[False, False, 10],
[False, False, 10],
[False, False, 20]]],
[[False, 0],
[False, 20],
[False, 60],
[False, 90],
[False, 110],
[False, 0],
[False, 0],
[False, 0],
[False, 40],
[False, 40],
[False, 40],
[False, 40]]],
['regression: scenario 24',
[0,
[[False, False, 40],
[True, False, 10],
[True, True, 20],
[False, False, 40],
[True, False, 10],
[True, False, 40],
[False, False, 20]]],
[[False, 0], [True, 0], [False, 0], [False, 0], [True, 0], [True, 0], [True, 0]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[0,
[[False, False, 40],
[False, True, 30],
[True, False, 10],
[True, False, 30],
[True, False, 20],
[False, True, 30],
[True, False, 40],
[True, False, 30],
[True, False, 30],
[False, False, 20],
[False, False, 10],
[True, False, 30],
[True, False, 50],
[False, False, 10]]],
[[False, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['control: scenario 2',
[50,
[[True, False, 10],
[True, False, 20],
[True, False, 50],
[True, False, 20],
[True, False, 20],
[False, False, 50],
[False, False, 40],
[False, True, 10],
[False, False, 10]]],
[[False, 0],
[False, 20],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[False, 0],
[False, 0]]]],
[['regression: scenario 2',
[100,
[[True, False, 20],
[True, False, 30],
[True, False, 10],
[True, True, 10],
[True, False, 10],
[True, False, 20],
[False, False, 50],
[False, True, 40],
[False, False, 30],
[False, False, 40],
[True, False, 10],
[True, False, 50]]],
[[False, 0],
[False, 30],
[False, 40],
[False, 0],
[False, 10],
[False, 30],
[False, 30],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 50]]],
['regression: scenario 19',
[0,
[[False, False, 10],
[True, True, 30],
[True, False, 20],
[True, False, 20],
[False, True, 40],
[True, True, 40],
[True, False, 30],
[True, False, 30],
[False, False, 10],
[False, False, 30],
[True, False, 30],
[True, False, 10],
[False, False, 40],
[False, False, 50]]],
[[False, 0],
[False, 0],
[True, 0],
[True, 0],
[False, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['regression: scenario 1',
[0,
[[False, False, 50],
[False, False, 20],
[False, False, 30],
[True, True, 40],
[False, True, 10],
[True, False, 10],
[False, False, 30]]],
[[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [True, 0], [True, 0]]],
['regression: scenario 3',
[100,
[[False, False, 10],
[True, False, 20],
[True, False, 10],
[True, True, 50],
[True, False, 40],
[True, False, 50],
[False, True, 50],
[False, False, 10],
[True, False, 30]]],
[[False, 0],
[False, 0],
[False, 10],
[False, 0],
[False, 40],
[False, 90],
[False, 0],
[False, 0],
[False, 0]]]],
[['regression: scenario 6',
[0,
[[True, True, 30],
[True, True, 40],
[False, False, 10],
[False, False, 10],
[True, False, 30],
[True, True, 50],
[True, False, 10],
[False, False, 50],
[True, False, 10],
[False, False, 40],
[False, False, 40],
[False, False, 20]]],
[[False, 0],
[False, 0],
[False, 0],
[False, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['regression: scenario 32',
[0,
[[True, False, 10],
[True, False, 10],
[True, False, 30],
[True, False, 10],
[True, False, 30],
[False, False, 40],
[False, False, 50],
[False, False, 30],
[True, True, 40],
[True, False, 50]]],
[[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[0,
[[True, False, 30],
[True, False, 10],
[True, False, 10],
[True, False, 40],
[False, False, 30],
[False, False, 50],
[False, True, 40],
[True, False, 10],
[True, False, 30],
[True, False, 50],
[False, False, 20],
[False, False, 30],
[False, False, 40],
[False, False, 50]]],
[[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['control: scenario 2',
[50,
[[True, True, 50],
[False, False, 10],
[True, False, 50],
[False, True, 50],
[False, False, 20],
[True, False, 20]]],
[[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0]]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: reset while enabled | [[False, 0], [False, 60], [False, 30], [False, 60], [False, 90]] | [[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]] | Failed |
| regression: scenario 5 | [[True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [False, 0], [True, 0], [True, 0], [False, 0]] | [[True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [False, 0], [True, 0], [True, 0], [False, 0], [True, 0], [True, 0], [False, 0]] | Failed |
| control: interrupted timing retained | [[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]] | [[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]] | Passed |
| regression: reset done timer while enabled | [[False, 0], [True, 50], [True, 50], [False, 10], [False, 35], [True, 50]] | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]] | Failed |
| control: reset done timer while disabled | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]] | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]] | Passed |
| control: scenario 1 | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 20], [False, 20]] | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 20], [False, 20]] | Passed |
| control: scenario 2 | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 40]] | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 40]] | Passed |
| regression: scenario 3 | [[False, 0], [False, 0], [False, 0], [False, 10], [False, 30], [False, 50], [True, 100], [True, 100], [False, 10], [False, 60]] | [[False, 0], [False, 0], [False, 0], [False, 10], [False, 30], [False, 50], [True, 100], [True, 100], [False, 0], [False, 50]] | Failed |
SHA-256 / d473aa1415c2ef8838b50ff1dba8aaf9398cb69bf915375cb9f5f86fe74277f0
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(preset, scans):
acc = 0
dn = False
prev = False
out = []
for en, res, dt in scans:
en = bool(en)
if res:
acc = 0
dn = False
prev = False
if en:
if prev:
acc = min(preset, acc + dt)
if acc >= preset:
dn = True
prev = en
if res:
acc = 0
out.append([dn, acc])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: scenario 5',
[0,
[[True, False, 20],
[False, False, 10],
[True, False, 50],
[True, False, 50],
[True, False, 50],
[True, True, 20],
[True, False, 50],
[True, False, 30],
[False, True, 40],
[True, False, 10],
[False, False, 20],
[False, True, 40]]],
[[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[False, 0]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[100,
[[False, False, 10],
[False, False, 50],
[False, False, 40],
[True, True, 20],
[False, False, 40],
[True, False, 40],
[True, False, 20],
[False, False, 40]]],
[[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 20], [False, 20]]],
['control: scenario 2',
[50,
[[False, False, 30],
[False, False, 30],
[True, False, 50],
[False, False, 50],
[False, False, 10],
[True, False, 30],
[False, False, 50],
[True, False, 30],
[True, False, 40]]],
[[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 40]]],
['regression: scenario 3',
[100,
[[False, False, 50],
[False, False, 20],
[True, False, 50],
[True, False, 10],
[True, False, 20],
[True, False, 20],
[True, False, 50],
[True, False, 50],
[True, True, 10],
[True, False, 50]]],
[[False, 0],
[False, 0],
[False, 0],
[False, 10],
[False, 30],
[False, 50],
[True, 100],
[True, 100],
[False, 0],
[False, 50]]]],
[['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['regression: scenario 6',
[0,
[[True, True, 10],
[True, False, 40],
[False, True, 40],
[True, True, 20],
[True, False, 30],
[False, True, 20],
[True, False, 10],
[True, False, 30],
[True, False, 40],
[False, False, 10],
[False, False, 20],
[False, False, 10]]],
[[False, 0],
[True, 0],
[False, 0],
[False, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['regression: scenario 1',
[80,
[[False, False, 10],
[True, False, 30],
[True, False, 10],
[True, True, 40],
[True, False, 50],
[False, False, 40],
[False, False, 50],
[False, False, 40]]],
[[False, 0], [False, 0], [False, 10], [False, 0], [False, 50], [False, 50], [False, 50], [False, 50]]],
['regression: scenario 2',
[0,
[[True, False, 10],
[False, False, 30],
[True, False, 20],
[True, False, 30],
[True, False, 50],
[True, False, 50],
[True, True, 20],
[True, False, 20],
[False, False, 40]]],
[[True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [False, 0], [True, 0], [True, 0]]],
['control: scenario 3',
[50,
[[True, True, 10],
[True, False, 20],
[True, False, 10],
[True, False, 20],
[True, False, 40],
[True, False, 50],
[True, False, 30],
[False, False, 20],
[True, False, 40],
[False, True, 20]]],
[[False, 0],
[False, 20],
[False, 30],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[False, 0]]]],
[['regression: scenario 4',
[150,
[[True, False, 20],
[True, False, 20],
[True, False, 40],
[True, False, 30],
[True, False, 20],
[False, True, 20],
[True, True, 10],
[True, True, 40],
[True, False, 40],
[False, False, 10],
[False, False, 10],
[False, False, 20]]],
[[False, 0],
[False, 20],
[False, 60],
[False, 90],
[False, 110],
[False, 0],
[False, 0],
[False, 0],
[False, 40],
[False, 40],
[False, 40],
[False, 40]]],
['regression: scenario 24',
[0,
[[False, False, 40],
[True, False, 10],
[True, True, 20],
[False, False, 40],
[True, False, 10],
[True, False, 40],
[False, False, 20]]],
[[False, 0], [True, 0], [False, 0], [False, 0], [True, 0], [True, 0], [True, 0]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[0,
[[False, False, 40],
[False, True, 30],
[True, False, 10],
[True, False, 30],
[True, False, 20],
[False, True, 30],
[True, False, 40],
[True, False, 30],
[True, False, 30],
[False, False, 20],
[False, False, 10],
[True, False, 30],
[True, False, 50],
[False, False, 10]]],
[[False, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['control: scenario 2',
[50,
[[True, False, 10],
[True, False, 20],
[True, False, 50],
[True, False, 20],
[True, False, 20],
[False, False, 50],
[False, False, 40],
[False, True, 10],
[False, False, 10]]],
[[False, 0],
[False, 20],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[False, 0],
[False, 0]]]],
[['regression: scenario 2',
[100,
[[True, False, 20],
[True, False, 30],
[True, False, 10],
[True, True, 10],
[True, False, 10],
[True, False, 20],
[False, False, 50],
[False, True, 40],
[False, False, 30],
[False, False, 40],
[True, False, 10],
[True, False, 50]]],
[[False, 0],
[False, 30],
[False, 40],
[False, 0],
[False, 10],
[False, 30],
[False, 30],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 50]]],
['regression: scenario 19',
[0,
[[False, False, 10],
[True, True, 30],
[True, False, 20],
[True, False, 20],
[False, True, 40],
[True, True, 40],
[True, False, 30],
[True, False, 30],
[False, False, 10],
[False, False, 30],
[True, False, 30],
[True, False, 10],
[False, False, 40],
[False, False, 50]]],
[[False, 0],
[False, 0],
[True, 0],
[True, 0],
[False, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['regression: scenario 1',
[0,
[[False, False, 50],
[False, False, 20],
[False, False, 30],
[True, True, 40],
[False, True, 10],
[True, False, 10],
[False, False, 30]]],
[[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [True, 0], [True, 0]]],
['regression: scenario 3',
[100,
[[False, False, 10],
[True, False, 20],
[True, False, 10],
[True, True, 50],
[True, False, 40],
[True, False, 50],
[False, True, 50],
[False, False, 10],
[True, False, 30]]],
[[False, 0],
[False, 0],
[False, 10],
[False, 0],
[False, 40],
[False, 90],
[False, 0],
[False, 0],
[False, 0]]]],
[['regression: scenario 6',
[0,
[[True, True, 30],
[True, True, 40],
[False, False, 10],
[False, False, 10],
[True, False, 30],
[True, True, 50],
[True, False, 10],
[False, False, 50],
[True, False, 10],
[False, False, 40],
[False, False, 40],
[False, False, 20]]],
[[False, 0],
[False, 0],
[False, 0],
[False, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['regression: scenario 32',
[0,
[[True, False, 10],
[True, False, 10],
[True, False, 30],
[True, False, 10],
[True, False, 30],
[False, False, 40],
[False, False, 50],
[False, False, 30],
[True, True, 40],
[True, False, 50]]],
[[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[0,
[[True, False, 30],
[True, False, 10],
[True, False, 10],
[True, False, 40],
[False, False, 30],
[False, False, 50],
[False, True, 40],
[True, False, 10],
[True, False, 30],
[True, False, 50],
[False, False, 20],
[False, False, 30],
[False, False, 40],
[False, False, 50]]],
[[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['control: scenario 2',
[50,
[[True, True, 50],
[False, False, 10],
[True, False, 50],
[False, True, 50],
[False, False, 20],
[True, False, 20]]],
[[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0]]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: reset while enabled | [[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]] | [[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]] | Passed |
| regression: scenario 5 | [[True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [False, 0], [True, 0], [True, 0], [False, 0]] | [[True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [False, 0], [True, 0], [True, 0], [False, 0], [True, 0], [True, 0], [False, 0]] | Failed |
| control: interrupted timing retained | [[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]] | [[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]] | Passed |
| regression: reset done timer while enabled | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]] | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]] | Passed |
| control: reset done timer while disabled | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]] | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]] | Passed |
| control: scenario 1 | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 20], [False, 20]] | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 20], [False, 20]] | Passed |
| control: scenario 2 | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 40]] | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 40]] | Passed |
| regression: scenario 3 | [[False, 0], [False, 0], [False, 0], [False, 10], [False, 30], [False, 50], [True, 100], [True, 100], [False, 0], [False, 50]] | [[False, 0], [False, 0], [False, 0], [False, 10], [False, 30], [False, 50], [True, 100], [True, 100], [False, 0], [False, 50]] | Passed |
SHA-256 / 82046a6b019237b525fa79c461f75411a8a0e3c12f8a16fabeedf00226826c8f
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(preset, scans):
acc = 0
dn = False
prev = False
out = []
for en, res, dt in scans:
en = bool(en)
if en:
if prev:
acc = min(preset, acc + dt)
if acc >= preset:
dn = True
prev = en
if res:
acc = 0
dn = False
out.append([dn, acc])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: scenario 5',
[0,
[[True, False, 20],
[False, False, 10],
[True, False, 50],
[True, False, 50],
[True, False, 50],
[True, True, 20],
[True, False, 50],
[True, False, 30],
[False, True, 40],
[True, False, 10],
[False, False, 20],
[False, True, 40]]],
[[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[False, 0]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[100,
[[False, False, 10],
[False, False, 50],
[False, False, 40],
[True, True, 20],
[False, False, 40],
[True, False, 40],
[True, False, 20],
[False, False, 40]]],
[[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 20], [False, 20]]],
['control: scenario 2',
[50,
[[False, False, 30],
[False, False, 30],
[True, False, 50],
[False, False, 50],
[False, False, 10],
[True, False, 30],
[False, False, 50],
[True, False, 30],
[True, False, 40]]],
[[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 40]]],
['regression: scenario 3',
[100,
[[False, False, 50],
[False, False, 20],
[True, False, 50],
[True, False, 10],
[True, False, 20],
[True, False, 20],
[True, False, 50],
[True, False, 50],
[True, True, 10],
[True, False, 50]]],
[[False, 0],
[False, 0],
[False, 0],
[False, 10],
[False, 30],
[False, 50],
[True, 100],
[True, 100],
[False, 0],
[False, 50]]]],
[['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['regression: scenario 6',
[0,
[[True, True, 10],
[True, False, 40],
[False, True, 40],
[True, True, 20],
[True, False, 30],
[False, True, 20],
[True, False, 10],
[True, False, 30],
[True, False, 40],
[False, False, 10],
[False, False, 20],
[False, False, 10]]],
[[False, 0],
[True, 0],
[False, 0],
[False, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['regression: scenario 1',
[80,
[[False, False, 10],
[True, False, 30],
[True, False, 10],
[True, True, 40],
[True, False, 50],
[False, False, 40],
[False, False, 50],
[False, False, 40]]],
[[False, 0], [False, 0], [False, 10], [False, 0], [False, 50], [False, 50], [False, 50], [False, 50]]],
['regression: scenario 2',
[0,
[[True, False, 10],
[False, False, 30],
[True, False, 20],
[True, False, 30],
[True, False, 50],
[True, False, 50],
[True, True, 20],
[True, False, 20],
[False, False, 40]]],
[[True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [False, 0], [True, 0], [True, 0]]],
['control: scenario 3',
[50,
[[True, True, 10],
[True, False, 20],
[True, False, 10],
[True, False, 20],
[True, False, 40],
[True, False, 50],
[True, False, 30],
[False, False, 20],
[True, False, 40],
[False, True, 20]]],
[[False, 0],
[False, 20],
[False, 30],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[False, 0]]]],
[['regression: scenario 4',
[150,
[[True, False, 20],
[True, False, 20],
[True, False, 40],
[True, False, 30],
[True, False, 20],
[False, True, 20],
[True, True, 10],
[True, True, 40],
[True, False, 40],
[False, False, 10],
[False, False, 10],
[False, False, 20]]],
[[False, 0],
[False, 20],
[False, 60],
[False, 90],
[False, 110],
[False, 0],
[False, 0],
[False, 0],
[False, 40],
[False, 40],
[False, 40],
[False, 40]]],
['regression: scenario 24',
[0,
[[False, False, 40],
[True, False, 10],
[True, True, 20],
[False, False, 40],
[True, False, 10],
[True, False, 40],
[False, False, 20]]],
[[False, 0], [True, 0], [False, 0], [False, 0], [True, 0], [True, 0], [True, 0]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[0,
[[False, False, 40],
[False, True, 30],
[True, False, 10],
[True, False, 30],
[True, False, 20],
[False, True, 30],
[True, False, 40],
[True, False, 30],
[True, False, 30],
[False, False, 20],
[False, False, 10],
[True, False, 30],
[True, False, 50],
[False, False, 10]]],
[[False, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['control: scenario 2',
[50,
[[True, False, 10],
[True, False, 20],
[True, False, 50],
[True, False, 20],
[True, False, 20],
[False, False, 50],
[False, False, 40],
[False, True, 10],
[False, False, 10]]],
[[False, 0],
[False, 20],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[True, 50],
[False, 0],
[False, 0]]]],
[['regression: scenario 2',
[100,
[[True, False, 20],
[True, False, 30],
[True, False, 10],
[True, True, 10],
[True, False, 10],
[True, False, 20],
[False, False, 50],
[False, True, 40],
[False, False, 30],
[False, False, 40],
[True, False, 10],
[True, False, 50]]],
[[False, 0],
[False, 30],
[False, 40],
[False, 0],
[False, 10],
[False, 30],
[False, 30],
[False, 0],
[False, 0],
[False, 0],
[False, 0],
[False, 50]]],
['regression: scenario 19',
[0,
[[False, False, 10],
[True, True, 30],
[True, False, 20],
[True, False, 20],
[False, True, 40],
[True, True, 40],
[True, False, 30],
[True, False, 30],
[False, False, 10],
[False, False, 30],
[True, False, 30],
[True, False, 10],
[False, False, 40],
[False, False, 50]]],
[[False, 0],
[False, 0],
[True, 0],
[True, 0],
[False, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['regression: scenario 1',
[0,
[[False, False, 50],
[False, False, 20],
[False, False, 30],
[True, True, 40],
[False, True, 10],
[True, False, 10],
[False, False, 30]]],
[[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [True, 0], [True, 0]]],
['regression: scenario 3',
[100,
[[False, False, 10],
[True, False, 20],
[True, False, 10],
[True, True, 50],
[True, False, 40],
[True, False, 50],
[False, True, 50],
[False, False, 10],
[True, False, 30]]],
[[False, 0],
[False, 0],
[False, 10],
[False, 0],
[False, 40],
[False, 90],
[False, 0],
[False, 0],
[False, 0]]]],
[['regression: scenario 6',
[0,
[[True, True, 30],
[True, True, 40],
[False, False, 10],
[False, False, 10],
[True, False, 30],
[True, True, 50],
[True, False, 10],
[False, False, 50],
[True, False, 10],
[False, False, 40],
[False, False, 40],
[False, False, 20]]],
[[False, 0],
[False, 0],
[False, 0],
[False, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['regression: scenario 32',
[0,
[[True, False, 10],
[True, False, 10],
[True, False, 30],
[True, False, 10],
[True, False, 30],
[False, False, 40],
[False, False, 50],
[False, False, 30],
[True, True, 40],
[True, False, 50]]],
[[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0]]],
['control: interrupted timing retained',
[100,
[[True, False, 30],
[True, False, 40],
[False, False, 40],
[True, False, 40],
[True, False, 40],
[True, False, 40]]],
[[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]]],
['regression: reset while enabled',
[100, [[True, False, 30], [True, False, 60], [True, True, 30], [True, False, 30], [True, False, 30]]],
[[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]]],
['regression: reset done timer while enabled',
[50,
[[True, False, 30],
[True, False, 60],
[True, False, 10],
[True, True, 10],
[True, False, 25],
[True, False, 25]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]]],
['control: reset done timer while disabled',
[50, [[True, False, 30], [True, False, 60], [False, False, 10], [False, True, 10], [False, False, 10]]],
[[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]]],
['control: scenario 1',
[0,
[[True, False, 30],
[True, False, 10],
[True, False, 10],
[True, False, 40],
[False, False, 30],
[False, False, 50],
[False, True, 40],
[True, False, 10],
[True, False, 30],
[True, False, 50],
[False, False, 20],
[False, False, 30],
[False, False, 40],
[False, False, 50]]],
[[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[False, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0],
[True, 0]]],
['control: scenario 2',
[50,
[[True, True, 50],
[False, False, 10],
[True, False, 50],
[False, True, 50],
[False, False, 20],
[True, False, 20]]],
[[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0]]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: reset while enabled | [[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]] | [[False, 0], [False, 60], [False, 0], [False, 30], [False, 60]] | Passed |
| regression: scenario 5 | [[True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [False, 0], [True, 0], [True, 0], [False, 0], [True, 0], [True, 0], [False, 0]] | [[True, 0], [True, 0], [True, 0], [True, 0], [True, 0], [False, 0], [True, 0], [True, 0], [False, 0], [True, 0], [True, 0], [False, 0]] | Passed |
| control: interrupted timing retained | [[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]] | [[False, 0], [False, 40], [False, 40], [False, 40], [False, 80], [True, 100]] | Passed |
| regression: reset done timer while enabled | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]] | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 25], [True, 50]] | Passed |
| control: reset done timer while disabled | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]] | [[False, 0], [True, 50], [True, 50], [False, 0], [False, 0]] | Passed |
| control: scenario 1 | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 20], [False, 20]] | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 20], [False, 20]] | Passed |
| control: scenario 2 | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 40]] | [[False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 0], [False, 40]] | Passed |
| regression: scenario 3 | [[False, 0], [False, 0], [False, 0], [False, 10], [False, 30], [False, 50], [True, 100], [True, 100], [False, 0], [False, 50]] | [[False, 0], [False, 0], [False, 0], [False, 10], [False, 30], [False, 50], [True, 100], [True, 100], [False, 0], [False, 50]] | Passed |
SHA-256 / 7cae5dc66b05df2ad30db2857b179f9d61a4faf916accbbc3ecb06bd76b393bd
Verification & scope
A deterministic bounded teaching model of one PLC instruction or rung pattern evaluated scan by scan. The stated contract is a stipulated toy convention, not a claim of conformance to any vendor controller or IEC 61131-3 runtime. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:51:40.466267+00:00.
Case digest / 900449c33dcb748d8632a14790a82760f368d77919b3b44f56107c738e711f78