FA-69181 / Tide and marine navigation tables / Open access
Slack water from current samples: Slack labels name the stream that ends · case 01
Flood-begins and ebb-begins are swapped in the tide table.
ROOT CAUSE
The label is chosen from the new stream sign inverted.
VERIFIED REPAIR
Label by the sign of the sample after the slack.
Unsuccessful approach: Labelling by the previous sample repeats the same inversion.
Case contract
Input [ts, vs]: sample times (minutes) and signed current (flood positive). Zero samples are skipped; a slack occurs between consecutive nonzero samples of opposite sign. With no zero samples in between, slack time is linearly interpolated; across a run of zero samples it is the midpoint of the zero run. Times round half up to minutes; the label says which stream begins. Return [[minute, "flood-begins"|"ebb-begins"], ...].
Why this case matters
Tide tables and passage plans turn published predictions into go/no-go decisions about depth, clearance and timing.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
ts,vs=x
out=[]
prev=None
for k in range(len(vs)):
if vs[k]==0: continue
if prev is not None and (vs[prev]>0)!=(vs[k]>0):
if k-prev>1:
tc=(ts[prev+1]+ts[k-1])/2
else:
tc=ts[prev]+(ts[k]-ts[prev])*vs[prev]/(vs[prev]-vs[k])
out.append([math.floor(tc+0.5),'flood-begins' if vs[k]<0 else 'ebb-begins'])
prev=k
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], []), ('slack water from current samples [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]]', [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]], [[30, 'ebb-begins'], [90, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], []), ('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']])], [('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]]', [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]], [[30, 'ebb-begins'], [90, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], []), ('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120], [-3.0, -1.0, 1.0]]', [[0, 60, 120], [-3.0, -1.0, 1.0]], [[90, 'flood-begins']])], [('slack water from current samples [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]]', [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]], [[30, 'ebb-begins'], [90, 'flood-begins']]), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120], [-3.0, -1.0, 1.0]]', [[0, 60, 120], [-3.0, -1.0, 1.0]], [[90, 'flood-begins']]), ('slack water from current samples [[0, 10, 20, 30, 40], [1.0, -1.0, 1.0, -1.0, 1.0]]', [[0, 10, 20, 30, 40], [1.0, -1.0, 1.0, -1.0, 1.0]], [[5, 'ebb-begins'], [15, 'flood-begins'], [25, 'ebb-begins'], [35, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]]', [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]], [[60, 'ebb-begins'], [150, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']])], [('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 10, 20, 30, 40], [1.0, -1.0, 1.0, -1.0, 1.0]]', [[0, 10, 20, 30, 40], [1.0, -1.0, 1.0, -1.0, 1.0]], [[5, 'ebb-begins'], [15, 'flood-begins'], [25, 'ebb-begins'], [35, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]]', [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]], [[60, 'ebb-begins'], [150, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], []), ('slack water from current samples [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]]', [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]], [[30, 'ebb-begins'], [90, 'flood-begins']])], [('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], []), ('slack water from current samples [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]]', [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]], [[30, 'ebb-begins'], [90, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], []), ('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']])]]
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 |
|---|---|---|---|
| slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]] | [[73, 'flood-begins']] | [[73, 'ebb-begins']] | Failed |
| slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]] | [[75, 'ebb-begins']] | [[75, 'flood-begins']] | Failed |
| slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]] | [] | [] | Passed |
| slack water from current samples [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]] | [[30, 'flood-begins'], [90, 'ebb-begins']] | [[30, 'ebb-begins'], [90, 'flood-begins']] | Failed |
| slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]] | [] | [] | Passed |
| slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]] | [[96, 'ebb-begins'], [180, 'flood-begins']] | [[96, 'flood-begins'], [180, 'ebb-begins']] | Failed |
| slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]] | [[35, 'flood-begins']] | [[35, 'ebb-begins']] | Failed |
SHA-256 / f59997295de5131d831344e574924d6734507cfda578e8d76cf0b5734897c799
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
ts,vs=x
out=[]
prev=None
for k in range(len(vs)):
if vs[k]==0: continue
if prev is not None and (vs[prev]>0)!=(vs[k]>0):
if k-prev>1:
tc=(ts[prev+1]+ts[k-1])/2
else:
tc=ts[prev]+(ts[k]-ts[prev])*vs[prev]/(vs[prev]-vs[k])
out.append([math.floor(tc+0.5),'flood-begins' if vs[prev]>0 else 'ebb-begins'])
prev=k
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], []), ('slack water from current samples [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]]', [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]], [[30, 'ebb-begins'], [90, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], []), ('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']])], [('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]]', [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]], [[30, 'ebb-begins'], [90, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], []), ('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120], [-3.0, -1.0, 1.0]]', [[0, 60, 120], [-3.0, -1.0, 1.0]], [[90, 'flood-begins']])], [('slack water from current samples [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]]', [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]], [[30, 'ebb-begins'], [90, 'flood-begins']]), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120], [-3.0, -1.0, 1.0]]', [[0, 60, 120], [-3.0, -1.0, 1.0]], [[90, 'flood-begins']]), ('slack water from current samples [[0, 10, 20, 30, 40], [1.0, -1.0, 1.0, -1.0, 1.0]]', [[0, 10, 20, 30, 40], [1.0, -1.0, 1.0, -1.0, 1.0]], [[5, 'ebb-begins'], [15, 'flood-begins'], [25, 'ebb-begins'], [35, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]]', [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]], [[60, 'ebb-begins'], [150, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']])], [('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 10, 20, 30, 40], [1.0, -1.0, 1.0, -1.0, 1.0]]', [[0, 10, 20, 30, 40], [1.0, -1.0, 1.0, -1.0, 1.0]], [[5, 'ebb-begins'], [15, 'flood-begins'], [25, 'ebb-begins'], [35, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]]', [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]], [[60, 'ebb-begins'], [150, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], []), ('slack water from current samples [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]]', [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]], [[30, 'ebb-begins'], [90, 'flood-begins']])], [('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], []), ('slack water from current samples [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]]', [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]], [[30, 'ebb-begins'], [90, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], []), ('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']])]]
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 |
|---|---|---|---|
| slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]] | [[73, 'flood-begins']] | [[73, 'ebb-begins']] | Failed |
| slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]] | [[75, 'ebb-begins']] | [[75, 'flood-begins']] | Failed |
| slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]] | [] | [] | Passed |
| slack water from current samples [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]] | [[30, 'flood-begins'], [90, 'ebb-begins']] | [[30, 'ebb-begins'], [90, 'flood-begins']] | Failed |
| slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]] | [] | [] | Passed |
| slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]] | [[96, 'ebb-begins'], [180, 'flood-begins']] | [[96, 'flood-begins'], [180, 'ebb-begins']] | Failed |
| slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]] | [[35, 'flood-begins']] | [[35, 'ebb-begins']] | Failed |
SHA-256 / f69eb067296fce57a683bc0e798ecefaf67c7d082b67298a17503a04b5fe2c0a
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
ts,vs=x
out=[]
prev=None
for k in range(len(vs)):
if vs[k]==0: continue
if prev is not None and (vs[prev]>0)!=(vs[k]>0):
if k-prev>1:
tc=(ts[prev+1]+ts[k-1])/2
else:
tc=ts[prev]+(ts[k]-ts[prev])*vs[prev]/(vs[prev]-vs[k])
out.append([math.floor(tc+0.5),'flood-begins' if vs[k]>0 else 'ebb-begins'])
prev=k
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], []), ('slack water from current samples [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]]', [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]], [[30, 'ebb-begins'], [90, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], []), ('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']])], [('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]]', [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]], [[30, 'ebb-begins'], [90, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], []), ('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120], [-3.0, -1.0, 1.0]]', [[0, 60, 120], [-3.0, -1.0, 1.0]], [[90, 'flood-begins']])], [('slack water from current samples [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]]', [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]], [[30, 'ebb-begins'], [90, 'flood-begins']]), ('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120], [-3.0, -1.0, 1.0]]', [[0, 60, 120], [-3.0, -1.0, 1.0]], [[90, 'flood-begins']]), ('slack water from current samples [[0, 10, 20, 30, 40], [1.0, -1.0, 1.0, -1.0, 1.0]]', [[0, 10, 20, 30, 40], [1.0, -1.0, 1.0, -1.0, 1.0]], [[5, 'ebb-begins'], [15, 'flood-begins'], [25, 'ebb-begins'], [35, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]]', [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]], [[60, 'ebb-begins'], [150, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']])], [('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 10, 20, 30, 40], [1.0, -1.0, 1.0, -1.0, 1.0]]', [[0, 10, 20, 30, 40], [1.0, -1.0, 1.0, -1.0, 1.0]], [[5, 'ebb-begins'], [15, 'flood-begins'], [25, 'ebb-begins'], [35, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]]', [[0, 30, 60, 90, 120, 150, 180], [0.9, 0.4, 0.0, -0.3, -0.2, 0.0, 0.6]], [[60, 'ebb-begins'], [150, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]]', [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]], [[73, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], []), ('slack water from current samples [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]]', [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]], [[30, 'ebb-begins'], [90, 'flood-begins']])], [('slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]]', [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]], [[35, 'ebb-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]]', [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]], [[75, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]]', [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]], []), ('slack water from current samples [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]]', [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]], [[30, 'ebb-begins'], [90, 'flood-begins']]), ('slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]]', [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]], []), ('slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]]', [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]], [[96, 'flood-begins'], [180, 'ebb-begins']]), ('slack water from current samples [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]]', [[0, 60, 120, 180], [1.0, 0.0, 0.0, -1.0]], [[90, 'ebb-begins']])]]
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 |
|---|---|---|---|
| slack water from current samples [[0, 30, 60, 90, 120, 150], [1.2, 0.8, 0.3, -0.4, -1.1, -1.5]] | [[73, 'ebb-begins']] | [[73, 'ebb-begins']] | Passed |
| slack water from current samples [[0, 30, 60, 90, 120, 150], [-1.0, -0.5, 0.0, 0.0, 0.6, 1.0]] | [[75, 'flood-begins']] | [[75, 'flood-begins']] | Passed |
| slack water from current samples [[0, 30, 60, 90, 120], [1.0, 0.0, 0.7, 1.2, 0.4]] | [] | [] | Passed |
| slack water from current samples [[0, 20, 40, 60, 80, 100, 120], [2.0, 1.0, -1.0, -2.0, -0.5, 0.5, 1.5]] | [[30, 'ebb-begins'], [90, 'flood-begins']] | [[30, 'ebb-begins'], [90, 'flood-begins']] | Passed |
| slack water from current samples [[0, 30, 60, 90], [0.0, 0.0, 1.0, 2.0]] | [] | [] | Passed |
| slack water from current samples [[0, 60, 120, 180, 240], [-0.9, -0.3, 0.2, 0.0, -0.4]] | [[96, 'flood-begins'], [180, 'ebb-begins']] | [[96, 'flood-begins'], [180, 'ebb-begins']] | Passed |
| slack water from current samples [[0, 15, 30, 45, 60], [0.5, 0.3, 0.1, -0.2, -0.3]] | [[35, 'ebb-begins']] | [[35, 'ebb-begins']] | Passed |
SHA-256 / 6ede038d22bbe352e9437b4365bd321892a64a82a85b9dfb73ae3c05cd0ca163
Verification & scope
A deterministic toy model with stipulated rules and constants; not certified hydrographic software or a substitute for official tide tables. 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:48:08.996085+00:00.
Case digest / e7c789e2666cc5fc2de3c859a9b0c165ebf0d197a5668686299d436c086cf7ed