broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(x):
    words, glue, width, lp = x
    sp, st, sh = glue
    n = len(words)
    def rate(i, j):
        gaps = j - i - 1
        nat = sum(words[i:j]) + sp * gaps
        short = width - nat
        if j == n and short >= 0:
            return 0, 1
        if short > 0:
            if st * gaps == 0:
                return None
            r = Fraction(short, st * gaps)
        elif short < 0:
            if -short > sh * gaps:
                return None
            r = Fraction(short, st * gaps)
        else:
            r = Fraction(0)
        b = min(10000, math.floor(100 * abs(r) ** 3 + Fraction(1, 2)))
        if b > 1000:
            return None
        fit = 0 if r < Fraction(-1, 2) else 1 if r <= Fraction(1, 2) else 2 if r <= 1 else 3
        return b, fit
    best = {(0, 1): (0, [])}
    for j in range(1, n + 1):
        for i in range(j):
            rated = rate(i, j)
            if rated is None:
                continue
            b, fit = rated
            for (pos, pfit), (dem, brk) in sorted(best.items()):
                if pos != i:
                    continue
                d = dem + (lp + b) ** 2
                if abs(fit - pfit) > 1:
                    d += 3000
                key = (j, fit)
                if key not in best or d < best[key][0]:
                    best[key] = (d, brk + [j])
    finals = [v for (pos, f), v in best.items() if pos == n]
    if not finals:
        return ['infeasible']
    d, brk = min(finals)
    return [d, brk]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('two-line paragraph with loose first line', [[4, 5, 3, 6], [2, 2, 1], 14, 10], [12200, [3, 4]]), ('regression: compression ratio denominator', [[5, 5, 6, 5, 3, 6, 2], [2, 1, 2], 23, 50], [8900, [4, 7]]), ('regression: compression ratio denominator', [[6, 1, 5, 1, 3, 7, 4], [2, 3, 2], 15, 1], [11, [3, 6, 7]]), ('regression: compression ratio denominator', [[6, 2, 3, 7, 4, 4], [3, 1, 2], 18, 50], [12433, [3, 6]]), ('last line overfull', [[5, 5, 5], [1, 1, 0], 9, 10], ['infeasible']), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]]), ('control layout', [[7, 1, 7, 1, 6], [3, 3, 0], 24, 50], [6469, [3, 5]]), ('control layout', [[5, 2, 7, 1], [3, 2, 1], 20, 10], [200, [3, 4]])], [('regression: compression ratio denominator', [[5, 1, 5], [2, 3, 2], 11, 10], [12100, [3]]), ('regression: compression ratio denominator', [[5, 3, 1, 4, 2, 7, 3, 6], [2, 2, 1], 15, 50], [28969, [3, 6, 8]]), ('regression: compression ratio denominator', [[3, 5, 5, 6, 7], [2, 1, 2], 22, 10], [629, [4, 5]]), ('partial-repair probe', [[2, 4, 6, 5, 5], [1, 3, 2], 19, 10], [200, [4, 5]]), ('two-line paragraph with loose first line', [[4, 5, 3, 6], [2, 2, 1], 14, 10], [12200, [3, 4]]), ('last line overfull', [[5, 5, 5], [1, 1, 0], 9, 10], ['infeasible']), ('control layout', [[5, 4, 5], [1, 3, 2], 20, 1], [1, [3]]), ('control layout', [[1, 3, 3], [3, 3, 0], 12, 50], [271669, [2, 3]])], [('regression: compression ratio denominator', [[2, 7, 4, 4, 2, 1, 1, 3], [1, 3, 2], 11, 10], [440, [2, 5, 8]]), ('regression: compression ratio denominator', [[3, 1, 2, 3, 2, 7, 4], [2, 3, 2], 11, 50], [11400, [4, 6, 7]]), ('regression: compression ratio denominator', [[7, 6, 7, 4, 4, 2], [2, 1, 2], 16, 10], [17904, [2, 5, 6]]), ('regression: compression ratio denominator', [[7, 7, 7, 6], [2, 3, 1], 24, 10], [629, [3, 4]]), ('tight then loose lines', [[3, 3, 3, 3, 3, 3, 3], [2, 2, 1], 11, 1], [20403, [3, 6, 7]]), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]]), ('control layout', [[5, 2, 3], [1, 1, 0], 23, 10], [100, [3]]), ('control layout', [[5, 5, 4], [1, 1, 2], 19, 1], [1, [3]])], [('regression: compression ratio denominator', [[1, 5, 1, 4, 5, 7], [1, 3, 2], 23, 50], [3969, [6]]), ('regression: compression ratio denominator', [[5, 1, 5], [2, 3, 2], 11, 10], [12100, [3]]), ('regression: compression ratio denominator', [[1, 7, 7, 2, 4, 1, 3, 4], [1, 1, 2], 13, 50], [27500, [3, 7, 8]]), ('partial-repair probe', [[6, 6, 7, 2], [2, 2, 2], 24, 10], [244, [3, 4]]), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]]), ('tight then loose lines', [[3, 3, 3, 3, 3, 3, 3], [2, 2, 1], 11, 1], [20403, [3, 6, 7]]), ('control layout', [[5, 4, 4, 1, 6], [2, 2, 0], 20, 10], [200, [4, 5]]), ('control layout', [[3, 7, 2], [1, 3, 1], 14, 1], [1, [3]])], [('regression: compression ratio denominator', [[5, 3, 6, 2], [2, 1, 2], 14, 1], [10202, [3, 4]]), ('regression: compression ratio denominator', [[1, 6, 5, 4, 7], [3, 3, 2], 11, 10], [825, [2, 4, 5]]), ('partial-repair probe', [[4, 6, 3, 7], [3, 3, 2], 15, 50], [8900, [2, 4]]), ('regression: compression ratio denominator', [[5, 4, 4, 7, 5, 3, 3], [2, 1, 2], 22, 10], [1700, [4, 7]]), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]]), ('two-line paragraph with loose first line', [[4, 5, 3, 6], [2, 2, 1], 14, 10], [12200, [3, 4]]), ('control layout', [[2, 6, 3, 3, 7, 7], [3, 3, 1], 12, 1], ['infeasible']), ('control layout', [[5, 5, 4], [1, 1, 2], 19, 1], [1, [3]])]]
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)

source:
"""Failure Map reference implementation. Python standard library only."""
import json
import math
from fractions import Fraction
N = 1
observations = []
def solve(x):
    words, glue, width, lp = x
    sp, st, sh = glue
    n = len(words)
    def rate(i, j):
        gaps = j - i - 1
        nat = sum(words[i:j]) + sp * gaps
        short = width - nat
        if j == n and short >= 0:
            return 0, 1
        if short > 0:
            if st * gaps == 0:
                return None
            r = Fraction(short, st * gaps)
        elif short < 0:
            if -short > sh * gaps:
                return None
            r = Fraction(short, (sh + st) * gaps)
        else:
            r = Fraction(0)
        b = min(10000, math.floor(100 * abs(r) ** 3 + Fraction(1, 2)))
        if b > 1000:
            return None
        fit = 0 if r < Fraction(-1, 2) else 1 if r <= Fraction(1, 2) else 2 if r <= 1 else 3
        return b, fit
    best = {(0, 1): (0, [])}
    for j in range(1, n + 1):
        for i in range(j):
            rated = rate(i, j)
            if rated is None:
                continue
            b, fit = rated
            for (pos, pfit), (dem, brk) in sorted(best.items()):
                if pos != i:
                    continue
                d = dem + (lp + b) ** 2
                if abs(fit - pfit) > 1:
                    d += 3000
                key = (j, fit)
                if key not in best or d < best[key][0]:
                    best[key] = (d, brk + [j])
    finals = [v for (pos, f), v in best.items() if pos == n]
    if not finals:
        return ['infeasible']
    d, brk = min(finals)
    return [d, brk]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('two-line paragraph with loose first line', [[4, 5, 3, 6], [2, 2, 1], 14, 10], [12200, [3, 4]]), ('regression: compression ratio denominator', [[5, 5, 6, 5, 3, 6, 2], [2, 1, 2], 23, 50], [8900, [4, 7]]), ('regression: compression ratio denominator', [[6, 1, 5, 1, 3, 7, 4], [2, 3, 2], 15, 1], [11, [3, 6, 7]]), ('regression: compression ratio denominator', [[6, 2, 3, 7, 4, 4], [3, 1, 2], 18, 50], [12433, [3, 6]]), ('last line overfull', [[5, 5, 5], [1, 1, 0], 9, 10], ['infeasible']), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]]), ('control layout', [[7, 1, 7, 1, 6], [3, 3, 0], 24, 50], [6469, [3, 5]]), ('control layout', [[5, 2, 7, 1], [3, 2, 1], 20, 10], [200, [3, 4]])], [('regression: compression ratio denominator', [[5, 1, 5], [2, 3, 2], 11, 10], [12100, [3]]), ('regression: compression ratio denominator', [[5, 3, 1, 4, 2, 7, 3, 6], [2, 2, 1], 15, 50], [28969, [3, 6, 8]]), ('regression: compression ratio denominator', [[3, 5, 5, 6, 7], [2, 1, 2], 22, 10], [629, [4, 5]]), ('partial-repair probe', [[2, 4, 6, 5, 5], [1, 3, 2], 19, 10], [200, [4, 5]]), ('two-line paragraph with loose first line', [[4, 5, 3, 6], [2, 2, 1], 14, 10], [12200, [3, 4]]), ('last line overfull', [[5, 5, 5], [1, 1, 0], 9, 10], ['infeasible']), ('control layout', [[5, 4, 5], [1, 3, 2], 20, 1], [1, [3]]), ('control layout', [[1, 3, 3], [3, 3, 0], 12, 50], [271669, [2, 3]])], [('regression: compression ratio denominator', [[2, 7, 4, 4, 2, 1, 1, 3], [1, 3, 2], 11, 10], [440, [2, 5, 8]]), ('regression: compression ratio denominator', [[3, 1, 2, 3, 2, 7, 4], [2, 3, 2], 11, 50], [11400, [4, 6, 7]]), ('regression: compression ratio denominator', [[7, 6, 7, 4, 4, 2], [2, 1, 2], 16, 10], [17904, [2, 5, 6]]), ('regression: compression ratio denominator', [[7, 7, 7, 6], [2, 3, 1], 24, 10], [629, [3, 4]]), ('tight then loose lines', [[3, 3, 3, 3, 3, 3, 3], [2, 2, 1], 11, 1], [20403, [3, 6, 7]]), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]]), ('control layout', [[5, 2, 3], [1, 1, 0], 23, 10], [100, [3]]), ('control layout', [[5, 5, 4], [1, 1, 2], 19, 1], [1, [3]])], [('regression: compression ratio denominator', [[1, 5, 1, 4, 5, 7], [1, 3, 2], 23, 50], [3969, [6]]), ('regression: compression ratio denominator', [[5, 1, 5], [2, 3, 2], 11, 10], [12100, [3]]), ('regression: compression ratio denominator', [[1, 7, 7, 2, 4, 1, 3, 4], [1, 1, 2], 13, 50], [27500, [3, 7, 8]]), ('partial-repair probe', [[6, 6, 7, 2], [2, 2, 2], 24, 10], [244, [3, 4]]), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]]), ('tight then loose lines', [[3, 3, 3, 3, 3, 3, 3], [2, 2, 1], 11, 1], [20403, [3, 6, 7]]), ('control layout', [[5, 4, 4, 1, 6], [2, 2, 0], 20, 10], [200, [4, 5]]), ('control layout', [[3, 7, 2], [1, 3, 1], 14, 1], [1, [3]])], [('regression: compression ratio denominator', [[5, 3, 6, 2], [2, 1, 2], 14, 1], [10202, [3, 4]]), ('regression: compression ratio denominator', [[1, 6, 5, 4, 7], [3, 3, 2], 11, 10], [825, [2, 4, 5]]), ('partial-repair probe', [[4, 6, 3, 7], [3, 3, 2], 15, 50], [8900, [2, 4]]), ('regression: compression ratio denominator', [[5, 4, 4, 7, 5, 3, 3], [2, 1, 2], 22, 10], [1700, [4, 7]]), ('single word paragraph', [[7], [2, 2, 1], 10, 10], [100, [1]]), ('two-line paragraph with loose first line', [[4, 5, 3, 6], [2, 2, 1], 14, 10], [12200, [3, 4]]), ('control layout', [[2, 6, 3, 3, 7, 7], [3, 3, 1], 12, 1], ['infeasible']), ('control layout', [[5, 5, 4], [1, 1, 2], 19, 1], [1, [3]])]]
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)

