FA-93866 / Shift rostering labor rules / Open access
Minimum rest parser drops the minutes component · case 01
A 10:30 minimum rest behaves like a 10-hour rest, accepting 10h15 gaps.
ROOT CAUSE
The "HH:MM" rest parameter keeps only the hour field.
VERIFIED REPAIR
Convert hours and minutes to total minutes.
Unsuccessful approach: Treating HH:MM as an HHMM decimal number inflates 10:30 to 1030 minutes.
Case contract
Input shifts as [worker, start, end] absolute minutes and a minimum rest "HH:MM". For each worker, walk shifts by start time, comparing each start with the latest end seen so far (and that shift index): a negative gap is an overlap, a gap below the minimum rest is short_rest; exactly the minimum is compliant. Return [worker, earlier index, later index, kind] rows ordered by worker then start.
Why this case matters
Rest-period validation is the most common roster labor rule; errors either hide fatigue risks or block legal rosters.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(shifts, min_rest):
h, m = min_rest.split(':')
limit = int(h) * 60
by = {}
for i, (w, s, e) in enumerate(shifts):
by.setdefault(w, []).append((s, e, i))
out = []
for w in sorted(by):
seq = sorted(by[w])
prev = None
for s, e, i in seq:
if prev is not None:
pe, pi = prev
gap = s - pe
if gap < 0:
out.append([w, pi, i, 'overlap'])
elif gap < limit:
out.append([w, pi, i, 'short_rest'])
if prev is None or e > prev[0]:
prev = (e, i)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: rest minutes dropped 1',
[[['chi', 3540, 3780], ['chi', 1320, 1560], ['chi', 4411, 4651], ['chi', 2189, 2909]], '10:30'],
[['chi', 1, 3, 'short_rest']]),
('regression variant: rest minutes dropped 2',
[[['dev', 2000, 2360], ['ana', 5060, 5540], ['ben', 300, 780], ['dev', 3049, 3769], ['ana', 2000, 2360],
['dev', 1940, 2420], ['ben', 1441, 2041], ['ana', 2960, 3560]],
'10:31'],
[['ana', 4, 7, 'short_rest'], ['dev', 5, 0, 'overlap'], ['dev', 5, 3, 'short_rest']]),
('partial repair guard 3',
[[['chi', 2000, 2240], ['ana', 2551, 3271], ['ana', 1320, 1920], ['chi', 2840, 3200], ['ana', 3931, 4651]],
'10:31'],
[['chi', 0, 3, 'short_rest']]),
('boundary control 4', [[['ana', 0, 900], ['ana', 100, 300], ['ana', 600, 800]], '11:00'],
[['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']]),
('boundary control 5', [[['ana', 0, 480], ['ana', 1139, 1620]], '11:00'], [['ana', 0, 1, 'short_rest']]),
('normal control 6',
[[['chi', 1560, 1800], ['ben', 3509, 3989], ['chi', 1320, 1680], ['ana', 1320, 1800], ['chi', 2700, 3060],
['ben', 300, 780], ['ana', 3800, 4040], ['ana', 6440, 6920], ['ben', 2280, 2880], ['ana', 4700, 4940]],
'12:00'],
[['ana', 6, 9, 'short_rest'], ['ben', 8, 1, 'short_rest'], ['chi', 2, 0, 'overlap']]),
('normal control 7',
[[['dev', 0, 480], ['dev', 1741, 2461], ['ben', 2620, 3340], ['dev', 1141, 1861], ['dev', 2431, 3151],
['ben', 1360, 1720], ['chi', 2461, 2821], ['chi', 1320, 1800], ['ben', 300, 660], ['chi', 2401, 3001]],
'11:00'],
[['chi', 7, 9, 'short_rest'], ['chi', 9, 6, 'overlap'], ['dev', 3, 1, 'overlap'],
['dev', 1, 4, 'overlap']]),
('normal control 8',
[[['ben', 2911, 3391], ['ben', 1921, 2281], ['ben', 300, 1020], ['ana', 1170, 1770], ['chi', 1200, 1920],
['chi', 0, 600], ['chi', 1800, 2160], ['ben', 1681, 2041], ['ana', 0, 720], ['ana', 690, 1170]],
'12:00'],
[['ana', 8, 9, 'overlap'], ['ana', 9, 3, 'short_rest'], ['ben', 2, 7, 'short_rest'],
['ben', 7, 1, 'overlap'], ['ben', 1, 0, 'short_rest'], ['chi', 5, 4, 'short_rest'],
['chi', 4, 6, 'overlap']])],
[('regression: rest minutes dropped 1',
[[['chi', 2000, 2240], ['ana', 2551, 3271], ['ana', 1320, 1920], ['chi', 2840, 3200], ['ana', 3931, 4651]],
'10:31'],
[['chi', 0, 3, 'short_rest']]),
('regression variant: rest minutes dropped 2',
[[['dev', 0, 600], ['ben', 330, 1050], ['dev', 0, 720], ['dev', 1141, 1861], ['chi', 300, 660],
['dev', 0, 480], ['chi', 3480, 3840], ['chi', 1320, 1800], ['ben', 0, 360], ['chi', 2400, 2880]],
'10:31'],
[['ben', 8, 1, 'overlap'], ['chi', 7, 9, 'short_rest'], ['chi', 9, 6, 'short_rest'],
['dev', 5, 0, 'overlap'], ['dev', 0, 2, 'overlap'], ['dev', 2, 3, 'short_rest']]),
('partial repair guard 3',
[[['ben', 1300, 2020], ['ben', 360, 600], ['ben', 0, 360], ['ben', 3520, 4120]], '10:31'],
[['ben', 2, 1, 'short_rest']]),
('boundary control 4', [[['ben', 0, 480], ['ben', 1110, 1400]], '10:30'], []),
('boundary control 5', [[['ana', 0, 480], ['ana', 480, 960], ['ben', 0, 480]], '10:30'],
[['ana', 0, 1, 'short_rest']]),
('normal control 6',
[[['dev', 1320, 1680], ['chi', 2360, 2840], ['chi', 3440, 3920], ['dev', 0, 720], ['ben', 1320, 1920],
['chi', 2000, 2480], ['ben', 1890, 2610], ['dev', 2280, 2880], ['chi', 3500, 4100]],
'11:00'],
[['ben', 4, 6, 'overlap'], ['chi', 5, 1, 'overlap'], ['chi', 1, 2, 'short_rest'], ['chi', 2, 8, 'overlap'],
['dev', 3, 0, 'short_rest'], ['dev', 0, 7, 'short_rest']]),
('normal control 7',
[[['ben', 2000, 2480], ['dev', 0, 480], ['dev', 1380, 1740], ['chi', 1320, 1560], ['dev', 2370, 2730],
['chi', 1530, 1890], ['dev', 3330, 4050], ['ben', 2360, 3080]],
'11:00'],
[['ben', 0, 7, 'overlap'], ['chi', 3, 5, 'overlap'], ['dev', 2, 4, 'short_rest'],
['dev', 4, 6, 'short_rest']]),
('normal control 8',
[[['chi', 2480, 2720], ['chi', 2000, 2600], ['chi', 4720, 5080], ['chi', 5740, 5980]], '09:45'],
[['chi', 1, 0, 'overlap']])],
[('regression: rest minutes dropped 1',
[[['ana', 869, 1229], ['chi', 7240, 7600], ['dev', 1920, 2280], ['ana', 0, 240], ['dev', 1320, 2040],
['ana', 2129, 2489], ['dev', 2250, 2730], ['chi', 3620, 4100], ['chi', 2000, 2720],
['chi', 5000, 5240]],
'10:30'],
[['ana', 3, 0, 'short_rest'], ['dev', 4, 2, 'overlap'], ['dev', 2, 6, 'overlap']]),
('regression variant: rest minutes dropped 2',
[[['dev', 3229, 3829], ['ana', 2950, 3670], ['ana', 1530, 2250], ['ben', 1920, 2640], ['ana', 300, 900],
['dev', 5829, 6429], ['ben', 3240, 3720], ['ana', 4331, 4931], ['ben', 1320, 1920],
['dev', 2000, 2600]],
'10:31'],
[['ana', 4, 2, 'short_rest'], ['ben', 8, 3, 'short_rest'], ['ben', 3, 6, 'short_rest'],
['dev', 9, 0, 'short_rest']]),
('partial repair guard 3', [[['ben', 1320, 1800], ['ben', 300, 660]], '10:31'], []),
('boundary control 4', [[['ana', 1200, 1680], ['ana', 0, 480]], '11:00'], []),
('boundary control 5', [[['ana', 0, 480], ['ana', 1140, 1620]], '11:00'], []),
('normal control 6',
[[['dev', 2000, 2480], ['dev', 4231, 4951], ['ana', 0, 240], ['chi', 1860, 2340], ['dev', 3120, 3600],
['chi', 1260, 1860], ['dev', 1940, 2420], ['ana', 901, 1501], ['chi', 1320, 1680]],
'09:45'],
[['chi', 5, 8, 'overlap'], ['chi', 5, 3, 'short_rest'], ['dev', 6, 0, 'overlap']]),
('normal control 7',
[[['ben', 2671, 3031], ['ben', 1320, 2040], ['dev', 0, 480], ['ben', 4922, 5282], ['ben', 3662, 4022],
['dev', 480, 840], ['ana', 2871, 3111], ['ana', 2000, 2240]],
'09:45'],
[['dev', 2, 5, 'short_rest']]),
('normal control 8',
[[['dev', 1440, 1800], ['dev', 3800, 4040], ['dev', 4700, 5060], ['dev', 1320, 1560]], '10:30'],
[['dev', 3, 0, 'overlap']])],
[('regression: rest minutes dropped 1',
[[['ana', 1380, 1620], ['dev', 3420, 3660], ['ana', 3241, 3841], ['ana', 2220, 2580], ['ben', 4841, 5201],
['ana', 300, 780], ['ben', 3460, 4180], ['ben', 1320, 1800], ['dev', 1320, 1920], ['dev', 3540, 4260],
['ben', 2500, 2860]],
'10:30'],
[['ana', 5, 0, 'short_rest'], ['ana', 0, 3, 'short_rest'], ['ben', 10, 6, 'short_rest'],
['dev', 1, 9, 'overlap']]),
('regression variant: rest minutes dropped 2',
[[['chi', 2760, 3240], ['chi', 1320, 1920], ['chi', 2520, 2880], ['ana', 1650, 2010], ['dev', 2000, 2240],
['dev', 3140, 3860], ['ana', 300, 1020]],
'10:31'],
[['ana', 6, 3, 'short_rest'], ['chi', 1, 2, 'short_rest'], ['chi', 2, 0, 'overlap']]),
('partial repair guard 3',
[[['dev', 2551, 3031], ['dev', 1411, 1651], ['dev', 3031, 3391], ['dev', 300, 780]], '10:30'],
[['dev', 0, 2, 'short_rest']]),
('boundary control 4', [[['ben', 0, 480], ['ben', 3400, 3800]], '11:00'], []),
('boundary control 5', [[['ana', 0, 900], ['ana', 100, 300], ['ana', 600, 800]], '11:00'],
[['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']]),
('normal control 6',
[[['chi', 3180, 3780], ['dev', 1320, 1680], ['dev', 1560, 2040], ['dev', 5340, 5580], ['chi', 1320, 1680],
['dev', 4040, 4640]],
'09:45'],
[['dev', 1, 2, 'overlap']]),
('normal control 7',
[[['dev', 1320, 1800], ['ana', 2690, 3410], ['chi', 3440, 4040], ['dev', 4720, 5200], ['chi', 4040, 4640],
['ana', 2000, 2720], ['chi', 2000, 2600], ['dev', 2500, 3220], ['chi', 2600, 2840]],
'10:30'],
[['ana', 5, 1, 'overlap'], ['chi', 6, 8, 'short_rest'], ['chi', 8, 2, 'short_rest'],
['chi', 2, 4, 'short_rest']]),
('normal control 8',
[[['dev', 0, 360], ['dev', 1021, 1501], ['ana', 0, 720], ['ana', 1350, 2070], ['dev', 0, 600],
['dev', 2132, 2492]],
'10:31'],
[['ana', 2, 3, 'short_rest'], ['dev', 0, 4, 'overlap'], ['dev', 4, 1, 'short_rest']])],
[('regression: rest minutes dropped 1',
[[['ben', 5180, 5660], ['ben', 3320, 3680], ['ben', 2000, 2720]], '10:30'],
[['ben', 2, 1, 'short_rest']]),
('regression variant: rest minutes dropped 2',
[[['dev', 0, 360], ['dev', 1021, 1501], ['ana', 0, 720], ['ana', 1350, 2070], ['dev', 0, 600],
['dev', 2132, 2492]],
'10:31'],
[['ana', 2, 3, 'short_rest'], ['dev', 0, 4, 'overlap'], ['dev', 4, 1, 'short_rest']]),
('partial repair guard 3',
[[['ben', 1140, 1740], ['ben', 3270, 3870], ['chi', 1620, 2220], ['ana', 2189, 2429], ['ana', 1320, 1560],
['chi', 3211, 3571], ['ben', 300, 540], ['ben', 2401, 2641], ['chi', 2851, 3331], ['ana', 3058, 3658],
['chi', 300, 1020]],
'10:31'],
[['ana', 4, 3, 'short_rest'], ['ana', 3, 9, 'short_rest'], ['ben', 6, 0, 'short_rest'],
['ben', 7, 1, 'short_rest'], ['chi', 10, 2, 'short_rest'], ['chi', 8, 5, 'overlap']]),
('boundary control 4', [[['ana', 0, 480], ['ana', 1139, 1620]], '11:00'], [['ana', 0, 1, 'short_rest']]),
('boundary control 5', [[['ben', 0, 480], ['ben', 1110, 1400]], '10:30'], []),
('normal control 6',
[[['chi', 1560, 1800], ['ben', 3509, 3989], ['chi', 1320, 1680], ['ana', 1320, 1800], ['chi', 2700, 3060],
['ben', 300, 780], ['ana', 3800, 4040], ['ana', 6440, 6920], ['ben', 2280, 2880], ['ana', 4700, 4940]],
'12:00'],
[['ana', 6, 9, 'short_rest'], ['ben', 8, 1, 'short_rest'], ['chi', 2, 0, 'overlap']]),
('normal control 7',
[[['dev', 2000, 2360], ['chi', 1440, 2040], ['dev', 2990, 3470], ['ana', 1381, 1981], ['chi', 1500, 1740],
['chi', 300, 900], ['ana', 2610, 3090], ['ana', 0, 720]],
'10:31'],
[['ana', 3, 6, 'short_rest'], ['chi', 5, 1, 'short_rest'], ['chi', 1, 4, 'overlap'],
['dev', 0, 2, 'short_rest']]),
('normal control 8',
[[['ben', 1320, 1560], ['dev', 1320, 1800], ['dev', 4980, 5460], ['dev', 3800, 4280], ['ben', 2190, 2670]],
'11:00'],
[['ben', 0, 4, 'short_rest']])]]
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: rest minutes dropped 1 | [] | [['chi', 1, 3, 'short_rest']] | Failed |
| regression variant: rest minutes dropped 2 | [['dev', 5, 0, 'overlap']] | [['ana', 4, 7, 'short_rest'], ['dev', 5, 0, 'overlap'], ['dev', 5, 3, 'short_rest']] | Failed |
| partial repair guard 3 | [] | [['chi', 0, 3, 'short_rest']] | Failed |
| boundary control 4 | [['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']] | [['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']] | Passed |
| boundary control 5 | [['ana', 0, 1, 'short_rest']] | [['ana', 0, 1, 'short_rest']] | Passed |
| normal control 6 | [['ana', 6, 9, 'short_rest'], ['ben', 8, 1, 'short_rest'], ['chi', 2, 0, 'overlap']] | [['ana', 6, 9, 'short_rest'], ['ben', 8, 1, 'short_rest'], ['chi', 2, 0, 'overlap']] | Passed |
| normal control 7 | [['chi', 7, 9, 'short_rest'], ['chi', 9, 6, 'overlap'], ['dev', 3, 1, 'overlap'], ['dev', 1, 4, 'overlap']] | [['chi', 7, 9, 'short_rest'], ['chi', 9, 6, 'overlap'], ['dev', 3, 1, 'overlap'], ['dev', 1, 4, 'overlap']] | Passed |
| normal control 8 | [['ana', 8, 9, 'overlap'], ['ana', 9, 3, 'short_rest'], ['ben', 2, 7, 'short_rest'], ['ben', 7, 1, 'overlap'], ['ben', 1, 0, 'short_rest'], ['chi', 5, 4, 'short_rest'], ['chi', 4, 6, 'overlap']] | [['ana', 8, 9, 'overlap'], ['ana', 9, 3, 'short_rest'], ['ben', 2, 7, 'short_rest'], ['ben', 7, 1, 'overlap'], ['ben', 1, 0, 'short_rest'], ['chi', 5, 4, 'short_rest'], ['chi', 4, 6, 'overlap']] | Passed |
SHA-256 / 7b74bef1d639270b39037becea3bd107a26d4aba95f6920a4abfd7b54d60daa4
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(shifts, min_rest):
h, m = min_rest.split(':')
limit = int(h) * 100 + int(m)
by = {}
for i, (w, s, e) in enumerate(shifts):
by.setdefault(w, []).append((s, e, i))
out = []
for w in sorted(by):
seq = sorted(by[w])
prev = None
for s, e, i in seq:
if prev is not None:
pe, pi = prev
gap = s - pe
if gap < 0:
out.append([w, pi, i, 'overlap'])
elif gap < limit:
out.append([w, pi, i, 'short_rest'])
if prev is None or e > prev[0]:
prev = (e, i)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: rest minutes dropped 1',
[[['chi', 3540, 3780], ['chi', 1320, 1560], ['chi', 4411, 4651], ['chi', 2189, 2909]], '10:30'],
[['chi', 1, 3, 'short_rest']]),
('regression variant: rest minutes dropped 2',
[[['dev', 2000, 2360], ['ana', 5060, 5540], ['ben', 300, 780], ['dev', 3049, 3769], ['ana', 2000, 2360],
['dev', 1940, 2420], ['ben', 1441, 2041], ['ana', 2960, 3560]],
'10:31'],
[['ana', 4, 7, 'short_rest'], ['dev', 5, 0, 'overlap'], ['dev', 5, 3, 'short_rest']]),
('partial repair guard 3',
[[['chi', 2000, 2240], ['ana', 2551, 3271], ['ana', 1320, 1920], ['chi', 2840, 3200], ['ana', 3931, 4651]],
'10:31'],
[['chi', 0, 3, 'short_rest']]),
('boundary control 4', [[['ana', 0, 900], ['ana', 100, 300], ['ana', 600, 800]], '11:00'],
[['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']]),
('boundary control 5', [[['ana', 0, 480], ['ana', 1139, 1620]], '11:00'], [['ana', 0, 1, 'short_rest']]),
('normal control 6',
[[['chi', 1560, 1800], ['ben', 3509, 3989], ['chi', 1320, 1680], ['ana', 1320, 1800], ['chi', 2700, 3060],
['ben', 300, 780], ['ana', 3800, 4040], ['ana', 6440, 6920], ['ben', 2280, 2880], ['ana', 4700, 4940]],
'12:00'],
[['ana', 6, 9, 'short_rest'], ['ben', 8, 1, 'short_rest'], ['chi', 2, 0, 'overlap']]),
('normal control 7',
[[['dev', 0, 480], ['dev', 1741, 2461], ['ben', 2620, 3340], ['dev', 1141, 1861], ['dev', 2431, 3151],
['ben', 1360, 1720], ['chi', 2461, 2821], ['chi', 1320, 1800], ['ben', 300, 660], ['chi', 2401, 3001]],
'11:00'],
[['chi', 7, 9, 'short_rest'], ['chi', 9, 6, 'overlap'], ['dev', 3, 1, 'overlap'],
['dev', 1, 4, 'overlap']]),
('normal control 8',
[[['ben', 2911, 3391], ['ben', 1921, 2281], ['ben', 300, 1020], ['ana', 1170, 1770], ['chi', 1200, 1920],
['chi', 0, 600], ['chi', 1800, 2160], ['ben', 1681, 2041], ['ana', 0, 720], ['ana', 690, 1170]],
'12:00'],
[['ana', 8, 9, 'overlap'], ['ana', 9, 3, 'short_rest'], ['ben', 2, 7, 'short_rest'],
['ben', 7, 1, 'overlap'], ['ben', 1, 0, 'short_rest'], ['chi', 5, 4, 'short_rest'],
['chi', 4, 6, 'overlap']])],
[('regression: rest minutes dropped 1',
[[['chi', 2000, 2240], ['ana', 2551, 3271], ['ana', 1320, 1920], ['chi', 2840, 3200], ['ana', 3931, 4651]],
'10:31'],
[['chi', 0, 3, 'short_rest']]),
('regression variant: rest minutes dropped 2',
[[['dev', 0, 600], ['ben', 330, 1050], ['dev', 0, 720], ['dev', 1141, 1861], ['chi', 300, 660],
['dev', 0, 480], ['chi', 3480, 3840], ['chi', 1320, 1800], ['ben', 0, 360], ['chi', 2400, 2880]],
'10:31'],
[['ben', 8, 1, 'overlap'], ['chi', 7, 9, 'short_rest'], ['chi', 9, 6, 'short_rest'],
['dev', 5, 0, 'overlap'], ['dev', 0, 2, 'overlap'], ['dev', 2, 3, 'short_rest']]),
('partial repair guard 3',
[[['ben', 1300, 2020], ['ben', 360, 600], ['ben', 0, 360], ['ben', 3520, 4120]], '10:31'],
[['ben', 2, 1, 'short_rest']]),
('boundary control 4', [[['ben', 0, 480], ['ben', 1110, 1400]], '10:30'], []),
('boundary control 5', [[['ana', 0, 480], ['ana', 480, 960], ['ben', 0, 480]], '10:30'],
[['ana', 0, 1, 'short_rest']]),
('normal control 6',
[[['dev', 1320, 1680], ['chi', 2360, 2840], ['chi', 3440, 3920], ['dev', 0, 720], ['ben', 1320, 1920],
['chi', 2000, 2480], ['ben', 1890, 2610], ['dev', 2280, 2880], ['chi', 3500, 4100]],
'11:00'],
[['ben', 4, 6, 'overlap'], ['chi', 5, 1, 'overlap'], ['chi', 1, 2, 'short_rest'], ['chi', 2, 8, 'overlap'],
['dev', 3, 0, 'short_rest'], ['dev', 0, 7, 'short_rest']]),
('normal control 7',
[[['ben', 2000, 2480], ['dev', 0, 480], ['dev', 1380, 1740], ['chi', 1320, 1560], ['dev', 2370, 2730],
['chi', 1530, 1890], ['dev', 3330, 4050], ['ben', 2360, 3080]],
'11:00'],
[['ben', 0, 7, 'overlap'], ['chi', 3, 5, 'overlap'], ['dev', 2, 4, 'short_rest'],
['dev', 4, 6, 'short_rest']]),
('normal control 8',
[[['chi', 2480, 2720], ['chi', 2000, 2600], ['chi', 4720, 5080], ['chi', 5740, 5980]], '09:45'],
[['chi', 1, 0, 'overlap']])],
[('regression: rest minutes dropped 1',
[[['ana', 869, 1229], ['chi', 7240, 7600], ['dev', 1920, 2280], ['ana', 0, 240], ['dev', 1320, 2040],
['ana', 2129, 2489], ['dev', 2250, 2730], ['chi', 3620, 4100], ['chi', 2000, 2720],
['chi', 5000, 5240]],
'10:30'],
[['ana', 3, 0, 'short_rest'], ['dev', 4, 2, 'overlap'], ['dev', 2, 6, 'overlap']]),
('regression variant: rest minutes dropped 2',
[[['dev', 3229, 3829], ['ana', 2950, 3670], ['ana', 1530, 2250], ['ben', 1920, 2640], ['ana', 300, 900],
['dev', 5829, 6429], ['ben', 3240, 3720], ['ana', 4331, 4931], ['ben', 1320, 1920],
['dev', 2000, 2600]],
'10:31'],
[['ana', 4, 2, 'short_rest'], ['ben', 8, 3, 'short_rest'], ['ben', 3, 6, 'short_rest'],
['dev', 9, 0, 'short_rest']]),
('partial repair guard 3', [[['ben', 1320, 1800], ['ben', 300, 660]], '10:31'], []),
('boundary control 4', [[['ana', 1200, 1680], ['ana', 0, 480]], '11:00'], []),
('boundary control 5', [[['ana', 0, 480], ['ana', 1140, 1620]], '11:00'], []),
('normal control 6',
[[['dev', 2000, 2480], ['dev', 4231, 4951], ['ana', 0, 240], ['chi', 1860, 2340], ['dev', 3120, 3600],
['chi', 1260, 1860], ['dev', 1940, 2420], ['ana', 901, 1501], ['chi', 1320, 1680]],
'09:45'],
[['chi', 5, 8, 'overlap'], ['chi', 5, 3, 'short_rest'], ['dev', 6, 0, 'overlap']]),
('normal control 7',
[[['ben', 2671, 3031], ['ben', 1320, 2040], ['dev', 0, 480], ['ben', 4922, 5282], ['ben', 3662, 4022],
['dev', 480, 840], ['ana', 2871, 3111], ['ana', 2000, 2240]],
'09:45'],
[['dev', 2, 5, 'short_rest']]),
('normal control 8',
[[['dev', 1440, 1800], ['dev', 3800, 4040], ['dev', 4700, 5060], ['dev', 1320, 1560]], '10:30'],
[['dev', 3, 0, 'overlap']])],
[('regression: rest minutes dropped 1',
[[['ana', 1380, 1620], ['dev', 3420, 3660], ['ana', 3241, 3841], ['ana', 2220, 2580], ['ben', 4841, 5201],
['ana', 300, 780], ['ben', 3460, 4180], ['ben', 1320, 1800], ['dev', 1320, 1920], ['dev', 3540, 4260],
['ben', 2500, 2860]],
'10:30'],
[['ana', 5, 0, 'short_rest'], ['ana', 0, 3, 'short_rest'], ['ben', 10, 6, 'short_rest'],
['dev', 1, 9, 'overlap']]),
('regression variant: rest minutes dropped 2',
[[['chi', 2760, 3240], ['chi', 1320, 1920], ['chi', 2520, 2880], ['ana', 1650, 2010], ['dev', 2000, 2240],
['dev', 3140, 3860], ['ana', 300, 1020]],
'10:31'],
[['ana', 6, 3, 'short_rest'], ['chi', 1, 2, 'short_rest'], ['chi', 2, 0, 'overlap']]),
('partial repair guard 3',
[[['dev', 2551, 3031], ['dev', 1411, 1651], ['dev', 3031, 3391], ['dev', 300, 780]], '10:30'],
[['dev', 0, 2, 'short_rest']]),
('boundary control 4', [[['ben', 0, 480], ['ben', 3400, 3800]], '11:00'], []),
('boundary control 5', [[['ana', 0, 900], ['ana', 100, 300], ['ana', 600, 800]], '11:00'],
[['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']]),
('normal control 6',
[[['chi', 3180, 3780], ['dev', 1320, 1680], ['dev', 1560, 2040], ['dev', 5340, 5580], ['chi', 1320, 1680],
['dev', 4040, 4640]],
'09:45'],
[['dev', 1, 2, 'overlap']]),
('normal control 7',
[[['dev', 1320, 1800], ['ana', 2690, 3410], ['chi', 3440, 4040], ['dev', 4720, 5200], ['chi', 4040, 4640],
['ana', 2000, 2720], ['chi', 2000, 2600], ['dev', 2500, 3220], ['chi', 2600, 2840]],
'10:30'],
[['ana', 5, 1, 'overlap'], ['chi', 6, 8, 'short_rest'], ['chi', 8, 2, 'short_rest'],
['chi', 2, 4, 'short_rest']]),
('normal control 8',
[[['dev', 0, 360], ['dev', 1021, 1501], ['ana', 0, 720], ['ana', 1350, 2070], ['dev', 0, 600],
['dev', 2132, 2492]],
'10:31'],
[['ana', 2, 3, 'short_rest'], ['dev', 0, 4, 'overlap'], ['dev', 4, 1, 'short_rest']])],
[('regression: rest minutes dropped 1',
[[['ben', 5180, 5660], ['ben', 3320, 3680], ['ben', 2000, 2720]], '10:30'],
[['ben', 2, 1, 'short_rest']]),
('regression variant: rest minutes dropped 2',
[[['dev', 0, 360], ['dev', 1021, 1501], ['ana', 0, 720], ['ana', 1350, 2070], ['dev', 0, 600],
['dev', 2132, 2492]],
'10:31'],
[['ana', 2, 3, 'short_rest'], ['dev', 0, 4, 'overlap'], ['dev', 4, 1, 'short_rest']]),
('partial repair guard 3',
[[['ben', 1140, 1740], ['ben', 3270, 3870], ['chi', 1620, 2220], ['ana', 2189, 2429], ['ana', 1320, 1560],
['chi', 3211, 3571], ['ben', 300, 540], ['ben', 2401, 2641], ['chi', 2851, 3331], ['ana', 3058, 3658],
['chi', 300, 1020]],
'10:31'],
[['ana', 4, 3, 'short_rest'], ['ana', 3, 9, 'short_rest'], ['ben', 6, 0, 'short_rest'],
['ben', 7, 1, 'short_rest'], ['chi', 10, 2, 'short_rest'], ['chi', 8, 5, 'overlap']]),
('boundary control 4', [[['ana', 0, 480], ['ana', 1139, 1620]], '11:00'], [['ana', 0, 1, 'short_rest']]),
('boundary control 5', [[['ben', 0, 480], ['ben', 1110, 1400]], '10:30'], []),
('normal control 6',
[[['chi', 1560, 1800], ['ben', 3509, 3989], ['chi', 1320, 1680], ['ana', 1320, 1800], ['chi', 2700, 3060],
['ben', 300, 780], ['ana', 3800, 4040], ['ana', 6440, 6920], ['ben', 2280, 2880], ['ana', 4700, 4940]],
'12:00'],
[['ana', 6, 9, 'short_rest'], ['ben', 8, 1, 'short_rest'], ['chi', 2, 0, 'overlap']]),
('normal control 7',
[[['dev', 2000, 2360], ['chi', 1440, 2040], ['dev', 2990, 3470], ['ana', 1381, 1981], ['chi', 1500, 1740],
['chi', 300, 900], ['ana', 2610, 3090], ['ana', 0, 720]],
'10:31'],
[['ana', 3, 6, 'short_rest'], ['chi', 5, 1, 'short_rest'], ['chi', 1, 4, 'overlap'],
['dev', 0, 2, 'short_rest']]),
('normal control 8',
[[['ben', 1320, 1560], ['dev', 1320, 1800], ['dev', 4980, 5460], ['dev', 3800, 4280], ['ben', 2190, 2670]],
'11:00'],
[['ben', 0, 4, 'short_rest']])]]
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: rest minutes dropped 1 | [['chi', 1, 3, 'short_rest'], ['chi', 3, 0, 'short_rest'], ['chi', 0, 2, 'short_rest']] | [['chi', 1, 3, 'short_rest']] | Failed |
| regression variant: rest minutes dropped 2 | [['ana', 4, 7, 'short_rest'], ['ben', 2, 6, 'short_rest'], ['dev', 5, 0, 'overlap'], ['dev', 5, 3, 'short_rest']] | [['ana', 4, 7, 'short_rest'], ['dev', 5, 0, 'overlap'], ['dev', 5, 3, 'short_rest']] | Failed |
| partial repair guard 3 | [['ana', 2, 1, 'short_rest'], ['ana', 1, 4, 'short_rest'], ['chi', 0, 3, 'short_rest']] | [['chi', 0, 3, 'short_rest']] | Failed |
| boundary control 4 | [['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']] | [['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']] | Passed |
| boundary control 5 | [['ana', 0, 1, 'short_rest']] | [['ana', 0, 1, 'short_rest']] | Passed |
| normal control 6 | [['ana', 6, 9, 'short_rest'], ['ben', 8, 1, 'short_rest'], ['chi', 2, 0, 'overlap'], ['chi', 0, 4, 'short_rest']] | [['ana', 6, 9, 'short_rest'], ['ben', 8, 1, 'short_rest'], ['chi', 2, 0, 'overlap']] | Failed |
| normal control 7 | [['ben', 8, 5, 'short_rest'], ['ben', 5, 2, 'short_rest'], ['chi', 7, 9, 'short_rest'], ['chi', 9, 6, 'overlap'], ['dev', 0, 3, 'short_rest'], ['dev', 3, 1, 'overlap'], ['dev', 1, 4, 'overlap']] | [['chi', 7, 9, 'short_rest'], ['chi', 9, 6, 'overlap'], ['dev', 3, 1, 'overlap'], ['dev', 1, 4, 'overlap']] | Failed |
| normal control 8 | [['ana', 8, 9, 'overlap'], ['ana', 9, 3, 'short_rest'], ['ben', 2, 7, 'short_rest'], ['ben', 7, 1, 'overlap'], ['ben', 1, 0, 'short_rest'], ['chi', 5, 4, 'short_rest'], ['chi', 4, 6, 'overlap']] | [['ana', 8, 9, 'overlap'], ['ana', 9, 3, 'short_rest'], ['ben', 2, 7, 'short_rest'], ['ben', 7, 1, 'overlap'], ['ben', 1, 0, 'short_rest'], ['chi', 5, 4, 'short_rest'], ['chi', 4, 6, 'overlap']] | Passed |
SHA-256 / 0ce417dfdc2057ff41ac69e65bc5e3859e34d597abe276d528355b006c5a8bf5
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(shifts, min_rest):
h, m = min_rest.split(':')
limit = int(h) * 60 + int(m)
by = {}
for i, (w, s, e) in enumerate(shifts):
by.setdefault(w, []).append((s, e, i))
out = []
for w in sorted(by):
seq = sorted(by[w])
prev = None
for s, e, i in seq:
if prev is not None:
pe, pi = prev
gap = s - pe
if gap < 0:
out.append([w, pi, i, 'overlap'])
elif gap < limit:
out.append([w, pi, i, 'short_rest'])
if prev is None or e > prev[0]:
prev = (e, i)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: rest minutes dropped 1',
[[['chi', 3540, 3780], ['chi', 1320, 1560], ['chi', 4411, 4651], ['chi', 2189, 2909]], '10:30'],
[['chi', 1, 3, 'short_rest']]),
('regression variant: rest minutes dropped 2',
[[['dev', 2000, 2360], ['ana', 5060, 5540], ['ben', 300, 780], ['dev', 3049, 3769], ['ana', 2000, 2360],
['dev', 1940, 2420], ['ben', 1441, 2041], ['ana', 2960, 3560]],
'10:31'],
[['ana', 4, 7, 'short_rest'], ['dev', 5, 0, 'overlap'], ['dev', 5, 3, 'short_rest']]),
('partial repair guard 3',
[[['chi', 2000, 2240], ['ana', 2551, 3271], ['ana', 1320, 1920], ['chi', 2840, 3200], ['ana', 3931, 4651]],
'10:31'],
[['chi', 0, 3, 'short_rest']]),
('boundary control 4', [[['ana', 0, 900], ['ana', 100, 300], ['ana', 600, 800]], '11:00'],
[['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']]),
('boundary control 5', [[['ana', 0, 480], ['ana', 1139, 1620]], '11:00'], [['ana', 0, 1, 'short_rest']]),
('normal control 6',
[[['chi', 1560, 1800], ['ben', 3509, 3989], ['chi', 1320, 1680], ['ana', 1320, 1800], ['chi', 2700, 3060],
['ben', 300, 780], ['ana', 3800, 4040], ['ana', 6440, 6920], ['ben', 2280, 2880], ['ana', 4700, 4940]],
'12:00'],
[['ana', 6, 9, 'short_rest'], ['ben', 8, 1, 'short_rest'], ['chi', 2, 0, 'overlap']]),
('normal control 7',
[[['dev', 0, 480], ['dev', 1741, 2461], ['ben', 2620, 3340], ['dev', 1141, 1861], ['dev', 2431, 3151],
['ben', 1360, 1720], ['chi', 2461, 2821], ['chi', 1320, 1800], ['ben', 300, 660], ['chi', 2401, 3001]],
'11:00'],
[['chi', 7, 9, 'short_rest'], ['chi', 9, 6, 'overlap'], ['dev', 3, 1, 'overlap'],
['dev', 1, 4, 'overlap']]),
('normal control 8',
[[['ben', 2911, 3391], ['ben', 1921, 2281], ['ben', 300, 1020], ['ana', 1170, 1770], ['chi', 1200, 1920],
['chi', 0, 600], ['chi', 1800, 2160], ['ben', 1681, 2041], ['ana', 0, 720], ['ana', 690, 1170]],
'12:00'],
[['ana', 8, 9, 'overlap'], ['ana', 9, 3, 'short_rest'], ['ben', 2, 7, 'short_rest'],
['ben', 7, 1, 'overlap'], ['ben', 1, 0, 'short_rest'], ['chi', 5, 4, 'short_rest'],
['chi', 4, 6, 'overlap']])],
[('regression: rest minutes dropped 1',
[[['chi', 2000, 2240], ['ana', 2551, 3271], ['ana', 1320, 1920], ['chi', 2840, 3200], ['ana', 3931, 4651]],
'10:31'],
[['chi', 0, 3, 'short_rest']]),
('regression variant: rest minutes dropped 2',
[[['dev', 0, 600], ['ben', 330, 1050], ['dev', 0, 720], ['dev', 1141, 1861], ['chi', 300, 660],
['dev', 0, 480], ['chi', 3480, 3840], ['chi', 1320, 1800], ['ben', 0, 360], ['chi', 2400, 2880]],
'10:31'],
[['ben', 8, 1, 'overlap'], ['chi', 7, 9, 'short_rest'], ['chi', 9, 6, 'short_rest'],
['dev', 5, 0, 'overlap'], ['dev', 0, 2, 'overlap'], ['dev', 2, 3, 'short_rest']]),
('partial repair guard 3',
[[['ben', 1300, 2020], ['ben', 360, 600], ['ben', 0, 360], ['ben', 3520, 4120]], '10:31'],
[['ben', 2, 1, 'short_rest']]),
('boundary control 4', [[['ben', 0, 480], ['ben', 1110, 1400]], '10:30'], []),
('boundary control 5', [[['ana', 0, 480], ['ana', 480, 960], ['ben', 0, 480]], '10:30'],
[['ana', 0, 1, 'short_rest']]),
('normal control 6',
[[['dev', 1320, 1680], ['chi', 2360, 2840], ['chi', 3440, 3920], ['dev', 0, 720], ['ben', 1320, 1920],
['chi', 2000, 2480], ['ben', 1890, 2610], ['dev', 2280, 2880], ['chi', 3500, 4100]],
'11:00'],
[['ben', 4, 6, 'overlap'], ['chi', 5, 1, 'overlap'], ['chi', 1, 2, 'short_rest'], ['chi', 2, 8, 'overlap'],
['dev', 3, 0, 'short_rest'], ['dev', 0, 7, 'short_rest']]),
('normal control 7',
[[['ben', 2000, 2480], ['dev', 0, 480], ['dev', 1380, 1740], ['chi', 1320, 1560], ['dev', 2370, 2730],
['chi', 1530, 1890], ['dev', 3330, 4050], ['ben', 2360, 3080]],
'11:00'],
[['ben', 0, 7, 'overlap'], ['chi', 3, 5, 'overlap'], ['dev', 2, 4, 'short_rest'],
['dev', 4, 6, 'short_rest']]),
('normal control 8',
[[['chi', 2480, 2720], ['chi', 2000, 2600], ['chi', 4720, 5080], ['chi', 5740, 5980]], '09:45'],
[['chi', 1, 0, 'overlap']])],
[('regression: rest minutes dropped 1',
[[['ana', 869, 1229], ['chi', 7240, 7600], ['dev', 1920, 2280], ['ana', 0, 240], ['dev', 1320, 2040],
['ana', 2129, 2489], ['dev', 2250, 2730], ['chi', 3620, 4100], ['chi', 2000, 2720],
['chi', 5000, 5240]],
'10:30'],
[['ana', 3, 0, 'short_rest'], ['dev', 4, 2, 'overlap'], ['dev', 2, 6, 'overlap']]),
('regression variant: rest minutes dropped 2',
[[['dev', 3229, 3829], ['ana', 2950, 3670], ['ana', 1530, 2250], ['ben', 1920, 2640], ['ana', 300, 900],
['dev', 5829, 6429], ['ben', 3240, 3720], ['ana', 4331, 4931], ['ben', 1320, 1920],
['dev', 2000, 2600]],
'10:31'],
[['ana', 4, 2, 'short_rest'], ['ben', 8, 3, 'short_rest'], ['ben', 3, 6, 'short_rest'],
['dev', 9, 0, 'short_rest']]),
('partial repair guard 3', [[['ben', 1320, 1800], ['ben', 300, 660]], '10:31'], []),
('boundary control 4', [[['ana', 1200, 1680], ['ana', 0, 480]], '11:00'], []),
('boundary control 5', [[['ana', 0, 480], ['ana', 1140, 1620]], '11:00'], []),
('normal control 6',
[[['dev', 2000, 2480], ['dev', 4231, 4951], ['ana', 0, 240], ['chi', 1860, 2340], ['dev', 3120, 3600],
['chi', 1260, 1860], ['dev', 1940, 2420], ['ana', 901, 1501], ['chi', 1320, 1680]],
'09:45'],
[['chi', 5, 8, 'overlap'], ['chi', 5, 3, 'short_rest'], ['dev', 6, 0, 'overlap']]),
('normal control 7',
[[['ben', 2671, 3031], ['ben', 1320, 2040], ['dev', 0, 480], ['ben', 4922, 5282], ['ben', 3662, 4022],
['dev', 480, 840], ['ana', 2871, 3111], ['ana', 2000, 2240]],
'09:45'],
[['dev', 2, 5, 'short_rest']]),
('normal control 8',
[[['dev', 1440, 1800], ['dev', 3800, 4040], ['dev', 4700, 5060], ['dev', 1320, 1560]], '10:30'],
[['dev', 3, 0, 'overlap']])],
[('regression: rest minutes dropped 1',
[[['ana', 1380, 1620], ['dev', 3420, 3660], ['ana', 3241, 3841], ['ana', 2220, 2580], ['ben', 4841, 5201],
['ana', 300, 780], ['ben', 3460, 4180], ['ben', 1320, 1800], ['dev', 1320, 1920], ['dev', 3540, 4260],
['ben', 2500, 2860]],
'10:30'],
[['ana', 5, 0, 'short_rest'], ['ana', 0, 3, 'short_rest'], ['ben', 10, 6, 'short_rest'],
['dev', 1, 9, 'overlap']]),
('regression variant: rest minutes dropped 2',
[[['chi', 2760, 3240], ['chi', 1320, 1920], ['chi', 2520, 2880], ['ana', 1650, 2010], ['dev', 2000, 2240],
['dev', 3140, 3860], ['ana', 300, 1020]],
'10:31'],
[['ana', 6, 3, 'short_rest'], ['chi', 1, 2, 'short_rest'], ['chi', 2, 0, 'overlap']]),
('partial repair guard 3',
[[['dev', 2551, 3031], ['dev', 1411, 1651], ['dev', 3031, 3391], ['dev', 300, 780]], '10:30'],
[['dev', 0, 2, 'short_rest']]),
('boundary control 4', [[['ben', 0, 480], ['ben', 3400, 3800]], '11:00'], []),
('boundary control 5', [[['ana', 0, 900], ['ana', 100, 300], ['ana', 600, 800]], '11:00'],
[['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']]),
('normal control 6',
[[['chi', 3180, 3780], ['dev', 1320, 1680], ['dev', 1560, 2040], ['dev', 5340, 5580], ['chi', 1320, 1680],
['dev', 4040, 4640]],
'09:45'],
[['dev', 1, 2, 'overlap']]),
('normal control 7',
[[['dev', 1320, 1800], ['ana', 2690, 3410], ['chi', 3440, 4040], ['dev', 4720, 5200], ['chi', 4040, 4640],
['ana', 2000, 2720], ['chi', 2000, 2600], ['dev', 2500, 3220], ['chi', 2600, 2840]],
'10:30'],
[['ana', 5, 1, 'overlap'], ['chi', 6, 8, 'short_rest'], ['chi', 8, 2, 'short_rest'],
['chi', 2, 4, 'short_rest']]),
('normal control 8',
[[['dev', 0, 360], ['dev', 1021, 1501], ['ana', 0, 720], ['ana', 1350, 2070], ['dev', 0, 600],
['dev', 2132, 2492]],
'10:31'],
[['ana', 2, 3, 'short_rest'], ['dev', 0, 4, 'overlap'], ['dev', 4, 1, 'short_rest']])],
[('regression: rest minutes dropped 1',
[[['ben', 5180, 5660], ['ben', 3320, 3680], ['ben', 2000, 2720]], '10:30'],
[['ben', 2, 1, 'short_rest']]),
('regression variant: rest minutes dropped 2',
[[['dev', 0, 360], ['dev', 1021, 1501], ['ana', 0, 720], ['ana', 1350, 2070], ['dev', 0, 600],
['dev', 2132, 2492]],
'10:31'],
[['ana', 2, 3, 'short_rest'], ['dev', 0, 4, 'overlap'], ['dev', 4, 1, 'short_rest']]),
('partial repair guard 3',
[[['ben', 1140, 1740], ['ben', 3270, 3870], ['chi', 1620, 2220], ['ana', 2189, 2429], ['ana', 1320, 1560],
['chi', 3211, 3571], ['ben', 300, 540], ['ben', 2401, 2641], ['chi', 2851, 3331], ['ana', 3058, 3658],
['chi', 300, 1020]],
'10:31'],
[['ana', 4, 3, 'short_rest'], ['ana', 3, 9, 'short_rest'], ['ben', 6, 0, 'short_rest'],
['ben', 7, 1, 'short_rest'], ['chi', 10, 2, 'short_rest'], ['chi', 8, 5, 'overlap']]),
('boundary control 4', [[['ana', 0, 480], ['ana', 1139, 1620]], '11:00'], [['ana', 0, 1, 'short_rest']]),
('boundary control 5', [[['ben', 0, 480], ['ben', 1110, 1400]], '10:30'], []),
('normal control 6',
[[['chi', 1560, 1800], ['ben', 3509, 3989], ['chi', 1320, 1680], ['ana', 1320, 1800], ['chi', 2700, 3060],
['ben', 300, 780], ['ana', 3800, 4040], ['ana', 6440, 6920], ['ben', 2280, 2880], ['ana', 4700, 4940]],
'12:00'],
[['ana', 6, 9, 'short_rest'], ['ben', 8, 1, 'short_rest'], ['chi', 2, 0, 'overlap']]),
('normal control 7',
[[['dev', 2000, 2360], ['chi', 1440, 2040], ['dev', 2990, 3470], ['ana', 1381, 1981], ['chi', 1500, 1740],
['chi', 300, 900], ['ana', 2610, 3090], ['ana', 0, 720]],
'10:31'],
[['ana', 3, 6, 'short_rest'], ['chi', 5, 1, 'short_rest'], ['chi', 1, 4, 'overlap'],
['dev', 0, 2, 'short_rest']]),
('normal control 8',
[[['ben', 1320, 1560], ['dev', 1320, 1800], ['dev', 4980, 5460], ['dev', 3800, 4280], ['ben', 2190, 2670]],
'11:00'],
[['ben', 0, 4, 'short_rest']])]]
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: rest minutes dropped 1 | [['chi', 1, 3, 'short_rest']] | [['chi', 1, 3, 'short_rest']] | Passed |
| regression variant: rest minutes dropped 2 | [['ana', 4, 7, 'short_rest'], ['dev', 5, 0, 'overlap'], ['dev', 5, 3, 'short_rest']] | [['ana', 4, 7, 'short_rest'], ['dev', 5, 0, 'overlap'], ['dev', 5, 3, 'short_rest']] | Passed |
| partial repair guard 3 | [['chi', 0, 3, 'short_rest']] | [['chi', 0, 3, 'short_rest']] | Passed |
| boundary control 4 | [['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']] | [['ana', 0, 1, 'overlap'], ['ana', 0, 2, 'overlap']] | Passed |
| boundary control 5 | [['ana', 0, 1, 'short_rest']] | [['ana', 0, 1, 'short_rest']] | Passed |
| normal control 6 | [['ana', 6, 9, 'short_rest'], ['ben', 8, 1, 'short_rest'], ['chi', 2, 0, 'overlap']] | [['ana', 6, 9, 'short_rest'], ['ben', 8, 1, 'short_rest'], ['chi', 2, 0, 'overlap']] | Passed |
| normal control 7 | [['chi', 7, 9, 'short_rest'], ['chi', 9, 6, 'overlap'], ['dev', 3, 1, 'overlap'], ['dev', 1, 4, 'overlap']] | [['chi', 7, 9, 'short_rest'], ['chi', 9, 6, 'overlap'], ['dev', 3, 1, 'overlap'], ['dev', 1, 4, 'overlap']] | Passed |
| normal control 8 | [['ana', 8, 9, 'overlap'], ['ana', 9, 3, 'short_rest'], ['ben', 2, 7, 'short_rest'], ['ben', 7, 1, 'overlap'], ['ben', 1, 0, 'short_rest'], ['chi', 5, 4, 'short_rest'], ['chi', 4, 6, 'overlap']] | [['ana', 8, 9, 'overlap'], ['ana', 9, 3, 'short_rest'], ['ben', 2, 7, 'short_rest'], ['ben', 7, 1, 'overlap'], ['ben', 1, 0, 'short_rest'], ['chi', 5, 4, 'short_rest'], ['chi', 4, 6, 'overlap']] | Passed |
SHA-256 / f2fdfb9b92212ea6537bc173b5bdce58352f29072bc70772613135610cb733df
Verification & scope
Stipulated toy labor rule for a bounded roster model; it is not legal advice and does not claim conformance with any jurisdiction, award, or collective agreement. 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:59.005742+00:00.
Case digest / 12bcf4b59eb8de53b4d8bc7419ba0eb8516f0ef83c3ba417ef1dad2473dede4b