FAILURE MAP
← Case archive

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.

Verified by executionVariant 1 · 7 checks per implementationDownload source bundle ↓JSON ↗

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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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