prompt:
Compressed lines are rated with the stretch budget.

Input [word widths, [space, stretch, shrink] per gap, line width, line penalty]. A line i..j has gaps=j-i-1. The last line has zero badness when not overfull. Other lines use ratio shortfall/(stretch*gaps) or /(shrink*gaps); zero stretch with slack or compression past shrink is infeasible; badness=min(10000, floor(100|r|^3+1/2)) and must be <=1000. Fitness 0 tight (r<-1/2), 1 decent (r<=1/2), 2 loose (r<=1), 3 very loose; last line decent. Demerits (lp+b)^2 plus 3000 when adjacent fitness classes differ by more than 1, starting from decent. Return [min total demerits, break list] (ties: first found) or ["infeasible"].

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    word, patterns, exceptions, lmin, rmin = x
    low = word.lower()
    for e in exceptions:
        if e.replace('-', '') == low:
            out, count = '', 0
            for c in e:
                if c == '-':
                    out += '-'
                else:
                    out += word[count]
                    count += 1
            return out
    table = {}
    for p in patterns:
        letters = ''
        vals = [0]
        for c in p:
            if c.isdigit():
                vals[-1] = int(c)
            else:
                letters += c
                vals.append(0)
        table[letters] = vals
    dotted = '.' + low
    score = [0] * (len(dotted) + 1)
    for s in range(len(dotted)):
        for e in range(s + 1, len(dotted) + 1):
            vals = table.get(dotted[s:e])
            if vals:
                for k, v in enumerate(vals):
                    score[s + k] = max(score[s + k], v)
    points = [i for i in range(1, len(word)) if score[i + 1] % 2 == 1 and i >= lmin and len(word) - i >= rmin]
    out = ''
    for i, c in enumerate(word):
        if i in points:
            out += '-'
        out += c
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: word-end anchor padding', ['understand', ['1p', 'l1l', 'x1c', 'o2n', '5nd.', 'he2n', '1m', 'n1g', 'li1', 'b2l', 'm1m', 'r1r', '1ca', 'hena4', 'om1', 'gr2', '1q', 'n2at', 'pu2', 'ex1', 'e1c', 't1t', 'c2ce', '.un1', 'p2h', 'hy3ph', '1ble', '4ing.', 'ter1', '3ty.', '1tio', 'con1', 'hen5at', '1na', 'ment1', 'at1', '.ta4', 's1s'], ['ex-cep-tion', 'ta-ble', 'mis-sis-sip-pi'], 1, 2], 'un-dersta-nd'), ('regression: word-end anchor padding', ['understand', ['e2x', 'l1l', '5nd.', 'x1c', 'an1d', '1m', '1tio', 'he2n', 'ca1t', '1ca', 'c2ce', 'e1c', 's1s', 'p2h', 'o2n', 't1t', '2io', 'gr2', 'con1', 'n2at'], [], 1, 2], 'understa-nd'), ('partial-repair probe', ['Recreation', ['o2n', '.re1', 't1t', '4ing.', 'l1l', 'm1m', 'gr2', 'li1', 'ter1', '2io'], ['ta-ble', 'ex-cep-tion', 'mis-sis-sip-pi'], 2, 3], 'Re-creation'), ('partial-repair probe', ['Unexpected', ['n1g', 'hen5at', 'hy3ph', 'p2h', 'r1r', 's1s', 'at1', '1m', 'c2ce', 'b2l', '1ble', '.un1', 'l1l', 'he2n', 'io3n.', 'om1', '1ca', 'pu2', 'o2n', 'n2at', 'e2x', 'x1c', 't1t', '.re1', '1tio', 'ex1', 'con1', 'gr2', '4ing.', 'e1c', 'ca1t', 'ment1', 'ter1', 'a2n', '1na'], [], 1, 2], 'Un-ex-pe-cted'), ('lowercase exception', ['project', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['pro-ject'], 2, 3], 'pro-ject'), ('capitalised exception', ['Table', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['ta-ble'], 1, 1], 'Ta-ble'), ('control layout', ['battle', ['.un1', 't1t', '1q', '3ty.', 'ter1', 'ca1t', 'e1c', 'at1', 'ment1', 'li1', '1ble', '2mp', '1ca', 'c2ce', 'e2x', 'r1r', '4ing.', 'hen5at', 'pu2', 'x1c', 'om1', '5nd.', 'n2at', 'l1l', '.re1', 'ex1', 'gr2', 'con1'], ['ta-ble'], 1, 3], 'bat-tle'), ('control layout', ['Commitment', ['.ta4', 'gr2', 'om1', 't1t', 'e1c', 'a2n', '1q', '1ble', '1tio', 'hen5at', '2mp'], [], 3, 1], 'Com-mitment')], [('regression: word-end anchor padding', ['Recreation', ['hy3ph', 'x1c', 'gr2', 'hena4', 'c2ce', 'an1d', 'a1b', '1ca', '1na', '2io', 'e2x', 's1s', 'n2at', 'ment1', 'io3n.', 'pu2', 'at1', 'b2l'], ['ex-cep-tion', 'pro-ject', 'ta-ble'], 3, 1], 'Recreatio-n'), ('regression: word-end anchor padding', ['understand', ['c2ce', 'n2at', 'a2n', 'ca1t', 'b2l', 'a1b', '1ca', 'hy3ph', 'e2x', 't1t', 'r1r', '1q', 'p2h', 'ex1', 'con1', 'he2n', 'x1c', 'hena4', 'om1', 's1s', 'li1', 'at1', 'an1d', 'e1c', 'hen5at', '1na', '.re1', '4ing.', '1ble', 'io3n.', '3ty.', '2io', '2mp', '5nd.', '1m', '1tio', 'ment1', 'l1l', 'ter1', 'n1g', 'm1m'], ['gram-mar', 'mis-sis-sip-pi', 'ta-ble'], 2, 1], 'understa-n-d'), ('partial-repair probe', ['Categories', ['ter1', 'r1r', 'hy3ph', '1ble', 'a2n', '1ca', '1tio', 'hena4', 's1s', '2io', 'pu2', 'n2at', 'x1c', 'con1', 'at1', 't1t', 'n1g', 'li1', '.un1', 'ca1t', '1p', 'io3n.', '1q', '2mp', '1m', 'hen5at', 'an1d', 'ex1', 'b2l', 'p2h', '3ty.', 'ment1'], [], 1, 3], 'Ca-t-egories'), ('partial-repair probe', ['Table', ['1m', '1ca', 'x1c', 'gr2', 's1s', '1q', '1na', '4ing.', 'con1', 'e2x', 'om1', 'at1', '.ta4', 'a1b', 'n1g', 'r1r', 'li1', 'l1l', 'he2n', '2io', 'pu2', 'ex1', 'hen5at', '3ty.', 'ca1t', 'b2l', 'o2n'], ['gram-mar', 'ex-cep-tion', 'mis-sis-sip-pi'], 1, 2], 'Table'), ('left minimum boundary', ['excellent', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], [], 2, 3], 'ex-cel-lent'), ('right minimum boundary', ['category', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], [], 1, 3], 'ca-t-egory'), ('control layout', ['Mississippi', ['1ca', 'io3n.', '1m', 'pu2', 'gr2', 'b2l', 'n2at', '3ty.', 's1s', 'l1l', 'o2n', 'he2n', '.un1', '.re1', '2mp', 'e2x', 'hy3ph', 'at1', 'ter1', 'm1m', '1ble', 'hen5at', 'con1', 'ment1', 'ex1', '1na', 'p2h', 'e1c', 'hena4', 't1t', 'a1b', 'r1r'], ['mis-sis-sip-pi', 'pro-ject', 'ex-cep-tion'], 3, 1], 'Mis-sis-sip-pi'), ('control layout', ['Pentagon', ['1na', 'e2x', 'hy3ph', 'a1b', 'ca1t', '2mp', 'x1c', 'io3n.', '.un1'], ['ta-ble', 'pro-ject', 'ex-cep-tion'], 3, 1], 'Pentagon')], [('regression: word-end anchor padding', ['understand', ['2io', 'con1', 'an1d', 'm1m', '5nd.', 'hy3ph', 'ment1', 'ter1'], [], 3, 1], 'understa-n-d'), ('regression: word-end anchor padding', ['hyphenation', ['1ble', '1ca', 'hy3ph', 'gr2', '5nd.', 'at1', '1tio', 'n2at', 'ex1', 'x1c', '1na', 'ter1', 'b2l', 'e1c', 't1t', '1q', 'li1', '.ta4', 'm1m', 's1s', 'e2x', 'con1', '2mp', 'r1r', 'hena4', '.re1', '2io', 'c2ce', 'om1', 'p2h', '1p', 'ca1t', 'l1l', 'o2n', 'pu2', 'n1g', 'a1b', 'io3n.', '1m', 'ment1'], ['mis-sis-sip-pi', 'ta-ble'], 1, 1], 'hy-phe-natio-n'), ('partial-repair probe', ['Table', ['ex1', 'n2at', 'hen5at', 'n1g', 'an1d', 'b2l', '.re1', 'om1', 'x1c', '.ta4', 'li1', 'io3n.', '1ble', 'hy3ph', '2mp', '4ing.', 'ment1', 'ca1t', '2io', 'a2n', 'ter1', 'a1b', 'gr2', '1na', 'p2h', 'he2n', 'con1', 'l1l', 'hena4', '5nd.', '1ca', 'pu2', 'e2x', 'at1', 'm1m', '3ty.'], ['ex-cep-tion'], 1, 2], 'Table'), ('partial-repair probe', ['Categories', ['p2h', '.ta4', 'n1g', 'gr2', 'r1r', 'b2l', '3ty.', '1m', '4ing.', 'li1', 'ca1t', '2mp', '5nd.', 'm1m', 's1s', 'o2n', '.re1', 'con1', 't1t', 'om1', '1q', 'hena4', 'an1d', 'ex1', 'a1b', '.un1', '1tio', '1na', 'io3n.'], ['gram-mar', 'ex-cep-tion', 'mis-sis-sip-pi'], 2, 2], 'Ca-tegories'), ('word-final pattern ing.', ['running', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], [], 2, 2], 'running'), ('lowercase exception', ['project', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['pro-ject'], 2, 3], 'pro-ject'), ('control layout', ['excellent', ['2io', '1ble', 'li1', 'l1l', 'x1c', 'hena4', 'con1', 'at1', '3ty.', 'p2h', 'an1d', 'pu2', 'o2n', 'gr2', 'hen5at'], ['pro-ject'], 1, 3], 'ex-cel-lent'), ('control layout', ['excellent', ['ter1', '.re1', 'e1c', 'e2x', 's1s', 't1t', '3ty.', 'hen5at', '1ble', 'm1m', '4ing.', '2mp', 'n1g', 'a2n', 'o2n', 'io3n.', '1na', 'ment1', 'li1', '1p', 'gr2', 'a1b', 'c2ce', '5nd.', 'om1', 'l1l', 'pu2', '.un1', 'he2n', '.ta4', '1m'], ['ex-cep-tion', 'ta-ble', 'pro-ject'], 1, 3], 'excel-lent')], [('regression: word-end anchor padding', ['hyphenation', ['e1c', '5nd.', 'e2x', '.ta4', '3ty.', 'hy3ph', 'om1', 'he2n', 'n1g', '1q', 'x1c', '1ca', 't1t', 'b2l', 'a1b', 'm1m', 'pu2', 'ter1', 'hen5at', '4ing.', '.re1', 'p2h', '1ble', 'li1', 'gr2', 'r1r', '.un1', '2io', '1na', '1tio', 'ca1t', 'io3n.', 'n2at', '1p', 'an1d', 'o2n', '2mp', 'c2ce', 'ment1', 's1s', 'con1'], ['ex-cep-tion', 'gram-mar', 'mis-sis-sip-pi'], 1, 1], 'hy-phen-a-tio-n'), ('regression: word-end anchor padding', ['understand', ['.ta4', '3ty.', 'he2n', 'ter1', 'pu2', 'at1', '5nd.', 'r1r', 'con1', 'x1c', 'c2ce', 'b2l', '1tio', 'n2at', '1ble', 'm1m', 'gr2', 'hy3ph', '1m', 't1t', 's1s', '.re1', '2io', '1p', 'li1', 'ex1', '1na', 'a1b', '2mp', 'hen5at', 'p2h', '.un1', 'l1l', 'e1c', 'a2n', 'ca1t', 'e2x', 'io3n.', '1ca', 'an1d'], ['ex-cep-tion', 'gram-mar', 'mis-sis-sip-pi'], 2, 1], 'un-dersta-n-d'), ('partial-repair probe', ['Categories', ['p2h', '.ta4', 'n1g', 'gr2', 'r1r', 'b2l', '3ty.', '1m', '4ing.', 'li1', 'ca1t', '2mp', '5nd.', 'm1m', 's1s', 'o2n', '.re1', 'con1', 't1t', 'om1', '1q', 'hena4', 'an1d', 'ex1', 'a1b', '.un1', '1tio', '1na', 'io3n.'], ['gram-mar', 'ex-cep-tion', 'mis-sis-sip-pi'], 2, 2], 'Ca-tegories'), ('partial-repair probe', ['Exception', ['he2n', '.re1', '3ty.', 'e2x', 'n2at', 'e1c', '2mp', '1m', '.ta4', '2io', 'a1b', 'hen5at', '1ble', 'ex1', 'at1', 'an1d', 'ca1t', 'io3n.'], ['gram-mar', 'mis-sis-sip-pi'], 1, 2], 'Ex-ception'), ('right minimum boundary', ['category', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], [], 1, 3], 'ca-t-egory'), ('capitalised exception', ['Table', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['ta-ble'], 1, 1], 'Ta-ble'), ('control layout', ['Commitment', ['1m', '2mp', 'r1r', 'io3n.', 'gr2', 'at1', 't1t', '3ty.', '.ta4', '1q', '2io', 'p2h', 's1s', '1ca', 'a2n', 'li1', 'b2l', '.re1', '1na', 'o2n', 'con1', '5nd.'], [], 2, 3], 'Co-m-mit-ment'), ('control layout', ['computer', ['4ing.', 'ex1', '1na', 'om1', 'l1l', '5nd.', 'e1c', 'o2n', 'con1'], ['mis-sis-sip-pi', 'pro-ject', 'ta-ble'], 2, 3], 'com-puter')], [('regression: word-end anchor padding', ['hyphenation', ['1na', '5nd.', 'ment1', 'r1r', 'p2h', 'e1c', 'ter1', 'n2at', 'ca1t', '1q', '4ing.', 'a2n', 'hena4', 't1t', '1m', '.un1', '.re1', 'b2l', 'hen5at', 'io3n.', '3ty.', 'x1c', 'c2ce', 'ex1', '1ble', 'pu2', '1tio', 'l1l', '1ca', 'm1m', 'an1d', 'hy3ph', 'o2n', 'he2n', 'li1', 'om1', 'a1b', 'e2x', '.ta4', 'gr2', 'at1', 'n1g'], ['ex-cep-tion'], 1, 1], 'hy-phen-at-io-n'), ('regression: word-end anchor padding', ['Exception', ['at1', '1q', '1ble', 'm1m', '2io', 'he2n', 'hen5at', 'x1c', 'ter1', '.ta4', 'e2x', '4ing.', 'an1d', '1p', 'a1b', 't1t', 'n1g', 'gr2', '3ty.', 'io3n.', 'om1', 'hena4', '.un1', '2mp', 'n2at', '1tio', 'hy3ph', 'ca1t', '1m', 'l1l', 's1s', 'r1r', 'c2ce', 'e1c', 'ex1', '5nd.', '1ca', '.re1', 'li1', 'pu2', 'a2n', 'p2h', 'ment1', 'o2n'], [], 2, 1], 'Ex-ce-p-tio-n'), ('partial-repair probe', ['Unexpected', ['c2ce', '1na', '1tio', 'om1', 'at1', '.un1', '1ca', 'io3n.', '1p', '1ble', 'x1c'], ['mis-sis-sip-pi'], 1, 1], 'Un-ex-pected'), ('partial-repair probe', ['Unexpected', ['1na', 'p2h', 'n2at', 'a1b', 'pu2', '1ca', 'n1g', 'e1c', '1m', 'c2ce', '.un1', 'e2x', 'li1', 's1s', '1q', 'm1m', 'a2n'], [], 1, 2], 'Un-expe-cted'), ('capitalised exception', ['Table', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['ta-ble'], 1, 1], 'Ta-ble'), ('lowercase exception', ['project', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['pro-ject'], 2, 3], 'pro-ject'), ('control layout', ['Unexpected', ['hena4', 'a1b', 'at1', 'con1', 'hen5at', 'li1', 'gr2', '1m', 'x1c', '2io', 'ca1t', '1tio', 'c2ce', 'io3n.', 'n2at', '1ble', '.re1', '2mp', 'r1r', 'e1c', 'b2l', 'ter1', '1p', 'e2x', 'ment1', '1ca', 'm1m', 'an1d', 'he2n', 'ex1', 's1s', '5nd.', '.ta4', 'n1g', '1na', 'pu2'], [], 3, 3], 'Unex-pe-cted'), ('control layout', ['hyphenation', ['e1c', '1ca', 'ter1', 'at1', 's1s', 'ex1', 'con1', '1tio', '2io', '2mp', '1na', 'm1m', 'pu2', 'ment1', '1q', 'l1l', 't1t', 'he2n', 'n2at', '1p', 'li1', 'o2n', 'om1', 'hy3ph'], [], 2, 1], 'hy-phena-tion')]]
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)

