FA-97151 / Recipe scaling and nutrition / Open access
Shopping list aggregator: zero line suppression · case 01
Items fully covered by the pantry still appear with quantity 0.
ROOT CAUSE
Zero totals are not skipped.
VERIFIED REPAIR
Skip lines whose remaining total is zero.
Unsuccessful approach: Exempting count items still lists "0" eggs.
Case contract
Rows [name, qty, unit]. Names normalize: trim, lower, "-oes" -> drop "es", "-ies" -> "y", other trailing "s" dropped unless "ss". Volume (tsp=1, tbsp=3, cup=48 tsp), mass (g, kg=1000 g) and other units aggregate separately per name. Pantry {name: [qty, unit]} subtracts from the same name and dimension, never below 0. Output sorted by (name, dimension) as [name, str(qty), unit], skipping zero totals; volume shows cup if >=12 tsp, else tbsp if >=3 tsp, else tsp; mass shows kg if >=1000 g.
Why this case matters
Meal planners merge ingredient lists across recipes and subtract what is already in the pantry.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(recipes, pantry):
VOL = {'tsp': 1, 'tbsp': 3, 'cup': 48}
MASS = {'g': 1, 'kg': 1000}
def norm(n):
n = n.strip().lower()
if n.endswith('oes'):
return n[:-2]
if n.endswith('ies'):
return n[:-3] + 'y'
if n.endswith('s') and not n.endswith('ss'):
return n[:-1]
return n
def base(q, u):
if u in VOL:
return 'volume', Fraction(q) * VOL[u]
if u in MASS:
return 'mass', Fraction(q) * MASS[u]
return u, Fraction(q)
tot = {}
for recipe in recipes:
for name, q, u in recipe:
dim, v = base(q, u)
k = (norm(name), dim)
tot[k] = tot.get(k, 0) + v
for name, (q, u) in pantry.items():
dim, v = base(q, u)
pk = (norm(name), dim)
if pk in tot:
tot[pk] = max(Fraction(0), tot[pk] - v)
out = []
for (name, dim), v in sorted(tot.items()):
if v < 0:
continue
if dim == 'volume':
unit, v2 = ('cup', v / 48) if v >= 12 else ('tbsp', v / 3) if v >= 3 else ('tsp', v)
elif dim == 'mass':
unit, v2 = ('kg', v / 1000) if v >= 1000 else ('g', v)
else:
unit, v2 = dim, v
out.append([name, str(v2), unit])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['single recipe', [[[['flour', '1', 'cup']]], {}], [['flour', '1', 'cup']]],
['merge plurals', [[[['tomatoes', '2', 'each']], [['Tomato', '1', 'each']]], {}],
[['tomato', '3', 'each']]],
['pantry covers all', [[[['eggs', '2', 'each']]], {'egg': ['6', 'each']}], []],
['regression: zero line suppression',
[[[['flour', '1', 'kg'], ['peas', '3/4', 'cup'], ['eggs', '1', 'kg'], ['flour', '1/4', 'tbsp']],
[['berries', '4', 'cup'], ['berries', '1', 'tbsp'], ['peas', '1/2', 'tbsp'], ['peas', '1/2', 'tbsp']],
[['flour', '1/4', 'tsp']]],
{'peas': ['1', 'cup']}],
[['berry', '65/16', 'cup'], ['egg', '1', 'kg'], ['flour', '1', 'kg'], ['flour', '1', 'tsp']]],
['repair check: zero line suppression',
[[[['Tomato', '3/4', 'each'], ['flour', '3/4', 'tbsp']],
[['tomatoes', '3/4', 'g'], ['peas', '2', 'cup'], ['berry', '3', 'cup'], ['grape', '4', 'each']],
[['grapes', '4', 'tbsp'], ['egg', '1/3', 'cup'], ['eggs', '3', 'kg'], ['grape', '1/2', 'cup']]],
{'Tomato': ['3', 'each'], 'eggs': ['4', 'tbsp']}],
[['berry', '3', 'cup'], ['egg', '3', 'kg'], ['egg', '4/3', 'tbsp'], ['flour', '9/4', 'tsp'],
['grape', '4', 'each'], ['grape', '3/4', 'cup'], ['pea', '2', 'cup'], ['tomato', '3/4', 'g']]],
['generated control 1',
[[[['sugar ', '1', 'kg']],
[['Tomato', '4', 'g'], ['tomatoes', '1/4', 'cup'], ['eggs', '2', 'cup'], ['grape', '1/3', 'kg']],
[['egg', '3', 'g']]],
{}],
[['egg', '3', 'g'], ['egg', '2', 'cup'], ['grape', '1000/3', 'g'], ['sugar', '1', 'kg'],
['tomato', '4', 'g'], ['tomato', '1/4', 'cup']]],
['generated control 2',
[[[['grapes', '1/3', 'tbsp'], ['berries', '1/4', 'tsp'], ['grape', '1/4', 'kg'], ['sugar ', '1', 'kg']],
[['berries', '1/4', 'cup']], [['berries', '2', 'kg'], ['grape', '4', 'g'], ['peas', '1/2', 'kg']]],
{}],
[['berry', '2', 'kg'], ['berry', '49/192', 'cup'], ['grape', '254', 'g'], ['grape', '1', 'tsp'],
['pea', '500', 'g'], ['sugar', '1', 'kg']]],
['generated control 3',
[[[['berry', '2', 'cup'], ['watercress', '2', 'cup']], [['sugar ', '3/4', 'each']],
[['peas', '3', 'tsp'], ['watercress', '3', 'cup'], ['berry', '1', 'each']]],
{'eggs': ['1', 'tbsp']}],
[['berry', '1', 'each'], ['berry', '2', 'cup'], ['pea', '1', 'tbsp'], ['sugar', '3/4', 'each'],
['watercress', '5', 'cup']]]],
[['merge plurals', [[[['tomatoes', '2', 'each']], [['Tomato', '1', 'each']]], {}],
[['tomato', '3', 'each']]],
['pantry covers all', [[[['eggs', '2', 'each']]], {'egg': ['6', 'each']}], []],
['watercress keeps ss', [[[['watercress', '100', 'g']]], {}], [['watercress', '100', 'g']]],
['regression: zero line suppression',
[[[['eggs', '1/3', 'each'], ['sugar ', '1/4', 'kg']], [['grape', '2', 'each']]],
{'sugar ': ['3/4', 'kg']}],
[['egg', '1/3', 'each'], ['grape', '2', 'each']]],
['repair check: zero line suppression',
[[[['eggs', '3/4', 'g']], [['tomatoes', '1/3', 'each']]],
{'Tomato': ['4', 'each'], 'berries': ['3/4', 'g']}],
[['egg', '3/4', 'g']]],
['generated control 1',
[[[['berries', '1', 'each'], ['berry', '1/4', 'g']],
[['peas', '4', 'tsp'], ['potatoes', '2', 'g'], ['berry', '3', 'cup'], ['tomatoes', '4', 'tsp']],
[['flour', '3/4', 'kg']]],
{'peas': ['3/4', 'tbsp'], 'tomatoes': ['1/3', 'tbsp']}],
[['berry', '1', 'each'], ['berry', '1/4', 'g'], ['berry', '3', 'cup'], ['flour', '750', 'g'],
['pea', '7/4', 'tsp'], ['potato', '2', 'g'], ['tomato', '1', 'tbsp']]],
['generated control 2',
[[[['sugar ', '3/4', 'each'], ['peas', '3/4', 'tsp']],
[['eggs', '1/4', 'tbsp'], ['peas', '1/2', 'each'], ['egg', '2', 'tsp']]],
{'watercress': ['4', 'tbsp']}],
[['egg', '11/4', 'tsp'], ['pea', '1/2', 'each'], ['pea', '3/4', 'tsp'], ['sugar', '3/4', 'each']]],
['generated control 3',
[[[['peas', '1/4', 'cup']], [['Tomato', '1/3', 'kg']],
[['watercress', '1/2', 'g'], ['Tomato', '2', 'kg']]],
{'egg': ['1/4', 'kg']}],
[['pea', '1/4', 'cup'], ['tomato', '7/3', 'kg'], ['watercress', '1/2', 'g']]]],
[['pantry covers all', [[[['eggs', '2', 'each']]], {'egg': ['6', 'each']}], []],
['watercress keeps ss', [[[['watercress', '100', 'g']]], {}], [['watercress', '100', 'g']]],
['single recipe', [[[['flour', '1', 'cup']]], {}], [['flour', '1', 'cup']]],
['regression: zero line suppression',
[[[['grapes', '1', 'tbsp'], ['tomatoes', '2', 'tsp']], [['egg', '1/3', 'tsp']]],
{'Tomato': ['4', 'cup'], 'tomatoes': ['3/4', 'g']}],
[['egg', '1/3', 'tsp'], ['grape', '1', 'tbsp']]],
['repair check: zero line suppression',
[[[['flour', '1/4', 'g'], ['grapes', '1/4', 'kg']], [['grapes', '1/2', 'each']]],
{'grape': ['4', 'each']}],
[['flour', '1/4', 'g'], ['grape', '250', 'g']]],
['generated control 1',
[[[['eggs', '4', 'each'], ['Tomato', '1', 'cup'], ['eggs', '1/4', 'tbsp'], ['watercress', '1/3', 'cup']]],
{}],
[['egg', '4', 'each'], ['egg', '3/4', 'tsp'], ['tomato', '1', 'cup'], ['watercress', '1/3', 'cup']]],
['generated control 2',
[[[['berry', '3', 'kg']], [['berry', '2', 'g'], ['egg', '2', 'kg']]],
{'berries': ['2', 'each'], 'grape': ['1/2', 'each']}],
[['berry', '1501/500', 'kg'], ['egg', '2', 'kg']]],
['generated control 3',
[[[['Tomato', '1', 'g'], ['grape', '4', 'cup']],
[['berries', '1', 'each'], ['peas', '4', 'tsp'], ['grapes', '3', 'tsp']],
[['egg', '3/4', 'each'], ['sugar ', '3', 'each'], ['berry', '1/4', 'kg'], ['berries', '4', 'kg']]],
{'watercress': ['1/4', 'tbsp']}],
[['berry', '1', 'each'], ['berry', '17/4', 'kg'], ['egg', '3/4', 'each'], ['grape', '65/16', 'cup'],
['pea', '4/3', 'tbsp'], ['sugar', '3', 'each'], ['tomato', '1', 'g']]]],
[['watercress keeps ss', [[[['watercress', '100', 'g']]], {}], [['watercress', '100', 'g']]],
['single recipe', [[[['flour', '1', 'cup']]], {}], [['flour', '1', 'cup']]],
['merge plurals', [[[['tomatoes', '2', 'each']], [['Tomato', '1', 'each']]], {}],
[['tomato', '3', 'each']]],
['regression: zero line suppression',
[[[['watercress', '4', 'g'], ['Tomato', '1/3', 'tbsp'], ['sugar ', '1', 'g']],
[['peas', '3', 'tbsp'], ['Tomato', '1', 'tsp'], ['watercress', '1/4', 'cup']],
[['tomatoes', '1/4', 'each']]],
{'grapes': ['1/3', 'tbsp'], 'peas': ['1/3', 'cup']}],
[['sugar', '1', 'g'], ['tomato', '1/4', 'each'], ['tomato', '2', 'tsp'], ['watercress', '4', 'g'],
['watercress', '1/4', 'cup']]],
['repair check: zero line suppression',
[[[['grape', '1', 'each']], [['watercress', '1/2', 'tbsp'], ['tomatoes', '2', 'g']],
[['peas', '2', 'kg'], ['potatoes', '3', 'tbsp']]],
{'grape': ['1', 'each'], 'potatoes': ['3/4', 'g']}],
[['pea', '2', 'kg'], ['potato', '3', 'tbsp'], ['tomato', '2', 'g'], ['watercress', '3/2', 'tsp']]],
['generated control 1',
[[[['tomatoes', '1/3', 'g'], ['grape', '1/4', 'g'], ['berry', '3', 'each'], ['grape', '1', 'tbsp']],
[['grapes', '1', 'g']]],
{'egg': ['2', 'kg'], 'potatoes': ['1/3', 'kg']}],
[['berry', '3', 'each'], ['grape', '5/4', 'g'], ['grape', '1', 'tbsp'], ['tomato', '1/3', 'g']]],
['generated control 2',
[[[['grape', '1/3', 'cup'], ['eggs', '3', 'tsp'], ['eggs', '4', 'each'], ['eggs', '1/3', 'g']],
[['grapes', '1', 'kg'], ['potatoes', '1/2', 'tsp'], ['peas', '1/3', 'tbsp']]],
{'watercress': ['4', 'each']}],
[['egg', '4', 'each'], ['egg', '1/3', 'g'], ['egg', '1', 'tbsp'], ['grape', '1', 'kg'],
['grape', '1/3', 'cup'], ['pea', '1', 'tsp'], ['potato', '1/2', 'tsp']]],
['generated control 3', [[[['peas', '1/2', 'g']]], {'Tomato': ['2', 'tsp'], 'eggs': ['1/2', 'cup']}],
[['pea', '1/2', 'g']]]],
[['single recipe', [[[['flour', '1', 'cup']]], {}], [['flour', '1', 'cup']]],
['merge plurals', [[[['tomatoes', '2', 'each']], [['Tomato', '1', 'each']]], {}],
[['tomato', '3', 'each']]],
['pantry covers all', [[[['eggs', '2', 'each']]], {'egg': ['6', 'each']}], []],
['regression: zero line suppression',
[[[['flour', '4', 'tsp'], ['Tomato', '3', 'tsp'], ['sugar ', '4', 'kg'], ['egg', '1/3', 'kg']]],
{'Tomato': ['3', 'tsp']}],
[['egg', '1000/3', 'g'], ['flour', '4/3', 'tbsp'], ['sugar', '4', 'kg']]],
['repair check: zero line suppression',
[[[['sugar ', '1/3', 'cup'], ['berry', '1/2', 'kg'], ['berries', '3/4', 'each'], ['flour', '1/2', 'g']],
[['Tomato', '1/2', 'cup']], [['grape', '2', 'tbsp'], ['sugar ', '2', 'cup'], ['eggs', '3/4', 'each']]],
{'berries': ['2', 'each']}],
[['berry', '500', 'g'], ['egg', '3/4', 'each'], ['flour', '1/2', 'g'], ['grape', '2', 'tbsp'],
['sugar', '7/3', 'cup'], ['tomato', '1/2', 'cup']]],
['generated control 1',
[[[['watercress', '3', 'cup'], ['peas', '1/3', 'kg'], ['Tomato', '1/3', 'cup'], ['peas', '1/3', 'kg']],
[['Tomato', '1', 'cup'], ['flour', '3', 'each']]],
{}],
[['flour', '3', 'each'], ['pea', '2000/3', 'g'], ['tomato', '4/3', 'cup'], ['watercress', '3', 'cup']]],
['generated control 2',
[[[['potatoes', '4', 'each'], ['eggs', '3', 'kg']]], {'berries': ['3/4', 'g'], 'eggs': ['1/2', 'cup']}],
[['egg', '3', 'kg'], ['potato', '4', 'each']]],
['generated control 3',
[[[['berry', '2', 'tsp'], ['watercress', '1', 'kg']], [['potatoes', '2', 'each']],
[['flour', '1/4', 'g'], ['berries', '4', 'tbsp'], ['berry', '1/2', 'g'], ['peas', '1', 'g']]],
{'egg': ['1/3', 'g']}],
[['berry', '1/2', 'g'], ['berry', '7/24', 'cup'], ['flour', '1/4', 'g'], ['pea', '1', 'g'],
['potato', '2', 'each'], ['watercress', '1', 'kg']]]]]
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 |
|---|---|---|---|
| single recipe | [['flour', '1', 'cup']] | [['flour', '1', 'cup']] | Passed |
| merge plurals | [['tomato', '3', 'each']] | [['tomato', '3', 'each']] | Passed |
| pantry covers all | [['egg', '0', 'each']] | [] | Failed |
| regression: zero line suppression | [['berry', '65/16', 'cup'], ['egg', '1', 'kg'], ['flour', '1', 'kg'], ['flour', '1', 'tsp'], ['pea', '0', 'tsp']] | [['berry', '65/16', 'cup'], ['egg', '1', 'kg'], ['flour', '1', 'kg'], ['flour', '1', 'tsp']] | Failed |
| repair check: zero line suppression | [['berry', '3', 'cup'], ['egg', '3', 'kg'], ['egg', '4/3', 'tbsp'], ['flour', '9/4', 'tsp'], ['grape', '4', 'each'], ['grape', '3/4', 'cup'], ['pea', '2', 'cup'], ['tomato', '0', 'each'], ['tomato', '3/4', 'g']] | [['berry', '3', 'cup'], ['egg', '3', 'kg'], ['egg', '4/3', 'tbsp'], ['flour', '9/4', 'tsp'], ['grape', '4', 'each'], ['grape', '3/4', 'cup'], ['pea', '2', 'cup'], ['tomato', '3/4', 'g']] | Failed |
| generated control 1 | [['egg', '3', 'g'], ['egg', '2', 'cup'], ['grape', '1000/3', 'g'], ['sugar', '1', 'kg'], ['tomato', '4', 'g'], ['tomato', '1/4', 'cup']] | [['egg', '3', 'g'], ['egg', '2', 'cup'], ['grape', '1000/3', 'g'], ['sugar', '1', 'kg'], ['tomato', '4', 'g'], ['tomato', '1/4', 'cup']] | Passed |
| generated control 2 | [['berry', '2', 'kg'], ['berry', '49/192', 'cup'], ['grape', '254', 'g'], ['grape', '1', 'tsp'], ['pea', '500', 'g'], ['sugar', '1', 'kg']] | [['berry', '2', 'kg'], ['berry', '49/192', 'cup'], ['grape', '254', 'g'], ['grape', '1', 'tsp'], ['pea', '500', 'g'], ['sugar', '1', 'kg']] | Passed |
| generated control 3 | [['berry', '1', 'each'], ['berry', '2', 'cup'], ['pea', '1', 'tbsp'], ['sugar', '3/4', 'each'], ['watercress', '5', 'cup']] | [['berry', '1', 'each'], ['berry', '2', 'cup'], ['pea', '1', 'tbsp'], ['sugar', '3/4', 'each'], ['watercress', '5', 'cup']] | Passed |
SHA-256 / f0c33a28598f913f78082f908d3eb947b0761f2b00e11418d172e5a32be5cd76
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(recipes, pantry):
VOL = {'tsp': 1, 'tbsp': 3, 'cup': 48}
MASS = {'g': 1, 'kg': 1000}
def norm(n):
n = n.strip().lower()
if n.endswith('oes'):
return n[:-2]
if n.endswith('ies'):
return n[:-3] + 'y'
if n.endswith('s') and not n.endswith('ss'):
return n[:-1]
return n
def base(q, u):
if u in VOL:
return 'volume', Fraction(q) * VOL[u]
if u in MASS:
return 'mass', Fraction(q) * MASS[u]
return u, Fraction(q)
tot = {}
for recipe in recipes:
for name, q, u in recipe:
dim, v = base(q, u)
k = (norm(name), dim)
tot[k] = tot.get(k, 0) + v
for name, (q, u) in pantry.items():
dim, v = base(q, u)
pk = (norm(name), dim)
if pk in tot:
tot[pk] = max(Fraction(0), tot[pk] - v)
out = []
for (name, dim), v in sorted(tot.items()):
if v == 0 and dim != 'each':
continue
if dim == 'volume':
unit, v2 = ('cup', v / 48) if v >= 12 else ('tbsp', v / 3) if v >= 3 else ('tsp', v)
elif dim == 'mass':
unit, v2 = ('kg', v / 1000) if v >= 1000 else ('g', v)
else:
unit, v2 = dim, v
out.append([name, str(v2), unit])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['single recipe', [[[['flour', '1', 'cup']]], {}], [['flour', '1', 'cup']]],
['merge plurals', [[[['tomatoes', '2', 'each']], [['Tomato', '1', 'each']]], {}],
[['tomato', '3', 'each']]],
['pantry covers all', [[[['eggs', '2', 'each']]], {'egg': ['6', 'each']}], []],
['regression: zero line suppression',
[[[['flour', '1', 'kg'], ['peas', '3/4', 'cup'], ['eggs', '1', 'kg'], ['flour', '1/4', 'tbsp']],
[['berries', '4', 'cup'], ['berries', '1', 'tbsp'], ['peas', '1/2', 'tbsp'], ['peas', '1/2', 'tbsp']],
[['flour', '1/4', 'tsp']]],
{'peas': ['1', 'cup']}],
[['berry', '65/16', 'cup'], ['egg', '1', 'kg'], ['flour', '1', 'kg'], ['flour', '1', 'tsp']]],
['repair check: zero line suppression',
[[[['Tomato', '3/4', 'each'], ['flour', '3/4', 'tbsp']],
[['tomatoes', '3/4', 'g'], ['peas', '2', 'cup'], ['berry', '3', 'cup'], ['grape', '4', 'each']],
[['grapes', '4', 'tbsp'], ['egg', '1/3', 'cup'], ['eggs', '3', 'kg'], ['grape', '1/2', 'cup']]],
{'Tomato': ['3', 'each'], 'eggs': ['4', 'tbsp']}],
[['berry', '3', 'cup'], ['egg', '3', 'kg'], ['egg', '4/3', 'tbsp'], ['flour', '9/4', 'tsp'],
['grape', '4', 'each'], ['grape', '3/4', 'cup'], ['pea', '2', 'cup'], ['tomato', '3/4', 'g']]],
['generated control 1',
[[[['sugar ', '1', 'kg']],
[['Tomato', '4', 'g'], ['tomatoes', '1/4', 'cup'], ['eggs', '2', 'cup'], ['grape', '1/3', 'kg']],
[['egg', '3', 'g']]],
{}],
[['egg', '3', 'g'], ['egg', '2', 'cup'], ['grape', '1000/3', 'g'], ['sugar', '1', 'kg'],
['tomato', '4', 'g'], ['tomato', '1/4', 'cup']]],
['generated control 2',
[[[['grapes', '1/3', 'tbsp'], ['berries', '1/4', 'tsp'], ['grape', '1/4', 'kg'], ['sugar ', '1', 'kg']],
[['berries', '1/4', 'cup']], [['berries', '2', 'kg'], ['grape', '4', 'g'], ['peas', '1/2', 'kg']]],
{}],
[['berry', '2', 'kg'], ['berry', '49/192', 'cup'], ['grape', '254', 'g'], ['grape', '1', 'tsp'],
['pea', '500', 'g'], ['sugar', '1', 'kg']]],
['generated control 3',
[[[['berry', '2', 'cup'], ['watercress', '2', 'cup']], [['sugar ', '3/4', 'each']],
[['peas', '3', 'tsp'], ['watercress', '3', 'cup'], ['berry', '1', 'each']]],
{'eggs': ['1', 'tbsp']}],
[['berry', '1', 'each'], ['berry', '2', 'cup'], ['pea', '1', 'tbsp'], ['sugar', '3/4', 'each'],
['watercress', '5', 'cup']]]],
[['merge plurals', [[[['tomatoes', '2', 'each']], [['Tomato', '1', 'each']]], {}],
[['tomato', '3', 'each']]],
['pantry covers all', [[[['eggs', '2', 'each']]], {'egg': ['6', 'each']}], []],
['watercress keeps ss', [[[['watercress', '100', 'g']]], {}], [['watercress', '100', 'g']]],
['regression: zero line suppression',
[[[['eggs', '1/3', 'each'], ['sugar ', '1/4', 'kg']], [['grape', '2', 'each']]],
{'sugar ': ['3/4', 'kg']}],
[['egg', '1/3', 'each'], ['grape', '2', 'each']]],
['repair check: zero line suppression',
[[[['eggs', '3/4', 'g']], [['tomatoes', '1/3', 'each']]],
{'Tomato': ['4', 'each'], 'berries': ['3/4', 'g']}],
[['egg', '3/4', 'g']]],
['generated control 1',
[[[['berries', '1', 'each'], ['berry', '1/4', 'g']],
[['peas', '4', 'tsp'], ['potatoes', '2', 'g'], ['berry', '3', 'cup'], ['tomatoes', '4', 'tsp']],
[['flour', '3/4', 'kg']]],
{'peas': ['3/4', 'tbsp'], 'tomatoes': ['1/3', 'tbsp']}],
[['berry', '1', 'each'], ['berry', '1/4', 'g'], ['berry', '3', 'cup'], ['flour', '750', 'g'],
['pea', '7/4', 'tsp'], ['potato', '2', 'g'], ['tomato', '1', 'tbsp']]],
['generated control 2',
[[[['sugar ', '3/4', 'each'], ['peas', '3/4', 'tsp']],
[['eggs', '1/4', 'tbsp'], ['peas', '1/2', 'each'], ['egg', '2', 'tsp']]],
{'watercress': ['4', 'tbsp']}],
[['egg', '11/4', 'tsp'], ['pea', '1/2', 'each'], ['pea', '3/4', 'tsp'], ['sugar', '3/4', 'each']]],
['generated control 3',
[[[['peas', '1/4', 'cup']], [['Tomato', '1/3', 'kg']],
[['watercress', '1/2', 'g'], ['Tomato', '2', 'kg']]],
{'egg': ['1/4', 'kg']}],
[['pea', '1/4', 'cup'], ['tomato', '7/3', 'kg'], ['watercress', '1/2', 'g']]]],
[['pantry covers all', [[[['eggs', '2', 'each']]], {'egg': ['6', 'each']}], []],
['watercress keeps ss', [[[['watercress', '100', 'g']]], {}], [['watercress', '100', 'g']]],
['single recipe', [[[['flour', '1', 'cup']]], {}], [['flour', '1', 'cup']]],
['regression: zero line suppression',
[[[['grapes', '1', 'tbsp'], ['tomatoes', '2', 'tsp']], [['egg', '1/3', 'tsp']]],
{'Tomato': ['4', 'cup'], 'tomatoes': ['3/4', 'g']}],
[['egg', '1/3', 'tsp'], ['grape', '1', 'tbsp']]],
['repair check: zero line suppression',
[[[['flour', '1/4', 'g'], ['grapes', '1/4', 'kg']], [['grapes', '1/2', 'each']]],
{'grape': ['4', 'each']}],
[['flour', '1/4', 'g'], ['grape', '250', 'g']]],
['generated control 1',
[[[['eggs', '4', 'each'], ['Tomato', '1', 'cup'], ['eggs', '1/4', 'tbsp'], ['watercress', '1/3', 'cup']]],
{}],
[['egg', '4', 'each'], ['egg', '3/4', 'tsp'], ['tomato', '1', 'cup'], ['watercress', '1/3', 'cup']]],
['generated control 2',
[[[['berry', '3', 'kg']], [['berry', '2', 'g'], ['egg', '2', 'kg']]],
{'berries': ['2', 'each'], 'grape': ['1/2', 'each']}],
[['berry', '1501/500', 'kg'], ['egg', '2', 'kg']]],
['generated control 3',
[[[['Tomato', '1', 'g'], ['grape', '4', 'cup']],
[['berries', '1', 'each'], ['peas', '4', 'tsp'], ['grapes', '3', 'tsp']],
[['egg', '3/4', 'each'], ['sugar ', '3', 'each'], ['berry', '1/4', 'kg'], ['berries', '4', 'kg']]],
{'watercress': ['1/4', 'tbsp']}],
[['berry', '1', 'each'], ['berry', '17/4', 'kg'], ['egg', '3/4', 'each'], ['grape', '65/16', 'cup'],
['pea', '4/3', 'tbsp'], ['sugar', '3', 'each'], ['tomato', '1', 'g']]]],
[['watercress keeps ss', [[[['watercress', '100', 'g']]], {}], [['watercress', '100', 'g']]],
['single recipe', [[[['flour', '1', 'cup']]], {}], [['flour', '1', 'cup']]],
['merge plurals', [[[['tomatoes', '2', 'each']], [['Tomato', '1', 'each']]], {}],
[['tomato', '3', 'each']]],
['regression: zero line suppression',
[[[['watercress', '4', 'g'], ['Tomato', '1/3', 'tbsp'], ['sugar ', '1', 'g']],
[['peas', '3', 'tbsp'], ['Tomato', '1', 'tsp'], ['watercress', '1/4', 'cup']],
[['tomatoes', '1/4', 'each']]],
{'grapes': ['1/3', 'tbsp'], 'peas': ['1/3', 'cup']}],
[['sugar', '1', 'g'], ['tomato', '1/4', 'each'], ['tomato', '2', 'tsp'], ['watercress', '4', 'g'],
['watercress', '1/4', 'cup']]],
['repair check: zero line suppression',
[[[['grape', '1', 'each']], [['watercress', '1/2', 'tbsp'], ['tomatoes', '2', 'g']],
[['peas', '2', 'kg'], ['potatoes', '3', 'tbsp']]],
{'grape': ['1', 'each'], 'potatoes': ['3/4', 'g']}],
[['pea', '2', 'kg'], ['potato', '3', 'tbsp'], ['tomato', '2', 'g'], ['watercress', '3/2', 'tsp']]],
['generated control 1',
[[[['tomatoes', '1/3', 'g'], ['grape', '1/4', 'g'], ['berry', '3', 'each'], ['grape', '1', 'tbsp']],
[['grapes', '1', 'g']]],
{'egg': ['2', 'kg'], 'potatoes': ['1/3', 'kg']}],
[['berry', '3', 'each'], ['grape', '5/4', 'g'], ['grape', '1', 'tbsp'], ['tomato', '1/3', 'g']]],
['generated control 2',
[[[['grape', '1/3', 'cup'], ['eggs', '3', 'tsp'], ['eggs', '4', 'each'], ['eggs', '1/3', 'g']],
[['grapes', '1', 'kg'], ['potatoes', '1/2', 'tsp'], ['peas', '1/3', 'tbsp']]],
{'watercress': ['4', 'each']}],
[['egg', '4', 'each'], ['egg', '1/3', 'g'], ['egg', '1', 'tbsp'], ['grape', '1', 'kg'],
['grape', '1/3', 'cup'], ['pea', '1', 'tsp'], ['potato', '1/2', 'tsp']]],
['generated control 3', [[[['peas', '1/2', 'g']]], {'Tomato': ['2', 'tsp'], 'eggs': ['1/2', 'cup']}],
[['pea', '1/2', 'g']]]],
[['single recipe', [[[['flour', '1', 'cup']]], {}], [['flour', '1', 'cup']]],
['merge plurals', [[[['tomatoes', '2', 'each']], [['Tomato', '1', 'each']]], {}],
[['tomato', '3', 'each']]],
['pantry covers all', [[[['eggs', '2', 'each']]], {'egg': ['6', 'each']}], []],
['regression: zero line suppression',
[[[['flour', '4', 'tsp'], ['Tomato', '3', 'tsp'], ['sugar ', '4', 'kg'], ['egg', '1/3', 'kg']]],
{'Tomato': ['3', 'tsp']}],
[['egg', '1000/3', 'g'], ['flour', '4/3', 'tbsp'], ['sugar', '4', 'kg']]],
['repair check: zero line suppression',
[[[['sugar ', '1/3', 'cup'], ['berry', '1/2', 'kg'], ['berries', '3/4', 'each'], ['flour', '1/2', 'g']],
[['Tomato', '1/2', 'cup']], [['grape', '2', 'tbsp'], ['sugar ', '2', 'cup'], ['eggs', '3/4', 'each']]],
{'berries': ['2', 'each']}],
[['berry', '500', 'g'], ['egg', '3/4', 'each'], ['flour', '1/2', 'g'], ['grape', '2', 'tbsp'],
['sugar', '7/3', 'cup'], ['tomato', '1/2', 'cup']]],
['generated control 1',
[[[['watercress', '3', 'cup'], ['peas', '1/3', 'kg'], ['Tomato', '1/3', 'cup'], ['peas', '1/3', 'kg']],
[['Tomato', '1', 'cup'], ['flour', '3', 'each']]],
{}],
[['flour', '3', 'each'], ['pea', '2000/3', 'g'], ['tomato', '4/3', 'cup'], ['watercress', '3', 'cup']]],
['generated control 2',
[[[['potatoes', '4', 'each'], ['eggs', '3', 'kg']]], {'berries': ['3/4', 'g'], 'eggs': ['1/2', 'cup']}],
[['egg', '3', 'kg'], ['potato', '4', 'each']]],
['generated control 3',
[[[['berry', '2', 'tsp'], ['watercress', '1', 'kg']], [['potatoes', '2', 'each']],
[['flour', '1/4', 'g'], ['berries', '4', 'tbsp'], ['berry', '1/2', 'g'], ['peas', '1', 'g']]],
{'egg': ['1/3', 'g']}],
[['berry', '1/2', 'g'], ['berry', '7/24', 'cup'], ['flour', '1/4', 'g'], ['pea', '1', 'g'],
['potato', '2', 'each'], ['watercress', '1', 'kg']]]]]
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 |
|---|---|---|---|
| single recipe | [['flour', '1', 'cup']] | [['flour', '1', 'cup']] | Passed |
| merge plurals | [['tomato', '3', 'each']] | [['tomato', '3', 'each']] | Passed |
| pantry covers all | [['egg', '0', 'each']] | [] | Failed |
| regression: zero line suppression | [['berry', '65/16', 'cup'], ['egg', '1', 'kg'], ['flour', '1', 'kg'], ['flour', '1', 'tsp']] | [['berry', '65/16', 'cup'], ['egg', '1', 'kg'], ['flour', '1', 'kg'], ['flour', '1', 'tsp']] | Passed |
| repair check: zero line suppression | [['berry', '3', 'cup'], ['egg', '3', 'kg'], ['egg', '4/3', 'tbsp'], ['flour', '9/4', 'tsp'], ['grape', '4', 'each'], ['grape', '3/4', 'cup'], ['pea', '2', 'cup'], ['tomato', '0', 'each'], ['tomato', '3/4', 'g']] | [['berry', '3', 'cup'], ['egg', '3', 'kg'], ['egg', '4/3', 'tbsp'], ['flour', '9/4', 'tsp'], ['grape', '4', 'each'], ['grape', '3/4', 'cup'], ['pea', '2', 'cup'], ['tomato', '3/4', 'g']] | Failed |
| generated control 1 | [['egg', '3', 'g'], ['egg', '2', 'cup'], ['grape', '1000/3', 'g'], ['sugar', '1', 'kg'], ['tomato', '4', 'g'], ['tomato', '1/4', 'cup']] | [['egg', '3', 'g'], ['egg', '2', 'cup'], ['grape', '1000/3', 'g'], ['sugar', '1', 'kg'], ['tomato', '4', 'g'], ['tomato', '1/4', 'cup']] | Passed |
| generated control 2 | [['berry', '2', 'kg'], ['berry', '49/192', 'cup'], ['grape', '254', 'g'], ['grape', '1', 'tsp'], ['pea', '500', 'g'], ['sugar', '1', 'kg']] | [['berry', '2', 'kg'], ['berry', '49/192', 'cup'], ['grape', '254', 'g'], ['grape', '1', 'tsp'], ['pea', '500', 'g'], ['sugar', '1', 'kg']] | Passed |
| generated control 3 | [['berry', '1', 'each'], ['berry', '2', 'cup'], ['pea', '1', 'tbsp'], ['sugar', '3/4', 'each'], ['watercress', '5', 'cup']] | [['berry', '1', 'each'], ['berry', '2', 'cup'], ['pea', '1', 'tbsp'], ['sugar', '3/4', 'each'], ['watercress', '5', 'cup']] | Passed |
SHA-256 / c4cdfe27068b19f6aee47eb1f5b2b2abca302075507ab1d91cb405684135cc01
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(recipes, pantry):
VOL = {'tsp': 1, 'tbsp': 3, 'cup': 48}
MASS = {'g': 1, 'kg': 1000}
def norm(n):
n = n.strip().lower()
if n.endswith('oes'):
return n[:-2]
if n.endswith('ies'):
return n[:-3] + 'y'
if n.endswith('s') and not n.endswith('ss'):
return n[:-1]
return n
def base(q, u):
if u in VOL:
return 'volume', Fraction(q) * VOL[u]
if u in MASS:
return 'mass', Fraction(q) * MASS[u]
return u, Fraction(q)
tot = {}
for recipe in recipes:
for name, q, u in recipe:
dim, v = base(q, u)
k = (norm(name), dim)
tot[k] = tot.get(k, 0) + v
for name, (q, u) in pantry.items():
dim, v = base(q, u)
pk = (norm(name), dim)
if pk in tot:
tot[pk] = max(Fraction(0), tot[pk] - v)
out = []
for (name, dim), v in sorted(tot.items()):
if v == 0:
continue
if dim == 'volume':
unit, v2 = ('cup', v / 48) if v >= 12 else ('tbsp', v / 3) if v >= 3 else ('tsp', v)
elif dim == 'mass':
unit, v2 = ('kg', v / 1000) if v >= 1000 else ('g', v)
else:
unit, v2 = dim, v
out.append([name, str(v2), unit])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['single recipe', [[[['flour', '1', 'cup']]], {}], [['flour', '1', 'cup']]],
['merge plurals', [[[['tomatoes', '2', 'each']], [['Tomato', '1', 'each']]], {}],
[['tomato', '3', 'each']]],
['pantry covers all', [[[['eggs', '2', 'each']]], {'egg': ['6', 'each']}], []],
['regression: zero line suppression',
[[[['flour', '1', 'kg'], ['peas', '3/4', 'cup'], ['eggs', '1', 'kg'], ['flour', '1/4', 'tbsp']],
[['berries', '4', 'cup'], ['berries', '1', 'tbsp'], ['peas', '1/2', 'tbsp'], ['peas', '1/2', 'tbsp']],
[['flour', '1/4', 'tsp']]],
{'peas': ['1', 'cup']}],
[['berry', '65/16', 'cup'], ['egg', '1', 'kg'], ['flour', '1', 'kg'], ['flour', '1', 'tsp']]],
['repair check: zero line suppression',
[[[['Tomato', '3/4', 'each'], ['flour', '3/4', 'tbsp']],
[['tomatoes', '3/4', 'g'], ['peas', '2', 'cup'], ['berry', '3', 'cup'], ['grape', '4', 'each']],
[['grapes', '4', 'tbsp'], ['egg', '1/3', 'cup'], ['eggs', '3', 'kg'], ['grape', '1/2', 'cup']]],
{'Tomato': ['3', 'each'], 'eggs': ['4', 'tbsp']}],
[['berry', '3', 'cup'], ['egg', '3', 'kg'], ['egg', '4/3', 'tbsp'], ['flour', '9/4', 'tsp'],
['grape', '4', 'each'], ['grape', '3/4', 'cup'], ['pea', '2', 'cup'], ['tomato', '3/4', 'g']]],
['generated control 1',
[[[['sugar ', '1', 'kg']],
[['Tomato', '4', 'g'], ['tomatoes', '1/4', 'cup'], ['eggs', '2', 'cup'], ['grape', '1/3', 'kg']],
[['egg', '3', 'g']]],
{}],
[['egg', '3', 'g'], ['egg', '2', 'cup'], ['grape', '1000/3', 'g'], ['sugar', '1', 'kg'],
['tomato', '4', 'g'], ['tomato', '1/4', 'cup']]],
['generated control 2',
[[[['grapes', '1/3', 'tbsp'], ['berries', '1/4', 'tsp'], ['grape', '1/4', 'kg'], ['sugar ', '1', 'kg']],
[['berries', '1/4', 'cup']], [['berries', '2', 'kg'], ['grape', '4', 'g'], ['peas', '1/2', 'kg']]],
{}],
[['berry', '2', 'kg'], ['berry', '49/192', 'cup'], ['grape', '254', 'g'], ['grape', '1', 'tsp'],
['pea', '500', 'g'], ['sugar', '1', 'kg']]],
['generated control 3',
[[[['berry', '2', 'cup'], ['watercress', '2', 'cup']], [['sugar ', '3/4', 'each']],
[['peas', '3', 'tsp'], ['watercress', '3', 'cup'], ['berry', '1', 'each']]],
{'eggs': ['1', 'tbsp']}],
[['berry', '1', 'each'], ['berry', '2', 'cup'], ['pea', '1', 'tbsp'], ['sugar', '3/4', 'each'],
['watercress', '5', 'cup']]]],
[['merge plurals', [[[['tomatoes', '2', 'each']], [['Tomato', '1', 'each']]], {}],
[['tomato', '3', 'each']]],
['pantry covers all', [[[['eggs', '2', 'each']]], {'egg': ['6', 'each']}], []],
['watercress keeps ss', [[[['watercress', '100', 'g']]], {}], [['watercress', '100', 'g']]],
['regression: zero line suppression',
[[[['eggs', '1/3', 'each'], ['sugar ', '1/4', 'kg']], [['grape', '2', 'each']]],
{'sugar ': ['3/4', 'kg']}],
[['egg', '1/3', 'each'], ['grape', '2', 'each']]],
['repair check: zero line suppression',
[[[['eggs', '3/4', 'g']], [['tomatoes', '1/3', 'each']]],
{'Tomato': ['4', 'each'], 'berries': ['3/4', 'g']}],
[['egg', '3/4', 'g']]],
['generated control 1',
[[[['berries', '1', 'each'], ['berry', '1/4', 'g']],
[['peas', '4', 'tsp'], ['potatoes', '2', 'g'], ['berry', '3', 'cup'], ['tomatoes', '4', 'tsp']],
[['flour', '3/4', 'kg']]],
{'peas': ['3/4', 'tbsp'], 'tomatoes': ['1/3', 'tbsp']}],
[['berry', '1', 'each'], ['berry', '1/4', 'g'], ['berry', '3', 'cup'], ['flour', '750', 'g'],
['pea', '7/4', 'tsp'], ['potato', '2', 'g'], ['tomato', '1', 'tbsp']]],
['generated control 2',
[[[['sugar ', '3/4', 'each'], ['peas', '3/4', 'tsp']],
[['eggs', '1/4', 'tbsp'], ['peas', '1/2', 'each'], ['egg', '2', 'tsp']]],
{'watercress': ['4', 'tbsp']}],
[['egg', '11/4', 'tsp'], ['pea', '1/2', 'each'], ['pea', '3/4', 'tsp'], ['sugar', '3/4', 'each']]],
['generated control 3',
[[[['peas', '1/4', 'cup']], [['Tomato', '1/3', 'kg']],
[['watercress', '1/2', 'g'], ['Tomato', '2', 'kg']]],
{'egg': ['1/4', 'kg']}],
[['pea', '1/4', 'cup'], ['tomato', '7/3', 'kg'], ['watercress', '1/2', 'g']]]],
[['pantry covers all', [[[['eggs', '2', 'each']]], {'egg': ['6', 'each']}], []],
['watercress keeps ss', [[[['watercress', '100', 'g']]], {}], [['watercress', '100', 'g']]],
['single recipe', [[[['flour', '1', 'cup']]], {}], [['flour', '1', 'cup']]],
['regression: zero line suppression',
[[[['grapes', '1', 'tbsp'], ['tomatoes', '2', 'tsp']], [['egg', '1/3', 'tsp']]],
{'Tomato': ['4', 'cup'], 'tomatoes': ['3/4', 'g']}],
[['egg', '1/3', 'tsp'], ['grape', '1', 'tbsp']]],
['repair check: zero line suppression',
[[[['flour', '1/4', 'g'], ['grapes', '1/4', 'kg']], [['grapes', '1/2', 'each']]],
{'grape': ['4', 'each']}],
[['flour', '1/4', 'g'], ['grape', '250', 'g']]],
['generated control 1',
[[[['eggs', '4', 'each'], ['Tomato', '1', 'cup'], ['eggs', '1/4', 'tbsp'], ['watercress', '1/3', 'cup']]],
{}],
[['egg', '4', 'each'], ['egg', '3/4', 'tsp'], ['tomato', '1', 'cup'], ['watercress', '1/3', 'cup']]],
['generated control 2',
[[[['berry', '3', 'kg']], [['berry', '2', 'g'], ['egg', '2', 'kg']]],
{'berries': ['2', 'each'], 'grape': ['1/2', 'each']}],
[['berry', '1501/500', 'kg'], ['egg', '2', 'kg']]],
['generated control 3',
[[[['Tomato', '1', 'g'], ['grape', '4', 'cup']],
[['berries', '1', 'each'], ['peas', '4', 'tsp'], ['grapes', '3', 'tsp']],
[['egg', '3/4', 'each'], ['sugar ', '3', 'each'], ['berry', '1/4', 'kg'], ['berries', '4', 'kg']]],
{'watercress': ['1/4', 'tbsp']}],
[['berry', '1', 'each'], ['berry', '17/4', 'kg'], ['egg', '3/4', 'each'], ['grape', '65/16', 'cup'],
['pea', '4/3', 'tbsp'], ['sugar', '3', 'each'], ['tomato', '1', 'g']]]],
[['watercress keeps ss', [[[['watercress', '100', 'g']]], {}], [['watercress', '100', 'g']]],
['single recipe', [[[['flour', '1', 'cup']]], {}], [['flour', '1', 'cup']]],
['merge plurals', [[[['tomatoes', '2', 'each']], [['Tomato', '1', 'each']]], {}],
[['tomato', '3', 'each']]],
['regression: zero line suppression',
[[[['watercress', '4', 'g'], ['Tomato', '1/3', 'tbsp'], ['sugar ', '1', 'g']],
[['peas', '3', 'tbsp'], ['Tomato', '1', 'tsp'], ['watercress', '1/4', 'cup']],
[['tomatoes', '1/4', 'each']]],
{'grapes': ['1/3', 'tbsp'], 'peas': ['1/3', 'cup']}],
[['sugar', '1', 'g'], ['tomato', '1/4', 'each'], ['tomato', '2', 'tsp'], ['watercress', '4', 'g'],
['watercress', '1/4', 'cup']]],
['repair check: zero line suppression',
[[[['grape', '1', 'each']], [['watercress', '1/2', 'tbsp'], ['tomatoes', '2', 'g']],
[['peas', '2', 'kg'], ['potatoes', '3', 'tbsp']]],
{'grape': ['1', 'each'], 'potatoes': ['3/4', 'g']}],
[['pea', '2', 'kg'], ['potato', '3', 'tbsp'], ['tomato', '2', 'g'], ['watercress', '3/2', 'tsp']]],
['generated control 1',
[[[['tomatoes', '1/3', 'g'], ['grape', '1/4', 'g'], ['berry', '3', 'each'], ['grape', '1', 'tbsp']],
[['grapes', '1', 'g']]],
{'egg': ['2', 'kg'], 'potatoes': ['1/3', 'kg']}],
[['berry', '3', 'each'], ['grape', '5/4', 'g'], ['grape', '1', 'tbsp'], ['tomato', '1/3', 'g']]],
['generated control 2',
[[[['grape', '1/3', 'cup'], ['eggs', '3', 'tsp'], ['eggs', '4', 'each'], ['eggs', '1/3', 'g']],
[['grapes', '1', 'kg'], ['potatoes', '1/2', 'tsp'], ['peas', '1/3', 'tbsp']]],
{'watercress': ['4', 'each']}],
[['egg', '4', 'each'], ['egg', '1/3', 'g'], ['egg', '1', 'tbsp'], ['grape', '1', 'kg'],
['grape', '1/3', 'cup'], ['pea', '1', 'tsp'], ['potato', '1/2', 'tsp']]],
['generated control 3', [[[['peas', '1/2', 'g']]], {'Tomato': ['2', 'tsp'], 'eggs': ['1/2', 'cup']}],
[['pea', '1/2', 'g']]]],
[['single recipe', [[[['flour', '1', 'cup']]], {}], [['flour', '1', 'cup']]],
['merge plurals', [[[['tomatoes', '2', 'each']], [['Tomato', '1', 'each']]], {}],
[['tomato', '3', 'each']]],
['pantry covers all', [[[['eggs', '2', 'each']]], {'egg': ['6', 'each']}], []],
['regression: zero line suppression',
[[[['flour', '4', 'tsp'], ['Tomato', '3', 'tsp'], ['sugar ', '4', 'kg'], ['egg', '1/3', 'kg']]],
{'Tomato': ['3', 'tsp']}],
[['egg', '1000/3', 'g'], ['flour', '4/3', 'tbsp'], ['sugar', '4', 'kg']]],
['repair check: zero line suppression',
[[[['sugar ', '1/3', 'cup'], ['berry', '1/2', 'kg'], ['berries', '3/4', 'each'], ['flour', '1/2', 'g']],
[['Tomato', '1/2', 'cup']], [['grape', '2', 'tbsp'], ['sugar ', '2', 'cup'], ['eggs', '3/4', 'each']]],
{'berries': ['2', 'each']}],
[['berry', '500', 'g'], ['egg', '3/4', 'each'], ['flour', '1/2', 'g'], ['grape', '2', 'tbsp'],
['sugar', '7/3', 'cup'], ['tomato', '1/2', 'cup']]],
['generated control 1',
[[[['watercress', '3', 'cup'], ['peas', '1/3', 'kg'], ['Tomato', '1/3', 'cup'], ['peas', '1/3', 'kg']],
[['Tomato', '1', 'cup'], ['flour', '3', 'each']]],
{}],
[['flour', '3', 'each'], ['pea', '2000/3', 'g'], ['tomato', '4/3', 'cup'], ['watercress', '3', 'cup']]],
['generated control 2',
[[[['potatoes', '4', 'each'], ['eggs', '3', 'kg']]], {'berries': ['3/4', 'g'], 'eggs': ['1/2', 'cup']}],
[['egg', '3', 'kg'], ['potato', '4', 'each']]],
['generated control 3',
[[[['berry', '2', 'tsp'], ['watercress', '1', 'kg']], [['potatoes', '2', 'each']],
[['flour', '1/4', 'g'], ['berries', '4', 'tbsp'], ['berry', '1/2', 'g'], ['peas', '1', 'g']]],
{'egg': ['1/3', 'g']}],
[['berry', '1/2', 'g'], ['berry', '7/24', 'cup'], ['flour', '1/4', 'g'], ['pea', '1', 'g'],
['potato', '2', 'each'], ['watercress', '1', 'kg']]]]]
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 |
|---|---|---|---|
| single recipe | [['flour', '1', 'cup']] | [['flour', '1', 'cup']] | Passed |
| merge plurals | [['tomato', '3', 'each']] | [['tomato', '3', 'each']] | Passed |
| pantry covers all | [] | [] | Passed |
| regression: zero line suppression | [['berry', '65/16', 'cup'], ['egg', '1', 'kg'], ['flour', '1', 'kg'], ['flour', '1', 'tsp']] | [['berry', '65/16', 'cup'], ['egg', '1', 'kg'], ['flour', '1', 'kg'], ['flour', '1', 'tsp']] | Passed |
| repair check: zero line suppression | [['berry', '3', 'cup'], ['egg', '3', 'kg'], ['egg', '4/3', 'tbsp'], ['flour', '9/4', 'tsp'], ['grape', '4', 'each'], ['grape', '3/4', 'cup'], ['pea', '2', 'cup'], ['tomato', '3/4', 'g']] | [['berry', '3', 'cup'], ['egg', '3', 'kg'], ['egg', '4/3', 'tbsp'], ['flour', '9/4', 'tsp'], ['grape', '4', 'each'], ['grape', '3/4', 'cup'], ['pea', '2', 'cup'], ['tomato', '3/4', 'g']] | Passed |
| generated control 1 | [['egg', '3', 'g'], ['egg', '2', 'cup'], ['grape', '1000/3', 'g'], ['sugar', '1', 'kg'], ['tomato', '4', 'g'], ['tomato', '1/4', 'cup']] | [['egg', '3', 'g'], ['egg', '2', 'cup'], ['grape', '1000/3', 'g'], ['sugar', '1', 'kg'], ['tomato', '4', 'g'], ['tomato', '1/4', 'cup']] | Passed |
| generated control 2 | [['berry', '2', 'kg'], ['berry', '49/192', 'cup'], ['grape', '254', 'g'], ['grape', '1', 'tsp'], ['pea', '500', 'g'], ['sugar', '1', 'kg']] | [['berry', '2', 'kg'], ['berry', '49/192', 'cup'], ['grape', '254', 'g'], ['grape', '1', 'tsp'], ['pea', '500', 'g'], ['sugar', '1', 'kg']] | Passed |
| generated control 3 | [['berry', '1', 'each'], ['berry', '2', 'cup'], ['pea', '1', 'tbsp'], ['sugar', '3/4', 'each'], ['watercress', '5', 'cup']] | [['berry', '1', 'each'], ['berry', '2', 'cup'], ['pea', '1', 'tbsp'], ['sugar', '3/4', 'each'], ['watercress', '5', 'cup']] | Passed |
SHA-256 / f9e81a47e8d468e57f144a4f8ed8d1be529d3c4b9c822f57f5ad344a9ff50acd
Verification & scope
A deterministic toy contract stated in full here; it is a bounded teaching model, not an authoritative reference or standards implementation. 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:52:29.359723+00:00.
Case digest / 963796a2ab0c411b72ac59ce38bae6ae3de669065254d4a3bf9bc307ddef03b7