FA-69001 / Tide and marine navigation tables / Open access
Tidal stream diamond table: Extrapolated rate can go negative below neaps · case 01
On very small ranges the stream rate becomes negative.
ROOT CAUSE
The extrapolated rate is not floored at zero.
VERIFIED REPAIR
Floor the rate at zero after extrapolation.
Unsuccessful approach: Flooring at the neap rate discards legitimate extrapolation below neaps.
Case contract
Input [hrel, rng, sr, nr, rows]: hrel is hours relative to standard-port HW; rows lists 13 entries for HW-6..HW+6 as [direction, spring rate, neap rate] in tenths of a knot. The row is chosen by rounding hrel half up (floor(hrel+0.5)); hrel outside [-6.5,6.5) returns None. Rate = neap+(spring-neap)*k with k=(rng-nr)/(sr-nr) (not clamped), converted to knots, floored at zero and rounded to 2 decimals. Return [direction, knots].
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):
hrel,rng,sr,nr,rows=x
if hrel<-6.5 or hrel>=6.5: return None
i=math.floor(hrel+0.5)+6
d,sp,np_=rows[i]
k=(rng-nr)/(sr-nr)
rate=(np_+(sp-np_)*k)/10
return [d,round(rate,2)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('tidal stream diamond table [-3, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-3, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['060', 0.0]), ('tidal stream diamond table [-6.4, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-6.4, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['045', 0.3]), ('tidal stream diamond table [-5.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-5.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['050', 0.7]), ('tidal stream diamond table [-4.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-4.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['055', 1.05]), ('tidal stream diamond table [-2.7, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-2.7, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['060', 1.3]), ('tidal stream diamond table [-1.2, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-1.2, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['070', 0.4]), ('tidal stream diamond table [-0.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-0.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['slack', 0.0])], [('tidal stream diamond table [2, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [2, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['235', 0.0]), ('tidal stream diamond table [-2.7, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-2.7, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['060', 1.3]), ('tidal stream diamond table [-1.2, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-1.2, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['070', 0.4]), ('tidal stream diamond table [-0.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-0.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['slack', 0.0]), ('tidal stream diamond table [0.0, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [0.0, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['slack', 0.0]), ('tidal stream diamond table [0.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [0.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['230', 0.45]), ('tidal stream diamond table [1.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [1.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['235', 1.0])], [('tidal stream diamond table [-1.4, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-1.4, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['070', 0.0]), ('tidal stream diamond table [0.0, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [0.0, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['slack', 0.0]), ('tidal stream diamond table [0.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [0.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['230', 0.45]), ('tidal stream diamond table [1.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [1.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['235', 1.0]), ('tidal stream diamond table [2.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [2.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['240', 1.35]), ('tidal stream diamond table [3.49, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [3.49, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['240', 1.35]), ('tidal stream diamond table [5.6, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [5.6, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['255', 0.2])], [('tidal stream diamond table [-3, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-3, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['060', 0.0]), ('tidal stream diamond table [-3, 1.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-3, 1.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['060', 0.5]), ('tidal stream diamond table [2.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [2.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['240', 1.35]), ('tidal stream diamond table [3.49, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [3.49, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['240', 1.35]), ('tidal stream diamond table [5.6, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [5.6, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['255', 0.2]), ('tidal stream diamond table [6.2, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [6.2, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['255', 0.2]), ('tidal stream diamond table [6.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [6.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], None)], [('tidal stream diamond table [2, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [2, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['235', 0.0]), ('tidal stream diamond table [2, 1.5, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [2, 1.5, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['235', 0.55]), ('tidal stream diamond table [6.2, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [6.2, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['255', 0.2]), ('tidal stream diamond table [6.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [6.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], None), ('tidal stream diamond table [-6.6, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-6.6, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], None), ('tidal stream diamond table [-3, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-3, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['060', 0.0]), ('tidal stream diamond table [0.2, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [0.2, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['slack', 0.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 |
|---|---|---|---|
| tidal stream diamond table [-3, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['060', -0.86] | ['060', 0.0] | Failed |
| tidal stream diamond table [-6.4, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['045', 0.3] | ['045', 0.3] | Passed |
| tidal stream diamond table [-5.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['050', 0.7] | ['050', 0.7] | Passed |
| tidal stream diamond table [-4.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['055', 1.05] | ['055', 1.05] | Passed |
| tidal stream diamond table [-2.7, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['060', 1.3] | ['060', 1.3] | Passed |
| tidal stream diamond table [-1.2, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['070', 0.4] | ['070', 0.4] | Passed |
| tidal stream diamond table [-0.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['slack', 0.0] | ['slack', 0.0] | Passed |
SHA-256 / 8237aef04c1ae3a3d44b8c5aa5ac39e9bd9a81412eb73b409514363f86887954
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
hrel,rng,sr,nr,rows=x
if hrel<-6.5 or hrel>=6.5: return None
i=math.floor(hrel+0.5)+6
d,sp,np_=rows[i]
k=(rng-nr)/(sr-nr)
rate=(np_+(sp-np_)*k)/10
return [d,round(max(rate,np_/10),2)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('tidal stream diamond table [-3, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-3, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['060', 0.0]), ('tidal stream diamond table [-6.4, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-6.4, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['045', 0.3]), ('tidal stream diamond table [-5.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-5.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['050', 0.7]), ('tidal stream diamond table [-4.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-4.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['055', 1.05]), ('tidal stream diamond table [-2.7, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-2.7, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['060', 1.3]), ('tidal stream diamond table [-1.2, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-1.2, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['070', 0.4]), ('tidal stream diamond table [-0.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-0.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['slack', 0.0])], [('tidal stream diamond table [2, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [2, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['235', 0.0]), ('tidal stream diamond table [-2.7, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-2.7, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['060', 1.3]), ('tidal stream diamond table [-1.2, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-1.2, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['070', 0.4]), ('tidal stream diamond table [-0.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-0.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['slack', 0.0]), ('tidal stream diamond table [0.0, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [0.0, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['slack', 0.0]), ('tidal stream diamond table [0.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [0.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['230', 0.45]), ('tidal stream diamond table [1.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [1.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['235', 1.0])], [('tidal stream diamond table [-1.4, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-1.4, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['070', 0.0]), ('tidal stream diamond table [0.0, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [0.0, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['slack', 0.0]), ('tidal stream diamond table [0.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [0.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['230', 0.45]), ('tidal stream diamond table [1.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [1.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['235', 1.0]), ('tidal stream diamond table [2.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [2.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['240', 1.35]), ('tidal stream diamond table [3.49, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [3.49, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['240', 1.35]), ('tidal stream diamond table [5.6, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [5.6, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['255', 0.2])], [('tidal stream diamond table [-3, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-3, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['060', 0.0]), ('tidal stream diamond table [-3, 1.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-3, 1.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['060', 0.5]), ('tidal stream diamond table [2.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [2.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['240', 1.35]), ('tidal stream diamond table [3.49, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [3.49, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['240', 1.35]), ('tidal stream diamond table [5.6, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [5.6, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['255', 0.2]), ('tidal stream diamond table [6.2, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [6.2, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['255', 0.2]), ('tidal stream diamond table [6.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [6.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], None)], [('tidal stream diamond table [2, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [2, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['235', 0.0]), ('tidal stream diamond table [2, 1.5, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [2, 1.5, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['235', 0.55]), ('tidal stream diamond table [6.2, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [6.2, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['255', 0.2]), ('tidal stream diamond table [6.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [6.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], None), ('tidal stream diamond table [-6.6, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-6.6, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], None), ('tidal stream diamond table [-3, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-3, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['060', 0.0]), ('tidal stream diamond table [0.2, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [0.2, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['slack', 0.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 |
|---|---|---|---|
| tidal stream diamond table [-3, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['060', 0.9] | ['060', 0.0] | Failed |
| tidal stream diamond table [-6.4, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['045', 0.3] | ['045', 0.3] | Passed |
| tidal stream diamond table [-5.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['050', 0.7] | ['050', 0.7] | Passed |
| tidal stream diamond table [-4.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['055', 1.05] | ['055', 1.05] | Passed |
| tidal stream diamond table [-2.7, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['060', 1.3] | ['060', 1.3] | Passed |
| tidal stream diamond table [-1.2, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['070', 0.4] | ['070', 0.4] | Passed |
| tidal stream diamond table [-0.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['slack', 0.0] | ['slack', 0.0] | Passed |
SHA-256 / 00ac924e6ccb09836caa24cc5b70e4e5c035abd8031462f16396f5fd9f1b194f
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
hrel,rng,sr,nr,rows=x
if hrel<-6.5 or hrel>=6.5: return None
i=math.floor(hrel+0.5)+6
d,sp,np_=rows[i]
k=(rng-nr)/(sr-nr)
rate=(np_+(sp-np_)*k)/10
return [d,round(max(rate,0.0),2)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('tidal stream diamond table [-3, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-3, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['060', 0.0]), ('tidal stream diamond table [-6.4, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-6.4, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['045', 0.3]), ('tidal stream diamond table [-5.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-5.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['050', 0.7]), ('tidal stream diamond table [-4.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-4.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['055', 1.05]), ('tidal stream diamond table [-2.7, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-2.7, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['060', 1.3]), ('tidal stream diamond table [-1.2, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-1.2, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['070', 0.4]), ('tidal stream diamond table [-0.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-0.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['slack', 0.0])], [('tidal stream diamond table [2, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [2, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['235', 0.0]), ('tidal stream diamond table [-2.7, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-2.7, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['060', 1.3]), ('tidal stream diamond table [-1.2, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-1.2, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['070', 0.4]), ('tidal stream diamond table [-0.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-0.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['slack', 0.0]), ('tidal stream diamond table [0.0, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [0.0, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['slack', 0.0]), ('tidal stream diamond table [0.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [0.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['230', 0.45]), ('tidal stream diamond table [1.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [1.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['235', 1.0])], [('tidal stream diamond table [-1.4, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-1.4, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['070', 0.0]), ('tidal stream diamond table [0.0, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [0.0, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['slack', 0.0]), ('tidal stream diamond table [0.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [0.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['230', 0.45]), ('tidal stream diamond table [1.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [1.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['235', 1.0]), ('tidal stream diamond table [2.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [2.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['240', 1.35]), ('tidal stream diamond table [3.49, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [3.49, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['240', 1.35]), ('tidal stream diamond table [5.6, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [5.6, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['255', 0.2])], [('tidal stream diamond table [-3, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-3, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['060', 0.0]), ('tidal stream diamond table [-3, 1.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-3, 1.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['060', 0.5]), ('tidal stream diamond table [2.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [2.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['240', 1.35]), ('tidal stream diamond table [3.49, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [3.49, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['240', 1.35]), ('tidal stream diamond table [5.6, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [5.6, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['255', 0.2]), ('tidal stream diamond table [6.2, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [6.2, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['255', 0.2]), ('tidal stream diamond table [6.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [6.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], None)], [('tidal stream diamond table [2, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [2, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['235', 0.0]), ('tidal stream diamond table [2, 1.5, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [2, 1.5, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['235', 0.55]), ('tidal stream diamond table [6.2, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [6.2, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['255', 0.2]), ('tidal stream diamond table [6.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [6.5, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], None), ('tidal stream diamond table [-6.6, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-6.6, 3.0, 4.0, 2.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], None), ('tidal stream diamond table [-3, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [-3, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['060', 0.0]), ('tidal stream diamond table [0.2, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]]', [0.2, 0.8, 4.0, 3.0, [['045', 4, 2], ['050', 9, 5], ['055', 14, 7], ['060', 17, 9], ['060', 12, 6], ['070', 5, 3], ['slack', 0, 0], ['230', 6, 3], ['235', 13, 7], ['240', 18, 9], ['245', 15, 8], ['250', 9, 4], ['255', 3, 1]]], ['slack', 0.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 |
|---|---|---|---|
| tidal stream diamond table [-3, 0.8, 4.0, 3.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['060', 0.0] | ['060', 0.0] | Passed |
| tidal stream diamond table [-6.4, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['045', 0.3] | ['045', 0.3] | Passed |
| tidal stream diamond table [-5.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['050', 0.7] | ['050', 0.7] | Passed |
| tidal stream diamond table [-4.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['055', 1.05] | ['055', 1.05] | Passed |
| tidal stream diamond table [-2.7, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['060', 1.3] | ['060', 1.3] | Passed |
| tidal stream diamond table [-1.2, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['070', 0.4] | ['070', 0.4] | Passed |
| tidal stream diamond table [-0.5, 3.0, 4.0, 2.0, [["045", 4, 2], ["050", 9, 5], ["055", 14, 7], ["060", 17, 9], ["060", 12, 6], ["070", 5, 3], ["slack", 0, 0], ["230", 6, 3], ["235", 13, 7], ["240", 18, 9], ["245", 15, 8], ["250", 9, 4], ["255", 3, 1]]] | ['slack', 0.0] | ['slack', 0.0] | Passed |
SHA-256 / 9eec749418c7488439d03e04cb3a208c3c5caec5e9f5815ba50139b56e303990
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:07.413679+00:00.
Case digest / b015c2381a3094da6832e5d5c9c7fbb35db2465d971275d5dbc36b35eb1e79f4