meaning: Fixture-count band, not measured model difficulty

deps: stdlib

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    word, patterns, exceptions, lmin, rmin = x
    low = word.lower()
    for e in exceptions:
        if e.replace('-', '') == low:
            out, count = '', 0
            for c in e:
                if c == '-':
                    out += '-'
                else:
                    out += word[count]
                    count += 1
            return out
    table = {}
    for p in patterns:
        letters = ''
        vals = [0]
        for c in p:
            if c.isdigit():
                vals[-1] = int(c)
            else:
                letters += c
                vals.append(0)
        table[letters] = vals
    dotted = '.' + word + '.'
    score = [0] * (len(dotted) + 1)
    for s in range(len(dotted)):
        for e in range(s + 1, len(dotted) + 1):
            vals = table.get(dotted[s:e])
            if vals:
                for k, v in enumerate(vals):
                    score[s + k] = max(score[s + k], v)
    points = [i for i in range(1, len(word)) if score[i + 1] % 2 == 1 and i >= lmin and len(word) - i >= rmin]
    out = ''
    for i, c in enumerate(word):
        if i in points:
            out += '-'
        out += c
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: word-end anchor padding', ['understand', ['1p', 'l1l', 'x1c', 'o2n', '5nd.', 'he2n', '1m', 'n1g', 'li1', 'b2l', 'm1m', 'r1r', '1ca', 'hena4', 'om1', 'gr2', '1q', 'n2at', 'pu2', 'ex1', 'e1c', 't1t', 'c2ce', '.un1', 'p2h', 'hy3ph', '1ble', '4ing.', 'ter1', '3ty.', '1tio', 'con1', 'hen5at', '1na', 'ment1', 'at1', '.ta4', 's1s'], ['ex-cep-tion', 'ta-ble', 'mis-sis-sip-pi'], 1, 2], 'un-dersta-nd'), ('regression: word-end anchor padding', ['understand', ['e2x', 'l1l', '5nd.', 'x1c', 'an1d', '1m', '1tio', 'he2n', 'ca1t', '1ca', 'c2ce', 'e1c', 's1s', 'p2h', 'o2n', 't1t', '2io', 'gr2', 'con1', 'n2at'], [], 1, 2], 'understa-nd'), ('partial-repair probe', ['Recreation', ['o2n', '.re1', 't1t', '4ing.', 'l1l', 'm1m', 'gr2', 'li1', 'ter1', '2io'], ['ta-ble', 'ex-cep-tion', 'mis-sis-sip-pi'], 2, 3], 'Re-creation'), ('partial-repair probe', ['Unexpected', ['n1g', 'hen5at', 'hy3ph', 'p2h', 'r1r', 's1s', 'at1', '1m', 'c2ce', 'b2l', '1ble', '.un1', 'l1l', 'he2n', 'io3n.', 'om1', '1ca', 'pu2', 'o2n', 'n2at', 'e2x', 'x1c', 't1t', '.re1', '1tio', 'ex1', 'con1', 'gr2', '4ing.', 'e1c', 'ca1t', 'ment1', 'ter1', 'a2n', '1na'], [], 1, 2], 'Un-ex-pe-cted'), ('lowercase exception', ['project', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['pro-ject'], 2, 3], 'pro-ject'), ('capitalised exception', ['Table', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['ta-ble'], 1, 1], 'Ta-ble'), ('control layout', ['battle', ['.un1', 't1t', '1q', '3ty.', 'ter1', 'ca1t', 'e1c', 'at1', 'ment1', 'li1', '1ble', '2mp', '1ca', 'c2ce', 'e2x', 'r1r', '4ing.', 'hen5at', 'pu2', 'x1c', 'om1', '5nd.', 'n2at', 'l1l', '.re1', 'ex1', 'gr2', 'con1'], ['ta-ble'], 1, 3], 'bat-tle'), ('control layout', ['Commitment', ['.ta4', 'gr2', 'om1', 't1t', 'e1c', 'a2n', '1q', '1ble', '1tio', 'hen5at', '2mp'], [], 3, 1], 'Com-mitment')], [('regression: word-end anchor padding', ['Recreation', ['hy3ph', 'x1c', 'gr2', 'hena4', 'c2ce', 'an1d', 'a1b', '1ca', '1na', '2io', 'e2x', 's1s', 'n2at', 'ment1', 'io3n.', 'pu2', 'at1', 'b2l'], ['ex-cep-tion', 'pro-ject', 'ta-ble'], 3, 1], 'Recreatio-n'), ('regression: word-end anchor padding', ['understand', ['c2ce', 'n2at', 'a2n', 'ca1t', 'b2l', 'a1b', '1ca', 'hy3ph', 'e2x', 't1t', 'r1r', '1q', 'p2h', 'ex1', 'con1', 'he2n', 'x1c', 'hena4', 'om1', 's1s', 'li1', 'at1', 'an1d', 'e1c', 'hen5at', '1na', '.re1', '4ing.', '1ble', 'io3n.', '3ty.', '2io', '2mp', '5nd.', '1m', '1tio', 'ment1', 'l1l', 'ter1', 'n1g', 'm1m'], ['gram-mar', 'mis-sis-sip-pi', 'ta-ble'], 2, 1], 'understa-n-d'), ('partial-repair probe', ['Categories', ['ter1', 'r1r', 'hy3ph', '1ble', 'a2n', '1ca', '1tio', 'hena4', 's1s', '2io', 'pu2', 'n2at', 'x1c', 'con1', 'at1', 't1t', 'n1g', 'li1', '.un1', 'ca1t', '1p', 'io3n.', '1q', '2mp', '1m', 'hen5at', 'an1d', 'ex1', 'b2l', 'p2h', '3ty.', 'ment1'], [], 1, 3], 'Ca-t-egories'), ('partial-repair probe', ['Table', ['1m', '1ca', 'x1c', 'gr2', 's1s', '1q', '1na', '4ing.', 'con1', 'e2x', 'om1', 'at1', '.ta4', 'a1b', 'n1g', 'r1r', 'li1', 'l1l', 'he2n', '2io', 'pu2', 'ex1', 'hen5at', '3ty.', 'ca1t', 'b2l', 'o2n'], ['gram-mar', 'ex-cep-tion', 'mis-sis-sip-pi'], 1, 2], 'Table'), ('left minimum boundary', ['excellent', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], [], 2, 3], 'ex-cel-lent'), ('right minimum boundary', ['category', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], [], 1, 3], 'ca-t-egory'), ('control layout', ['Mississippi', ['1ca', 'io3n.', '1m', 'pu2', 'gr2', 'b2l', 'n2at', '3ty.', 's1s', 'l1l', 'o2n', 'he2n', '.un1', '.re1', '2mp', 'e2x', 'hy3ph', 'at1', 'ter1', 'm1m', '1ble', 'hen5at', 'con1', 'ment1', 'ex1', '1na', 'p2h', 'e1c', 'hena4', 't1t', 'a1b', 'r1r'], ['mis-sis-sip-pi', 'pro-ject', 'ex-cep-tion'], 3, 1], 'Mis-sis-sip-pi'), ('control layout', ['Pentagon', ['1na', 'e2x', 'hy3ph', 'a1b', 'ca1t', '2mp', 'x1c', 'io3n.', '.un1'], ['ta-ble', 'pro-ject', 'ex-cep-tion'], 3, 1], 'Pentagon')], [('regression: word-end anchor padding', ['understand', ['2io', 'con1', 'an1d', 'm1m', '5nd.', 'hy3ph', 'ment1', 'ter1'], [], 3, 1], 'understa-n-d'), ('regression: word-end anchor padding', ['hyphenation', ['1ble', '1ca', 'hy3ph', 'gr2', '5nd.', 'at1', '1tio', 'n2at', 'ex1', 'x1c', '1na', 'ter1', 'b2l', 'e1c', 't1t', '1q', 'li1', '.ta4', 'm1m', 's1s', 'e2x', 'con1', '2mp', 'r1r', 'hena4', '.re1', '2io', 'c2ce', 'om1', 'p2h', '1p', 'ca1t', 'l1l', 'o2n', 'pu2', 'n1g', 'a1b', 'io3n.', '1m', 'ment1'], ['mis-sis-sip-pi', 'ta-ble'], 1, 1], 'hy-phe-natio-n'), ('partial-repair probe', ['Table', ['ex1', 'n2at', 'hen5at', 'n1g', 'an1d', 'b2l', '.re1', 'om1', 'x1c', '.ta4', 'li1', 'io3n.', '1ble', 'hy3ph', '2mp', '4ing.', 'ment1', 'ca1t', '2io', 'a2n', 'ter1', 'a1b', 'gr2', '1na', 'p2h', 'he2n', 'con1', 'l1l', 'hena4', '5nd.', '1ca', 'pu2', 'e2x', 'at1', 'm1m', '3ty.'], ['ex-cep-tion'], 1, 2], 'Table'), ('partial-repair probe', ['Categories', ['p2h', '.ta4', 'n1g', 'gr2', 'r1r', 'b2l', '3ty.', '1m', '4ing.', 'li1', 'ca1t', '2mp', '5nd.', 'm1m', 's1s', 'o2n', '.re1', 'con1', 't1t', 'om1', '1q', 'hena4', 'an1d', 'ex1', 'a1b', '.un1', '1tio', '1na', 'io3n.'], ['gram-mar', 'ex-cep-tion', 'mis-sis-sip-pi'], 2, 2], 'Ca-tegories'), ('word-final pattern ing.', ['running', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], [], 2, 2], 'running'), ('lowercase exception', ['project', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['pro-ject'], 2, 3], 'pro-ject'), ('control layout', ['excellent', ['2io', '1ble', 'li1', 'l1l', 'x1c', 'hena4', 'con1', 'at1', '3ty.', 'p2h', 'an1d', 'pu2', 'o2n', 'gr2', 'hen5at'], ['pro-ject'], 1, 3], 'ex-cel-lent'), ('control layout', ['excellent', ['ter1', '.re1', 'e1c', 'e2x', 's1s', 't1t', '3ty.', 'hen5at', '1ble', 'm1m', '4ing.', '2mp', 'n1g', 'a2n', 'o2n', 'io3n.', '1na', 'ment1', 'li1', '1p', 'gr2', 'a1b', 'c2ce', '5nd.', 'om1', 'l1l', 'pu2', '.un1', 'he2n', '.ta4', '1m'], ['ex-cep-tion', 'ta-ble', 'pro-ject'], 1, 3], 'excel-lent')], [('regression: word-end anchor padding', ['hyphenation', ['e1c', '5nd.', 'e2x', '.ta4', '3ty.', 'hy3ph', 'om1', 'he2n', 'n1g', '1q', 'x1c', '1ca', 't1t', 'b2l', 'a1b', 'm1m', 'pu2', 'ter1', 'hen5at', '4ing.', '.re1', 'p2h', '1ble', 'li1', 'gr2', 'r1r', '.un1', '2io', '1na', '1tio', 'ca1t', 'io3n.', 'n2at', '1p', 'an1d', 'o2n', '2mp', 'c2ce', 'ment1', 's1s', 'con1'], ['ex-cep-tion', 'gram-mar', 'mis-sis-sip-pi'], 1, 1], 'hy-phen-a-tio-n'), ('regression: word-end anchor padding', ['understand', ['.ta4', '3ty.', 'he2n', 'ter1', 'pu2', 'at1', '5nd.', 'r1r', 'con1', 'x1c', 'c2ce', 'b2l', '1tio', 'n2at', '1ble', 'm1m', 'gr2', 'hy3ph', '1m', 't1t', 's1s', '.re1', '2io', '1p', 'li1', 'ex1', '1na', 'a1b', '2mp', 'hen5at', 'p2h', '.un1', 'l1l', 'e1c', 'a2n', 'ca1t', 'e2x', 'io3n.', '1ca', 'an1d'], ['ex-cep-tion', 'gram-mar', 'mis-sis-sip-pi'], 2, 1], 'un-dersta-n-d'), ('partial-repair probe', ['Categories', ['p2h', '.ta4', 'n1g', 'gr2', 'r1r', 'b2l', '3ty.', '1m', '4ing.', 'li1', 'ca1t', '2mp', '5nd.', 'm1m', 's1s', 'o2n', '.re1', 'con1', 't1t', 'om1', '1q', 'hena4', 'an1d', 'ex1', 'a1b', '.un1', '1tio', '1na', 'io3n.'], ['gram-mar', 'ex-cep-tion', 'mis-sis-sip-pi'], 2, 2], 'Ca-tegories'), ('partial-repair probe', ['Exception', ['he2n', '.re1', '3ty.', 'e2x', 'n2at', 'e1c', '2mp', '1m', '.ta4', '2io', 'a1b', 'hen5at', '1ble', 'ex1', 'at1', 'an1d', 'ca1t', 'io3n.'], ['gram-mar', 'mis-sis-sip-pi'], 1, 2], 'Ex-ception'), ('right minimum boundary', ['category', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], [], 1, 3], 'ca-t-egory'), ('capitalised exception', ['Table', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['ta-ble'], 1, 1], 'Ta-ble'), ('control layout', ['Commitment', ['1m', '2mp', 'r1r', 'io3n.', 'gr2', 'at1', 't1t', '3ty.', '.ta4', '1q', '2io', 'p2h', 's1s', '1ca', 'a2n', 'li1', 'b2l', '.re1', '1na', 'o2n', 'con1', '5nd.'], [], 2, 3], 'Co-m-mit-ment'), ('control layout', ['computer', ['4ing.', 'ex1', '1na', 'om1', 'l1l', '5nd.', 'e1c', 'o2n', 'con1'], ['mis-sis-sip-pi', 'pro-ject', 'ta-ble'], 2, 3], 'com-puter')], [('regression: word-end anchor padding', ['hyphenation', ['1na', '5nd.', 'ment1', 'r1r', 'p2h', 'e1c', 'ter1', 'n2at', 'ca1t', '1q', '4ing.', 'a2n', 'hena4', 't1t', '1m', '.un1', '.re1', 'b2l', 'hen5at', 'io3n.', '3ty.', 'x1c', 'c2ce', 'ex1', '1ble', 'pu2', '1tio', 'l1l', '1ca', 'm1m', 'an1d', 'hy3ph', 'o2n', 'he2n', 'li1', 'om1', 'a1b', 'e2x', '.ta4', 'gr2', 'at1', 'n1g'], ['ex-cep-tion'], 1, 1], 'hy-phen-at-io-n'), ('regression: word-end anchor padding', ['Exception', ['at1', '1q', '1ble', 'm1m', '2io', 'he2n', 'hen5at', 'x1c', 'ter1', '.ta4', 'e2x', '4ing.', 'an1d', '1p', 'a1b', 't1t', 'n1g', 'gr2', '3ty.', 'io3n.', 'om1', 'hena4', '.un1', '2mp', 'n2at', '1tio', 'hy3ph', 'ca1t', '1m', 'l1l', 's1s', 'r1r', 'c2ce', 'e1c', 'ex1', '5nd.', '1ca', '.re1', 'li1', 'pu2', 'a2n', 'p2h', 'ment1', 'o2n'], [], 2, 1], 'Ex-ce-p-tio-n'), ('partial-repair probe', ['Unexpected', ['c2ce', '1na', '1tio', 'om1', 'at1', '.un1', '1ca', 'io3n.', '1p', '1ble', 'x1c'], ['mis-sis-sip-pi'], 1, 1], 'Un-ex-pected'), ('partial-repair probe', ['Unexpected', ['1na', 'p2h', 'n2at', 'a1b', 'pu2', '1ca', 'n1g', 'e1c', '1m', 'c2ce', '.un1', 'e2x', 'li1', 's1s', '1q', 'm1m', 'a2n'], [], 1, 2], 'Un-expe-cted'), ('capitalised exception', ['Table', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['ta-ble'], 1, 1], 'Ta-ble'), ('lowercase exception', ['project', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['pro-ject'], 2, 3], 'pro-ject'), ('control layout', ['Unexpected', ['hena4', 'a1b', 'at1', 'con1', 'hen5at', 'li1', 'gr2', '1m', 'x1c', '2io', 'ca1t', '1tio', 'c2ce', 'io3n.', 'n2at', '1ble', '.re1', '2mp', 'r1r', 'e1c', 'b2l', 'ter1', '1p', 'e2x', 'ment1', '1ca', 'm1m', 'an1d', 'he2n', 'ex1', 's1s', '5nd.', '.ta4', 'n1g', '1na', 'pu2'], [], 3, 3], 'Unex-pe-cted'), ('control layout', ['hyphenation', ['e1c', '1ca', 'ter1', 'at1', 's1s', 'ex1', 'con1', '1tio', '2io', '2mp', '1na', 'm1m', 'pu2', 'ment1', '1q', 'l1l', 't1t', 'he2n', 'n2at', '1p', 'li1', 'o2n', 'om1', 'hy3ph'], [], 2, 1], 'hy-phena-tion')]]
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)

prompt:
Patterns anchored at the end of a word never fire.

Input [word, patterns, exceptions, lefthyphenmin, righthyphenmin]. An exception (hyphenated, lowercase) matching the lowercased word dictates the hyphens and keeps the word's own letters. Otherwise the lowercased word is padded with dots, every substring pattern contributes its digits and the maximum digit per gap wins; odd values allow a hyphen. A hyphen before letter i needs i>=lefthyphenmin and len-i>=righthyphenmin. Return the word with "-" inserted.

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    word, patterns, exceptions, lmin, rmin = x
    low = word.lower()
    for e in exceptions:
        if e.replace('-', '') == low:
            out, count = '', 0
            for c in e:
                if c == '-':
                    out += '-'
                else:
                    out += word[count]
                    count += 1
            return out
    table = {}
    for p in patterns:
        letters = ''
        vals = [0]
        for c in p:
            if c.isdigit():
                vals[-1] = int(c)
            else:
                letters += c
                vals.append(0)
        table[letters] = vals
    dotted = '.' + low + '.'
    score = [0] * (len(dotted) + 1)
    for s in range(len(dotted)):
        for e in range(s + 1, len(dotted) + 1):
            vals = table.get(dotted[s:e])
            if vals:
                for k, v in enumerate(vals):
                    score[s + k] = v
    points = [i for i in range(1, len(word)) if score[i + 1] % 2 == 1 and i >= lmin and len(word) - i >= rmin]
    out = ''
    for i, c in enumerate(word):
        if i in points:
            out += '-'
        out += c
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('right minimum boundary', ['category', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], [], 1, 3], 'ca-t-egory'), ('regression: competing digit resolution', ['Commitment', ['pu2', '.re1', 'b2l', '2io', 'o2n', 'an1d', 'at1', 'a2n', '1m', 'l1l', 'ca1t', 'con1', 'e2x', 'ter1', 'n2at', 't1t', 'hen5at', '1p', '1q', '3ty.', 'ment1', 'ex1', '1na', 'hy3ph', 's1s'], ['ta-ble', 'pro-ject'], 3, 3], 'Com-mit-ment'), ('partial-repair probe', ['Recreation', ['.re1', '5nd.', 'li1', 'ment1', 'o2n', 'hen5at', 's1s', 'n1g', 'ca1t', 'io3n.', 'e2x', '1na', 'c2ce', '1tio', '1p', '2io', 'l1l', 'hena4', 'm1m', 'a2n', 'hy3ph', 'om1', '1m', 'a1b', '.ta4', 'an1d', '.un1', 't1t', 'x1c', 'pu2', 'he2n', 'b2l', 'at1', 'con1', '1q', 'r1r', 'ter1'], [], 2, 2], 'Re-crea-tion'), ('regression: competing digit resolution', ['hyphenation', ['1m', 'n2at', '3ty.', '1tio', '2io', 't1t', 'a2n', 'ca1t', '1p', 'x1c', '1na', '.un1', 'he2n', 'm1m', 'e1c', 'con1', 's1s', 'ex1', '4ing.', 'c2ce', 'hen5at', '1q', 'an1d', 'p2h', 'gr2', '2mp', 'hy3ph', 'l1l', 'r1r', 'n1g', 'ment1', 'ter1', '.re1', 'io3n.', 'at1', '.ta4', '1ble', 'b2l', 'o2n', 'e2x', 'li1', '1ca'], ['gram-mar'], 3, 2], 'hyphen-a-tion'), ('lowercase exception', ['project', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['pro-ject'], 2, 3], 'pro-ject'), ('left minimum boundary', ['excellent', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], [], 2, 3], 'ex-cel-lent'), ('control layout', ['Recreation', ['o2n', '.re1', 't1t', '4ing.', 'l1l', 'm1m', 'gr2', 'li1', 'ter1', '2io'], ['ta-ble', 'ex-cep-tion', 'mis-sis-sip-pi'], 2, 3], 'Re-creation'), ('control layout', ['Paragraph', ['s1s', 'io3n.', 'ca1t', 'x1c', 'hen5at', '.un1', '2mp', '4ing.', 'l1l', '1m', '1tio', 'gr2', 'b2l', '3ty.', 't1t', 'a1b', 'e1c', 'c2ce', 'pu2', 'ter1', 'o2n', '1q', 'r1r', '1p', 'm1m', 'n2at'], ['pro-ject'], 3, 3], 'Paragraph')], [('regression: competing digit resolution', ['Recreation', ['2io', 'li1', 'io3n.', 'a2n', 'ment1', 'n1g', 'e1c', 'ter1', '1q', 'x1c', 'he2n', 'p2h', '1tio', '4ing.', 'm1m', '.re1', 'o2n', 'gr2', 'l1l', '1na', 'om1', '.ta4', 'hena4', '.un1', '1ble', 'con1', '1m', 'ex1', 'hen5at', 'pu2', 'n2at', 'hy3ph', '1ca'], ['pro-ject'], 3, 1], 'Recrea-tio-n'), ('regression: competing digit resolution', ['Table', ['ca1t', '2io', '.re1', 'ex1', 'io3n.', '.un1', 'x1c', 'he2n', 'c2ce', 'a1b', '.ta4', 'gr2', 't1t', '1m', '1ble', 'an1d', 'om1', '4ing.', 'o2n', 'a2n', '5nd.', 'pu2', 'n1g', 's1s', 'con1', 'hena4', 'e2x', 'ter1', '2mp', 'hen5at', 'e1c', 'm1m', 'p2h', 'ment1', '1p', '1q', '1na', '3ty.', '1ca', 'at1', 'b2l', 'n2at'], ['gram-mar', 'ex-cep-tion', 'pro-ject'], 1, 1], 'Table'), ('regression: competing digit resolution', ['hyphenation', ['e2x', 'he2n', 'ex1', 'hy3ph', 'io3n.', '5nd.', 'con1', 'om1', '.un1', 'm1m', 'pu2', '1ca', 'n1g', 'ca1t', 'n2at', '2io', '1tio', '4ing.', 's1s', '2mp', 'e1c', 'at1', 't1t', 'x1c', 'hena4', 'ter1', 'ment1', 'gr2', '1m', '1p', 'b2l', 'c2ce', '.re1', '1ble', 'r1r', '.ta4', 'hen5at', 'a1b', 'p2h', '1q'], [], 1, 2], 'hy-phen-ation'), ('regression: competing digit resolution', ['computer', ['1tio', 'om1', 'a1b', 't1t', 'he2n', 'e1c', 'ment1', 'io3n.', '1ble', 'b2l', 'an1d', '2mp', 'pu2', 'o2n', '3ty.', 'l1l', '1na', 'hena4', 'hy3ph', '.ta4', 'con1', 'ex1', 'at1', 'r1r', 'ter1', '5nd.', 'li1', 'ca1t', '1p', '1ca', 'gr2', 'n2at', '.re1', '4ing.', '1m', '.un1', 'a2n', 'x1c', 'e2x', 'n1g', '1q', '2io', 's1s', 'c2ce'], [], 1, 1], 'com-puter'), ('capitalised exception', ['Table', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['ta-ble'], 1, 1], 'Ta-ble'), ('word-final pattern ing.', ['running', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], [], 2, 2], 'running'), ('control layout', ['category', ['o2n', '2mp', 'ment1', 't1t', 'con1', 'ca1t', '4ing.', 'm1m', '1ca', '1q', '1ble', 'om1', 'r1r', 'hena4', '.re1', 'n1g', 'at1', 'pu2', 'a1b', 'he2n', '1na', 'gr2', '1m', 'ter1', 'x1c', 'li1', '.ta4', 'hy3ph', 'hen5at', 'n2at', 'io3n.', 'a2n', '3ty.', 'b2l', 'ex1', 'l1l', 'e2x', 'p2h', 's1s', '.un1', '2io', 'an1d'], ['pro-ject', 'mis-sis-sip-pi', 'ex-cep-tion'], 3, 3], 'cat-egory'), ('control layout', ['table', ['e2x', '3ty.', '1tio', 'p2h', 'he2n', 'li1', '.un1', 'con1', '1ca', 'hy3ph', 'm1m', 'b2l', 'r1r', 'io3n.', 'c2ce', 'ca1t'], ['mis-sis-sip-pi', 'ex-cep-tion'], 2, 1], 'table')], [('regression: competing digit resolution', ['Commitment', ['b2l', 'pu2', 'e1c', 'li1', 'e2x', 'r1r', 'ex1', '1ble', 'm1m', '1tio', 'con1', 'he2n', '1q', '1ca', 'p2h', '5nd.', 'o2n', 'ment1', '2io', 'n2at', '3ty.', '.un1', '.re1', 'om1', 'a1b', '1m', 's1s', 'ca1t', 'hy3ph'], ['ta-ble', 'mis-sis-sip-pi'], 3, 2], 'Com-mit-ment'), ('regression: competing digit resolution', ['Table', ['ca1t', '2io', '.re1', 'ex1', 'io3n.', '.un1', 'x1c', 'he2n', 'c2ce', 'a1b', '.ta4', 'gr2', 't1t', '1m', '1ble', 'an1d', 'om1', '4ing.', 'o2n', 'a2n', '5nd.', 'pu2', 'n1g', 's1s', 'con1', 'hena4', 'e2x', 'ter1', '2mp', 'hen5at', 'e1c', 'm1m', 'p2h', 'ment1', '1p', '1q', '1na', '3ty.', '1ca', 'at1', 'b2l', 'n2at'], ['gram-mar', 'ex-cep-tion', 'pro-ject'], 1, 1], 'Table'), ('partial-repair probe', ['battle', ['con1', 'e1c', 't1t', 'om1', 'ca1t', 'he2n', 'o2n', 'x1c', '1ca', 'e2x', 'ex1', 'b2l', 'li1', '1m', 'r1r', 'at1', 'a1b'], [], 2, 3], 'bat-tle'), ('regression: competing digit resolution', ['hyphenation', ['ter1', 'b2l', 'o2n', '5nd.', 'e1c', '.ta4', 'n1g', 'om1', 'hena4', 'pu2', 'l1l', 'a2n', 'r1r', 'hy3ph', 't1t', '.re1', '1p', 'e2x', '1q', 'ca1t', '3ty.', '2mp', '1m', 'ment1', '4ing.', 'x1c', '1ble', 'p2h', 'li1', 'c2ce', 'n2at', '2io', 'an1d', 'con1', 'io3n.', 'm1m', 'gr2', 'ex1', '1na'], ['gram-mar'], 2, 2], 'hy-phe-nation'), ('left minimum boundary', ['excellent', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], [], 2, 3], 'ex-cel-lent'), ('lowercase exception', ['project', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['pro-ject'], 2, 3], 'pro-ject'), ('control layout', ['running', ['.ta4', 'a2n', 'hena4', 's1s', '2io', 'hen5at', 'e1c', '1p', 'e2x', 'n2at', '.un1', 'hy3ph', 'con1', 'a1b', '1m', '.re1', 'b2l'], [], 2, 2], 'running'), ('control layout', ['Paragraph', ['hena4', 's1s', 'p2h', 'hen5at', '1tio', 'con1', '3ty.', 'x1c', 'e2x', 'o2n', '.re1', '2io', 't1t', '4ing.', '.ta4', '5nd.', 'io3n.', '1ca', 'an1d', '1q', 'ex1', 'at1', '1m', 'gr2', 'ment1', 'hy3ph', 'r1r', '1na', 'pu2', 'om1', 'n2at'], ['pro-ject', 'ex-cep-tion', 'mis-sis-sip-pi'], 1, 2], 'Paragraph')], [('regression: competing digit resolution', ['connection', ['om1', '1ca', '.ta4', 'gr2', 'an1d', '3ty.', 's1s', '2mp', 'p2h', 'a1b', 'con1', 'pu2', 'hena4', '4ing.', 'r1r', '5nd.', 'e2x', '1na', 'hy3ph', '.un1', '1tio', 'c2ce', 'li1', 'l1l', 'ter1', 'o2n', 'he2n', 'ex1', 'a2n', '.re1', 'n2at'], ['ta-ble', 'mis-sis-sip-pi'], 1, 2], 'con-nec-tion'), ('regression: competing digit resolution', ['literally', ['hena4', 'li1', '5nd.', 'om1', 'ex1', 'pu2', '1na', 'ca1t', 'hen5at', 'p2h', 'b2l', 'hy3ph', 's1s', 'ter1'], ['mis-sis-sip-pi'], 1, 3], 'li-ter-ally'), ('regression: competing digit resolution', ['hyphenation', ['c2ce', '1ble', '2mp', 'a1b', '1q', 'n1g', 'a2n', '3ty.', 'o2n', 't1t', '1na', '4ing.', 'he2n', 'ment1', 'io3n.', 'e2x', 'hen5at', 'ter1', 'hy3ph', 's1s', 'pu2', 'ca1t', '.re1', '1m', 'con1', 'm1m', 'p2h', '5nd.', 'li1', 'r1r', '1tio', 'b2l', 'l1l', 'at1', 'ex1', 'om1', '.un1', 'e1c', 'gr2', '.ta4', 'an1d', 'x1c', '1p', 'hena4', '2io', '1ca', 'n2at'], ['gram-mar'], 2, 3], 'hy-phen-ation'), ('regression: competing digit resolution', ['hyphenation', ['1ble', '1ca', 'hy3ph', 'gr2', '5nd.', 'at1', '1tio', 'n2at', 'ex1', 'x1c', '1na', 'ter1', 'b2l', 'e1c', 't1t', '1q', 'li1', '.ta4', 'm1m', 's1s', 'e2x', 'con1', '2mp', 'r1r', 'hena4', '.re1', '2io', 'c2ce', 'om1', 'p2h', '1p', 'ca1t', 'l1l', 'o2n', 'pu2', 'n1g', 'a1b', 'io3n.', '1m', 'ment1'], ['mis-sis-sip-pi', 'ta-ble'], 1, 1], 'hy-phe-natio-n'), ('lowercase exception', ['project', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['pro-ject'], 2, 3], 'pro-ject'), ('capitalised exception', ['Table', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['ta-ble'], 1, 1], 'Ta-ble'), ('control layout', ['understand', ['io3n.', 'n1g', 'x1c', 'e1c', 'l1l', 'con1', 's1s', 'm1m', 'li1', '.re1', '2mp', 'ter1', '1ca', 'hena4', '5nd.', 'an1d', '3ty.', 'b2l', 't1t', 'ex1', 'c2ce', 'om1', '1tio', '4ing.', 'e2x', 'hy3ph', '1p', 'a1b', 'pu2', 'he2n', 'ment1', '1ble', 'gr2', 'hen5at', '.ta4', 'r1r', '.un1', '1m', 'n2at', 'ca1t', 'p2h', '1na', '2io', '1q'], ['ta-ble', 'gram-mar', 'ex-cep-tion'], 2, 3], 'un-derstand'), ('control layout', ['terminal', ['hen5at', 'con1', 'a2n', 'gr2', '1m', 'at1', '.re1', 'n1g', 'e2x', '4ing.', '.ta4', 'p2h'], [], 3, 2], 'ter-minal')], [('regression: competing digit resolution', ['Paragraph', ['1m', '2mp', '.ta4', 'hy3ph', 'pu2', 'e2x', 'om1', '1tio', 'at1', '.un1', 'n2at', '1na', 'hena4', 'r1r', 'ca1t', '1q', '2io', '.re1', 'a2n', 'n1g', 'o2n', 'ter1', 'l1l', 'x1c', 'p2h', 'con1', '5nd.', 'he2n', '4ing.', 'b2l', 'm1m', '1ble', '1p', 'c2ce', 's1s'], ['gram-mar', 'pro-ject'], 3, 1], 'Paragra-ph'), ('regression: competing digit resolution', ['Commitment', ['3ty.', '4ing.', '1ca', '5nd.', 's1s', 'a1b', '.un1', 'n2at', 'pu2', 'a2n', 'x1c', 'io3n.', 'ex1', 'n1g', '2io', 'b2l', 'at1', '1na', 'li1', 'c2ce', '1m', 'r1r', 'm1m', 'gr2', 'e2x', 'p2h', 'con1', 'ment1', 'he2n', 'ter1', 'hena4', '1p', 'an1d', 'e1c', '1tio', 't1t', '1q', '1ble', '.re1', 'hy3ph', 'om1', '2mp', 'ca1t', 'o2n', 'l1l', 'hen5at', '.ta4'], ['gram-mar', 'mis-sis-sip-pi', 'ta-ble'], 3, 3], 'Com-mit-ment'), ('regression: competing digit resolution', ['computer', ['1tio', 'om1', 'a1b', 't1t', 'he2n', 'e1c', 'ment1', 'io3n.', '1ble', 'b2l', 'an1d', '2mp', 'pu2', 'o2n', '3ty.', 'l1l', '1na', 'hena4', 'hy3ph', '.ta4', 'con1', 'ex1', 'at1', 'r1r', 'ter1', '5nd.', 'li1', 'ca1t', '1p', '1ca', 'gr2', 'n2at', '.re1', '4ing.', '1m', '.un1', 'a2n', 'x1c', 'e2x', 'n1g', '1q', '2io', 's1s', 'c2ce'], [], 1, 1], 'com-puter'), ('partial-repair probe', ['Recreation', ['4ing.', 'r1r', '.ta4', 't1t', 'pu2', 'ter1', 'at1', 'c2ce', '2mp', 'li1', 'l1l', '1m', 'a1b', 'n2at', '.un1', 'n1g', 'm1m', 'hy3ph', 'e2x', 'om1', '1ble', 'a2n', 'x1c', 'he2n', '1tio', '.re1', 'ca1t', '1ca', '2io', 'gr2', 's1s', '1q', 'io3n.', 'o2n', 'hen5at', 'p2h', '3ty.', 'ex1', 'e1c', '1na', 'b2l'], ['ta-ble', 'gram-mar', 'pro-ject'], 1, 3], 'Re-crea-tion'), ('left minimum boundary', ['excellent', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], [], 2, 3], 'ex-cel-lent'), ('capitalised exception', ['Table', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['ta-ble'], 1, 1], 'Ta-ble'), ('control layout', ['grammar', ['l1l', '5nd.', 'ter1', 'gr2', 't1t', 'ex1', 'b2l', 'om1', 'a2n', 'm1m', 'n1g', 'p2h', '1tio', 'hen5at', '1ca', '.ta4', 'n2at', '1na', 'hena4', '.re1', 'ment1', 'e2x', 'c2ce', '2mp', 'ca1t', '4ing.', 'r1r', 'io3n.', 'x1c'], [], 2, 2], 'gram-mar'), ('control layout', ['Mississippi', ['b2l', 't1t', 'o2n', 'io3n.', 'ment1', 'hen5at', 'hy3ph', 'hena4', 'con1', 's1s', '.re1', 'ca1t', 'li1', '4ing.', 'l1l', '2mp', 'e2x', 'om1'], ['gram-mar', 'pro-ject', 'ta-ble'], 1, 2], 'Mis-sis-sippi')]]
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)

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    word, patterns, exceptions, lmin, rmin = x
    low = word.lower()
    for e in exceptions:
        if e.replace('-', '') == low:
            out, count = '', 0
            for c in e:
                if c == '-':
                    out += '-'
                else:
                    out += word[count]
                    count += 1
            return out
    table = {}
    for p in patterns:
        letters = ''
        vals = [0]
        for c in p:
            if c.isdigit():
                vals[-1] = int(c)
            else:
                letters += c
                vals.append(0)
        table[letters] = vals
    dotted = '.' + low + '.'
    score = [0] * (len(dotted) + 1)
    for s in range(len(dotted)):
        for e in range(s + 1, len(dotted) + 1):
            vals = table.get(dotted[s:e])
            if vals:
                for k, v in enumerate(vals):
                    score[s + k] = score[s + k] + v
    points = [i for i in range(1, len(word)) if score[i + 1] % 2 == 1 and i >= lmin and len(word) - i >= rmin]
    out = ''
    for i, c in enumerate(word):
        if i in points:
            out += '-'
        out += c
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('right minimum boundary', ['category', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], [], 1, 3], 'ca-t-egory'), ('regression: competing digit resolution', ['Commitment', ['pu2', '.re1', 'b2l', '2io', 'o2n', 'an1d', 'at1', 'a2n', '1m', 'l1l', 'ca1t', 'con1', 'e2x', 'ter1', 'n2at', 't1t', 'hen5at', '1p', '1q', '3ty.', 'ment1', 'ex1', '1na', 'hy3ph', 's1s'], ['ta-ble', 'pro-ject'], 3, 3], 'Com-mit-ment'), ('partial-repair probe', ['Recreation', ['.re1', '5nd.', 'li1', 'ment1', 'o2n', 'hen5at', 's1s', 'n1g', 'ca1t', 'io3n.', 'e2x', '1na', 'c2ce', '1tio', '1p', '2io', 'l1l', 'hena4', 'm1m', 'a2n', 'hy3ph', 'om1', '1m', 'a1b', '.ta4', 'an1d', '.un1', 't1t', 'x1c', 'pu2', 'he2n', 'b2l', 'at1', 'con1', '1q', 'r1r', 'ter1'], [], 2, 2], 'Re-crea-tion'), ('regression: competing digit resolution', ['hyphenation', ['1m', 'n2at', '3ty.', '1tio', '2io', 't1t', 'a2n', 'ca1t', '1p', 'x1c', '1na', '.un1', 'he2n', 'm1m', 'e1c', 'con1', 's1s', 'ex1', '4ing.', 'c2ce', 'hen5at', '1q', 'an1d', 'p2h', 'gr2', '2mp', 'hy3ph', 'l1l', 'r1r', 'n1g', 'ment1', 'ter1', '.re1', 'io3n.', 'at1', '.ta4', '1ble', 'b2l', 'o2n', 'e2x', 'li1', '1ca'], ['gram-mar'], 3, 2], 'hyphen-a-tion'), ('lowercase exception', ['project', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['pro-ject'], 2, 3], 'pro-ject'), ('left minimum boundary', ['excellent', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], [], 2, 3], 'ex-cel-lent'), ('control layout', ['Recreation', ['o2n', '.re1', 't1t', '4ing.', 'l1l', 'm1m', 'gr2', 'li1', 'ter1', '2io'], ['ta-ble', 'ex-cep-tion', 'mis-sis-sip-pi'], 2, 3], 'Re-creation'), ('control layout', ['Paragraph', ['s1s', 'io3n.', 'ca1t', 'x1c', 'hen5at', '.un1', '2mp', '4ing.', 'l1l', '1m', '1tio', 'gr2', 'b2l', '3ty.', 't1t', 'a1b', 'e1c', 'c2ce', 'pu2', 'ter1', 'o2n', '1q', 'r1r', '1p', 'm1m', 'n2at'], ['pro-ject'], 3, 3], 'Paragraph')], [('regression: competing digit resolution', ['Recreation', ['2io', 'li1', 'io3n.', 'a2n', 'ment1', 'n1g', 'e1c', 'ter1', '1q', 'x1c', 'he2n', 'p2h', '1tio', '4ing.', 'm1m', '.re1', 'o2n', 'gr2', 'l1l', '1na', 'om1', '.ta4', 'hena4', '.un1', '1ble', 'con1', '1m', 'ex1', 'hen5at', 'pu2', 'n2at', 'hy3ph', '1ca'], ['pro-ject'], 3, 1], 'Recrea-tio-n'), ('regression: competing digit resolution', ['Table', ['ca1t', '2io', '.re1', 'ex1', 'io3n.', '.un1', 'x1c', 'he2n', 'c2ce', 'a1b', '.ta4', 'gr2', 't1t', '1m', '1ble', 'an1d', 'om1', '4ing.', 'o2n', 'a2n', '5nd.', 'pu2', 'n1g', 's1s', 'con1', 'hena4', 'e2x', 'ter1', '2mp', 'hen5at', 'e1c', 'm1m', 'p2h', 'ment1', '1p', '1q', '1na', '3ty.', '1ca', 'at1', 'b2l', 'n2at'], ['gram-mar', 'ex-cep-tion', 'pro-ject'], 1, 1], 'Table'), ('regression: competing digit resolution', ['hyphenation', ['e2x', 'he2n', 'ex1', 'hy3ph', 'io3n.', '5nd.', 'con1', 'om1', '.un1', 'm1m', 'pu2', '1ca', 'n1g', 'ca1t', 'n2at', '2io', '1tio', '4ing.', 's1s', '2mp', 'e1c', 'at1', 't1t', 'x1c', 'hena4', 'ter1', 'ment1', 'gr2', '1m', '1p', 'b2l', 'c2ce', '.re1', '1ble', 'r1r', '.ta4', 'hen5at', 'a1b', 'p2h', '1q'], [], 1, 2], 'hy-phen-ation'), ('regression: competing digit resolution', ['computer', ['1tio', 'om1', 'a1b', 't1t', 'he2n', 'e1c', 'ment1', 'io3n.', '1ble', 'b2l', 'an1d', '2mp', 'pu2', 'o2n', '3ty.', 'l1l', '1na', 'hena4', 'hy3ph', '.ta4', 'con1', 'ex1', 'at1', 'r1r', 'ter1', '5nd.', 'li1', 'ca1t', '1p', '1ca', 'gr2', 'n2at', '.re1', '4ing.', '1m', '.un1', 'a2n', 'x1c', 'e2x', 'n1g', '1q', '2io', 's1s', 'c2ce'], [], 1, 1], 'com-puter'), ('capitalised exception', ['Table', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['ta-ble'], 1, 1], 'Ta-ble'), ('word-final pattern ing.', ['running', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], [], 2, 2], 'running'), ('control layout', ['category', ['o2n', '2mp', 'ment1', 't1t', 'con1', 'ca1t', '4ing.', 'm1m', '1ca', '1q', '1ble', 'om1', 'r1r', 'hena4', '.re1', 'n1g', 'at1', 'pu2', 'a1b', 'he2n', '1na', 'gr2', '1m', 'ter1', 'x1c', 'li1', '.ta4', 'hy3ph', 'hen5at', 'n2at', 'io3n.', 'a2n', '3ty.', 'b2l', 'ex1', 'l1l', 'e2x', 'p2h', 's1s', '.un1', '2io', 'an1d'], ['pro-ject', 'mis-sis-sip-pi', 'ex-cep-tion'], 3, 3], 'cat-egory'), ('control layout', ['table', ['e2x', '3ty.', '1tio', 'p2h', 'he2n', 'li1', '.un1', 'con1', '1ca', 'hy3ph', 'm1m', 'b2l', 'r1r', 'io3n.', 'c2ce', 'ca1t'], ['mis-sis-sip-pi', 'ex-cep-tion'], 2, 1], 'table')], [('regression: competing digit resolution', ['Commitment', ['b2l', 'pu2', 'e1c', 'li1', 'e2x', 'r1r', 'ex1', '1ble', 'm1m', '1tio', 'con1', 'he2n', '1q', '1ca', 'p2h', '5nd.', 'o2n', 'ment1', '2io', 'n2at', '3ty.', '.un1', '.re1', 'om1', 'a1b', '1m', 's1s', 'ca1t', 'hy3ph'], ['ta-ble', 'mis-sis-sip-pi'], 3, 2], 'Com-mit-ment'), ('regression: competing digit resolution', ['Table', ['ca1t', '2io', '.re1', 'ex1', 'io3n.', '.un1', 'x1c', 'he2n', 'c2ce', 'a1b', '.ta4', 'gr2', 't1t', '1m', '1ble', 'an1d', 'om1', '4ing.', 'o2n', 'a2n', '5nd.', 'pu2', 'n1g', 's1s', 'con1', 'hena4', 'e2x', 'ter1', '2mp', 'hen5at', 'e1c', 'm1m', 'p2h', 'ment1', '1p', '1q', '1na', '3ty.', '1ca', 'at1', 'b2l', 'n2at'], ['gram-mar', 'ex-cep-tion', 'pro-ject'], 1, 1], 'Table'), ('partial-repair probe', ['battle', ['con1', 'e1c', 't1t', 'om1', 'ca1t', 'he2n', 'o2n', 'x1c', '1ca', 'e2x', 'ex1', 'b2l', 'li1', '1m', 'r1r', 'at1', 'a1b'], [], 2, 3], 'bat-tle'), ('regression: competing digit resolution', ['hyphenation', ['ter1', 'b2l', 'o2n', '5nd.', 'e1c', '.ta4', 'n1g', 'om1', 'hena4', 'pu2', 'l1l', 'a2n', 'r1r', 'hy3ph', 't1t', '.re1', '1p', 'e2x', '1q', 'ca1t', '3ty.', '2mp', '1m', 'ment1', '4ing.', 'x1c', '1ble', 'p2h', 'li1', 'c2ce', 'n2at', '2io', 'an1d', 'con1', 'io3n.', 'm1m', 'gr2', 'ex1', '1na'], ['gram-mar'], 2, 2], 'hy-phe-nation'), ('left minimum boundary', ['excellent', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], [], 2, 3], 'ex-cel-lent'), ('lowercase exception', ['project', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['pro-ject'], 2, 3], 'pro-ject'), ('control layout', ['running', ['.ta4', 'a2n', 'hena4', 's1s', '2io', 'hen5at', 'e1c', '1p', 'e2x', 'n2at', '.un1', 'hy3ph', 'con1', 'a1b', '1m', '.re1', 'b2l'], [], 2, 2], 'running'), ('control layout', ['Paragraph', ['hena4', 's1s', 'p2h', 'hen5at', '1tio', 'con1', '3ty.', 'x1c', 'e2x', 'o2n', '.re1', '2io', 't1t', '4ing.', '.ta4', '5nd.', 'io3n.', '1ca', 'an1d', '1q', 'ex1', 'at1', '1m', 'gr2', 'ment1', 'hy3ph', 'r1r', '1na', 'pu2', 'om1', 'n2at'], ['pro-ject', 'ex-cep-tion', 'mis-sis-sip-pi'], 1, 2], 'Paragraph')], [('regression: competing digit resolution', ['connection', ['om1', '1ca', '.ta4', 'gr2', 'an1d', '3ty.', 's1s', '2mp', 'p2h', 'a1b', 'con1', 'pu2', 'hena4', '4ing.', 'r1r', '5nd.', 'e2x', '1na', 'hy3ph', '.un1', '1tio', 'c2ce', 'li1', 'l1l', 'ter1', 'o2n', 'he2n', 'ex1', 'a2n', '.re1', 'n2at'], ['ta-ble', 'mis-sis-sip-pi'], 1, 2], 'con-nec-tion'), ('regression: competing digit resolution', ['literally', ['hena4', 'li1', '5nd.', 'om1', 'ex1', 'pu2', '1na', 'ca1t', 'hen5at', 'p2h', 'b2l', 'hy3ph', 's1s', 'ter1'], ['mis-sis-sip-pi'], 1, 3], 'li-ter-ally'), ('regression: competing digit resolution', ['hyphenation', ['c2ce', '1ble', '2mp', 'a1b', '1q', 'n1g', 'a2n', '3ty.', 'o2n', 't1t', '1na', '4ing.', 'he2n', 'ment1', 'io3n.', 'e2x', 'hen5at', 'ter1', 'hy3ph', 's1s', 'pu2', 'ca1t', '.re1', '1m', 'con1', 'm1m', 'p2h', '5nd.', 'li1', 'r1r', '1tio', 'b2l', 'l1l', 'at1', 'ex1', 'om1', '.un1', 'e1c', 'gr2', '.ta4', 'an1d', 'x1c', '1p', 'hena4', '2io', '1ca', 'n2at'], ['gram-mar'], 2, 3], 'hy-phen-ation'), ('regression: competing digit resolution', ['hyphenation', ['1ble', '1ca', 'hy3ph', 'gr2', '5nd.', 'at1', '1tio', 'n2at', 'ex1', 'x1c', '1na', 'ter1', 'b2l', 'e1c', 't1t', '1q', 'li1', '.ta4', 'm1m', 's1s', 'e2x', 'con1', '2mp', 'r1r', 'hena4', '.re1', '2io', 'c2ce', 'om1', 'p2h', '1p', 'ca1t', 'l1l', 'o2n', 'pu2', 'n1g', 'a1b', 'io3n.', '1m', 'ment1'], ['mis-sis-sip-pi', 'ta-ble'], 1, 1], 'hy-phe-natio-n'), ('lowercase exception', ['project', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['pro-ject'], 2, 3], 'pro-ject'), ('capitalised exception', ['Table', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['ta-ble'], 1, 1], 'Ta-ble'), ('control layout', ['understand', ['io3n.', 'n1g', 'x1c', 'e1c', 'l1l', 'con1', 's1s', 'm1m', 'li1', '.re1', '2mp', 'ter1', '1ca', 'hena4', '5nd.', 'an1d', '3ty.', 'b2l', 't1t', 'ex1', 'c2ce', 'om1', '1tio', '4ing.', 'e2x', 'hy3ph', '1p', 'a1b', 'pu2', 'he2n', 'ment1', '1ble', 'gr2', 'hen5at', '.ta4', 'r1r', '.un1', '1m', 'n2at', 'ca1t', 'p2h', '1na', '2io', '1q'], ['ta-ble', 'gram-mar', 'ex-cep-tion'], 2, 3], 'un-derstand'), ('control layout', ['terminal', ['hen5at', 'con1', 'a2n', 'gr2', '1m', 'at1', '.re1', 'n1g', 'e2x', '4ing.', '.ta4', 'p2h'], [], 3, 2], 'ter-minal')], [('regression: competing digit resolution', ['Paragraph', ['1m', '2mp', '.ta4', 'hy3ph', 'pu2', 'e2x', 'om1', '1tio', 'at1', '.un1', 'n2at', '1na', 'hena4', 'r1r', 'ca1t', '1q', '2io', '.re1', 'a2n', 'n1g', 'o2n', 'ter1', 'l1l', 'x1c', 'p2h', 'con1', '5nd.', 'he2n', '4ing.', 'b2l', 'm1m', '1ble', '1p', 'c2ce', 's1s'], ['gram-mar', 'pro-ject'], 3, 1], 'Paragra-ph'), ('regression: competing digit resolution', ['Commitment', ['3ty.', '4ing.', '1ca', '5nd.', 's1s', 'a1b', '.un1', 'n2at', 'pu2', 'a2n', 'x1c', 'io3n.', 'ex1', 'n1g', '2io', 'b2l', 'at1', '1na', 'li1', 'c2ce', '1m', 'r1r', 'm1m', 'gr2', 'e2x', 'p2h', 'con1', 'ment1', 'he2n', 'ter1', 'hena4', '1p', 'an1d', 'e1c', '1tio', 't1t', '1q', '1ble', '.re1', 'hy3ph', 'om1', '2mp', 'ca1t', 'o2n', 'l1l', 'hen5at', '.ta4'], ['gram-mar', 'mis-sis-sip-pi', 'ta-ble'], 3, 3], 'Com-mit-ment'), ('regression: competing digit resolution', ['computer', ['1tio', 'om1', 'a1b', 't1t', 'he2n', 'e1c', 'ment1', 'io3n.', '1ble', 'b2l', 'an1d', '2mp', 'pu2', 'o2n', '3ty.', 'l1l', '1na', 'hena4', 'hy3ph', '.ta4', 'con1', 'ex1', 'at1', 'r1r', 'ter1', '5nd.', 'li1', 'ca1t', '1p', '1ca', 'gr2', 'n2at', '.re1', '4ing.', '1m', '.un1', 'a2n', 'x1c', 'e2x', 'n1g', '1q', '2io', 's1s', 'c2ce'], [], 1, 1], 'com-puter'), ('partial-repair probe', ['Recreation', ['4ing.', 'r1r', '.ta4', 't1t', 'pu2', 'ter1', 'at1', 'c2ce', '2mp', 'li1', 'l1l', '1m', 'a1b', 'n2at', '.un1', 'n1g', 'm1m', 'hy3ph', 'e2x', 'om1', '1ble', 'a2n', 'x1c', 'he2n', '1tio', '.re1', 'ca1t', '1ca', '2io', 'gr2', 's1s', '1q', 'io3n.', 'o2n', 'hen5at', 'p2h', '3ty.', 'ex1', 'e1c', '1na', 'b2l'], ['ta-ble', 'gram-mar', 'pro-ject'], 1, 3], 'Re-crea-tion'), ('left minimum boundary', ['excellent', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], [], 2, 3], 'ex-cel-lent'), ('capitalised exception', ['Table', ['.ta4', 'a1b', 'b2l', '1ble', 'hy3ph', 'he2n', 'hena4', 'hen5at', '1na', 'n2at', '1tio', '2io', 'o2n', 'pu2', 'ter1', '1m', 'ex1', 'e1c', 'c2ce', 'con1', 'ment1', '4ing.', 'n1g', '.re1', 'gr2', '3ty.', 'li1', '1ca', 'ca1t', 'at1', 'io3n.', 'r1r', 'm1m', 'l1l', 't1t', 's1s', 'a2n', 'an1d', '5nd.', '1p', 'p2h', '1q', '.un1', 'e2x', 'x1c', '2mp', 'om1'], ['ta-ble'], 1, 1], 'Ta-ble'), ('control layout', ['grammar', ['l1l', '5nd.', 'ter1', 'gr2', 't1t', 'ex1', 'b2l', 'om1', 'a2n', 'm1m', 'n1g', 'p2h', '1tio', 'hen5at', '1ca', '.ta4', 'n2at', '1na', 'hena4', '.re1', 'ment1', 'e2x', 'c2ce', '2mp', 'ca1t', '4ing.', 'r1r', 'io3n.', 'x1c'], [], 2, 2], 'gram-mar'), ('control layout', ['Mississippi', ['b2l', 't1t', 'o2n', 'io3n.', 'ment1', 'hen5at', 'hy3ph', 'hena4', 'con1', 's1s', '.re1', 'ca1t', 'li1', '4ing.', 'l1l', '2mp', 'e2x', 'om1'], ['gram-mar', 'pro-ject', 'ta-ble'], 1, 2], 'Mis-sis-sippi')]]
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)

prompt:
Inhibiting even digits are overwritten by later odd digits.

Input [word, patterns, exceptions, lefthyphenmin, righthyphenmin]. An exception (hyphenated, lowercase) matching the lowercased word dictates the hyphens and keeps the word's own letters. Otherwise the lowercased word is padded with dots, every substring pattern contributes its digits and the maximum digit per gap wins; odd values allow a hyphen. A hyphen before letter i needs i>=lefthyphenmin and len-i>=righthyphenmin. Return the word with "-" inserted.

split: open-access