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

N = 1
observations = []
def solve(x):
    classes, default = x
    depth = 0
    for i, c in enumerate(classes):
        if c in ('LRI', 'RLI', 'FSI'):
            depth += 1
        elif c == 'PDI':
            if depth > 0:
                depth -= 1
        elif depth == 0:
            if c in ('L', 'EN'):
                return [0, i]
            if c in ('R', 'AL'):
                return [1, i]
    return [default, None]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('numbers are not strong', [['EN', 'ON', 'R'], 0], [1, 2]), ('regression: numbers as strong', [['NSM', 'WS', 'EN', 'EN', 'L', 'FSI', 'ON'], 0], [0, 4]), ('regression: numbers as strong', [['LRE', 'EN', 'L'], 0], [0, 2]), ('regression: numbers as strong', [['LRE', 'EN', 'EN', 'WS', 'RLI', 'R'], 0], [0, None]), ('stray PDI before isolate', [['PDI', 'RLI', 'L', 'PDI', 'R'], 0], [1, 4]), ('nested isolates', [['LRI', 'RLI', 'R', 'PDI', 'L', 'PDI', 'R'], 0], [1, 6]), ('control layout', [['L', 'RLI', 'L'], 1], [0, 0]), ('control layout', [['FSI', 'WS', 'NSM', 'AN', 'RLI', 'RLI', 'LRE', 'ON'], 1], [1, None])], [('regression: numbers as strong', [['LRE', 'AN', 'EN'], 1], [1, None]), ('regression: numbers as strong', [['ON', 'EN', 'RLI'], 0], [0, None]), ('regression: numbers as strong', [['EN', 'AN', 'WS', 'L', 'NSM', 'ON', 'LRI', 'PDI', 'EN', 'ON'], 0], [0, 3]), ('regression: numbers as strong', [['EN', 'LRE', 'R'], 0], [1, 2]), ('stray PDI before isolate', [['PDI', 'RLI', 'L', 'PDI', 'R'], 0], [1, 4]), ('nested isolates', [['LRI', 'RLI', 'R', 'PDI', 'L', 'PDI', 'R'], 0], [1, 6]), ('control layout', [['AN'], 1], [1, None]), ('control layout', [['FSI'], 0], [0, None])], [('regression: numbers as strong', [['ON', 'AN', 'ON', 'EN'], 0], [0, None]), ('regression: numbers as strong', [['AN', 'NSM', 'ON', 'EN', 'AN', 'NSM', 'L', 'WS', 'ON', 'ES'], 1], [0, 6]), ('regression: numbers as strong', [['EN', 'L', 'FSI', 'LRI', 'ON', 'R', 'EN', 'ON', 'ON', 'AL'], 0], [0, 1]), ('regression: numbers as strong', [['EN', 'PDI', 'RLI', 'FSI', 'RLI', 'WS', 'PDI', 'ON', 'EN', 'LRI'], 0], [0, None]), ('nested isolates', [['LRI', 'RLI', 'R', 'PDI', 'L', 'PDI', 'R'], 0], [1, 6]), ('numbers are not strong', [['EN', 'ON', 'R'], 0], [1, 2]), ('control layout', [['WS', 'WS', 'R', 'NSM'], 0], [1, 2]), ('control layout', [['WS', 'LRI', 'FSI', 'PDI', 'R', 'LRE'], 1], [1, None])], [('regression: numbers as strong', [['EN', 'EN', 'R', 'ON', 'PDI', 'L', 'FSI', 'ON', 'L'], 1], [1, 2]), ('regression: numbers as strong', [['EN', 'ON', 'R', 'AN', 'L', 'FSI'], 0], [1, 2]), ('regression: numbers as strong', [['EN', 'PDI', 'R', 'AL', 'LRE', 'WS', 'PDI', 'LRE', 'PDI'], 0], [1, 2]), ('regression: numbers as strong', [['EN', 'EN', 'WS', 'EN'], 0], [0, None]), ('nested isolates', [['LRI', 'RLI', 'R', 'PDI', 'L', 'PDI', 'R'], 0], [1, 6]), ('stray PDI before isolate', [['PDI', 'RLI', 'L', 'PDI', 'R'], 0], [1, 4]), ('control layout', [['PDI', 'PDI', 'LRI', 'WS', 'LRI', 'PDI', 'LRI', 'R', 'EN', 'L'], 1], [1, None]), ('control layout', [['AL', 'EN', 'L', 'WS', 'LRE', 'PDI'], 0], [1, 0])], [('regression: numbers as strong', [['PDI', 'EN', 'ON', 'EN', 'ON', 'RLI', 'LRI', 'L', 'WS'], 1], [1, None]), ('regression: numbers as strong', [['EN', 'AN', 'ES', 'RLI', 'AL', 'AL', 'ON', 'FSI'], 1], [1, None]), ('regression: numbers as strong', [['EN', 'PDI', 'FSI', 'EN', 'ES', 'AN', 'WS', 'PDI', 'ES'], 0], [0, None]), ('regression: numbers as strong', [['LRE', 'LRE', 'PDI', 'EN', 'PDI', 'L', 'ON', 'EN'], 0], [0, 5]), ('FSI content skipped', [['FSI', 'R', 'PDI', 'L'], 1], [0, 3]), ('Arabic letter decides', [['ON', 'AL', 'L'], 0], [1, 1]), ('control layout', [['LRI'], 0], [0, None]), ('control layout', [['AN', 'R'], 1], [1, 1])]]
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):
    classes, default = x
    depth = 0
    for i, c in enumerate(classes):
        if c in ('LRI', 'RLI', 'FSI'):
            depth += 1
        elif c == 'PDI':
            if depth > 0:
                depth -= 1
        elif depth == 0:
            if c == 'L' or c == 'EN' and default == 0:
                return [0, i]
            if c in ('R', 'AL'):
                return [1, i]
    return [default, None]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('numbers are not strong', [['EN', 'ON', 'R'], 0], [1, 2]), ('regression: numbers as strong', [['NSM', 'WS', 'EN', 'EN', 'L', 'FSI', 'ON'], 0], [0, 4]), ('regression: numbers as strong', [['LRE', 'EN', 'L'], 0], [0, 2]), ('regression: numbers as strong', [['LRE', 'EN', 'EN', 'WS', 'RLI', 'R'], 0], [0, None]), ('stray PDI before isolate', [['PDI', 'RLI', 'L', 'PDI', 'R'], 0], [1, 4]), ('nested isolates', [['LRI', 'RLI', 'R', 'PDI', 'L', 'PDI', 'R'], 0], [1, 6]), ('control layout', [['L', 'RLI', 'L'], 1], [0, 0]), ('control layout', [['FSI', 'WS', 'NSM', 'AN', 'RLI', 'RLI', 'LRE', 'ON'], 1], [1, None])], [('regression: numbers as strong', [['LRE', 'AN', 'EN'], 1], [1, None]), ('regression: numbers as strong', [['ON', 'EN', 'RLI'], 0], [0, None]), ('regression: numbers as strong', [['EN', 'AN', 'WS', 'L', 'NSM', 'ON', 'LRI', 'PDI', 'EN', 'ON'], 0], [0, 3]), ('regression: numbers as strong', [['EN', 'LRE', 'R'], 0], [1, 2]), ('stray PDI before isolate', [['PDI', 'RLI', 'L', 'PDI', 'R'], 0], [1, 4]), ('nested isolates', [['LRI', 'RLI', 'R', 'PDI', 'L', 'PDI', 'R'], 0], [1, 6]), ('control layout', [['AN'], 1], [1, None]), ('control layout', [['FSI'], 0], [0, None])], [('regression: numbers as strong', [['ON', 'AN', 'ON', 'EN'], 0], [0, None]), ('regression: numbers as strong', [['AN', 'NSM', 'ON', 'EN', 'AN', 'NSM', 'L', 'WS', 'ON', 'ES'], 1], [0, 6]), ('regression: numbers as strong', [['EN', 'L', 'FSI', 'LRI', 'ON', 'R', 'EN', 'ON', 'ON', 'AL'], 0], [0, 1]), ('regression: numbers as strong', [['EN', 'PDI', 'RLI', 'FSI', 'RLI', 'WS', 'PDI', 'ON', 'EN', 'LRI'], 0], [0, None]), ('nested isolates', [['LRI', 'RLI', 'R', 'PDI', 'L', 'PDI', 'R'], 0], [1, 6]), ('numbers are not strong', [['EN', 'ON', 'R'], 0], [1, 2]), ('control layout', [['WS', 'WS', 'R', 'NSM'], 0], [1, 2]), ('control layout', [['WS', 'LRI', 'FSI', 'PDI', 'R', 'LRE'], 1], [1, None])], [('regression: numbers as strong', [['EN', 'EN', 'R', 'ON', 'PDI', 'L', 'FSI', 'ON', 'L'], 1], [1, 2]), ('regression: numbers as strong', [['EN', 'ON', 'R', 'AN', 'L', 'FSI'], 0], [1, 2]), ('regression: numbers as strong', [['EN', 'PDI', 'R', 'AL', 'LRE', 'WS', 'PDI', 'LRE', 'PDI'], 0], [1, 2]), ('regression: numbers as strong', [['EN', 'EN', 'WS', 'EN'], 0], [0, None]), ('nested isolates', [['LRI', 'RLI', 'R', 'PDI', 'L', 'PDI', 'R'], 0], [1, 6]), ('stray PDI before isolate', [['PDI', 'RLI', 'L', 'PDI', 'R'], 0], [1, 4]), ('control layout', [['PDI', 'PDI', 'LRI', 'WS', 'LRI', 'PDI', 'LRI', 'R', 'EN', 'L'], 1], [1, None]), ('control layout', [['AL', 'EN', 'L', 'WS', 'LRE', 'PDI'], 0], [1, 0])], [('regression: numbers as strong', [['PDI', 'EN', 'ON', 'EN', 'ON', 'RLI', 'LRI', 'L', 'WS'], 1], [1, None]), ('regression: numbers as strong', [['EN', 'AN', 'ES', 'RLI', 'AL', 'AL', 'ON', 'FSI'], 1], [1, None]), ('regression: numbers as strong', [['EN', 'PDI', 'FSI', 'EN', 'ES', 'AN', 'WS', 'PDI', 'ES'], 0], [0, None]), ('regression: numbers as strong', [['LRE', 'LRE', 'PDI', 'EN', 'PDI', 'L', 'ON', 'EN'], 0], [0, 5]), ('FSI content skipped', [['FSI', 'R', 'PDI', 'L'], 1], [0, 3]), ('Arabic letter decides', [['ON', 'AL', 'L'], 0], [1, 1]), ('control layout', [['LRI'], 0], [0, None]), ('control layout', [['AN', 'R'], 1], [1, 1])]]
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:
Paragraphs that start with a number become left-to-right.

Input [bidi classes, default level]. Scan for the first L (level 0) or R/AL (level 1), skipping characters between an isolate initiator (LRI, RLI, FSI) and its matching PDI (nesting counted; an unmatched PDI is ignored). Embedding codes are not skipped. Return [level, index of deciding character] or [default, None].

split: open-access


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

N = 1
observations = []
def solve(x):
    classes, default = x
    depth = 0
    for i, c in enumerate(classes):
        if c in ('LRI', 'RLI', 'FSI'):
            depth = 1
        elif c == 'PDI':
            if depth > 0:
                depth -= 1
        elif depth == 0:
            if c == 'L':
                return [0, i]
            if c in ('R', 'AL'):
                return [1, i]
    return [default, None]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('nested isolates', [['LRI', 'RLI', 'R', 'PDI', 'L', 'PDI', 'R'], 0], [1, 6]), ('regression: nested isolate depth', [['LRI', 'ON', 'RLI', 'L', 'PDI', 'AL', 'R', 'WS'], 0], [0, None]), ('regression: nested isolate depth', [['LRI', 'WS', 'RLI', 'AN', 'PDI', 'AN', 'R', 'LRE', 'ES', 'L'], 1], [1, None]), ('regression: nested isolate depth', [['LRI', 'EN', 'AN', 'LRI', 'RLI', 'AL', 'R', 'AN', 'PDI', 'R'], 1], [1, None]), ('FSI content skipped', [['FSI', 'R', 'PDI', 'L'], 1], [0, 3]), ('stray PDI before isolate', [['PDI', 'RLI', 'L', 'PDI', 'R'], 0], [1, 4]), ('control layout', [['WS', 'L', 'EN', 'WS', 'EN'], 1], [0, 1]), ('control layout', [['FSI', 'EN', 'PDI', 'RLI'], 1], [1, None])], [('regression: nested isolate depth', [['WS', 'LRI', 'FSI', 'PDI', 'R', 'LRE'], 1], [1, None]), ('regression: nested isolate depth', [['FSI', 'RLI', 'AL', 'LRE', 'LRI', 'PDI', 'AL', 'L'], 1], [1, None]), ('regression: nested isolate depth', [['EN', 'ES', 'LRI', 'WS', 'WS', 'FSI', 'PDI', 'AL'], 1], [1, None]), ('regression: nested isolate depth', [['LRI', 'EN', 'AN', 'LRI', 'RLI', 'AL', 'R', 'AN', 'PDI', 'R'], 1], [1, None]), ('numbers are not strong', [['EN', 'ON', 'R'], 0], [1, 2]), ('stray PDI before isolate', [['PDI', 'RLI', 'L', 'PDI', 'R'], 0], [1, 4]), ('control layout', [['RLI', 'AL', 'L', 'L', 'LRE'], 1], [1, None]), ('control layout', [['ON', 'WS'], 1], [1, None])], [('regression: nested isolate depth', [['ON', 'RLI', 'ON', 'LRI', 'AL', 'PDI', 'L', 'NSM'], 0], [0, None]), ('regression: nested isolate depth', [['FSI', 'RLI', 'AL', 'LRE', 'LRI', 'PDI', 'AL', 'L'], 1], [1, None]), ('regression: nested isolate depth', [['LRI', 'ON', 'RLI', 'L', 'PDI', 'AL', 'R', 'WS'], 0], [0, None]), ('regression: nested isolate depth', [['WS', 'LRI', 'FSI', 'PDI', 'R', 'LRE'], 1], [1, None]), ('Arabic letter decides', [['ON', 'AL', 'L'], 0], [1, 1]), ('FSI content skipped', [['FSI', 'R', 'PDI', 'L'], 1], [0, 3]), ('control layout', [['LRI', 'RLI', 'AN', 'WS'], 1], [1, None]), ('control layout', [['AL', 'PDI', 'ON', 'R', 'ON', 'EN', 'LRE', 'NSM', 'R', 'R'], 1], [1, 0])], [('regression: nested isolate depth', [['LRI', 'WS', 'RLI', 'AN', 'PDI', 'AN', 'R', 'LRE', 'ES', 'L'], 1], [1, None]), ('nested isolates', [['LRI', 'RLI', 'R', 'PDI', 'L', 'PDI', 'R'], 0], [1, 6]), ('regression: nested isolate depth', [['LRI', 'ON', 'RLI', 'L', 'PDI', 'AL', 'R', 'WS'], 0], [0, None]), ('regression: nested isolate depth', [['EN', 'ES', 'LRI', 'WS', 'WS', 'FSI', 'PDI', 'AL'], 1], [1, None]), ('stray PDI before isolate', [['PDI', 'RLI', 'L', 'PDI', 'R'], 0], [1, 4]), ('Arabic letter decides', [['ON', 'AL', 'L'], 0], [1, 1]), ('control layout', [['ES', 'PDI', 'R', 'LRI', 'EN', 'PDI', 'AN', 'WS', 'RLI'], 0], [1, 2]), ('control layout', [['R', 'RLI', 'PDI', 'RLI', 'PDI', 'FSI', 'PDI', 'RLI', 'R'], 1], [1, 0])], [('nested isolates', [['LRI', 'RLI', 'R', 'PDI', 'L', 'PDI', 'R'], 0], [1, 6]), ('regression: nested isolate depth', [['ON', 'RLI', 'ON', 'LRI', 'AL', 'PDI', 'L', 'NSM'], 0], [0, None]), ('regression: nested isolate depth', [['LRI', 'ON', 'RLI', 'L', 'PDI', 'AL', 'R', 'WS'], 0], [0, None]), ('regression: nested isolate depth', [['FSI', 'RLI', 'AL', 'LRE', 'LRI', 'PDI', 'AL', 'L'], 1], [1, None]), ('stray PDI before isolate', [['PDI', 'RLI', 'L', 'PDI', 'R'], 0], [1, 4]), ('numbers are not strong', [['EN', 'ON', 'R'], 0], [1, 2]), ('control layout', [['AN', 'L', 'PDI', 'AL', 'R', 'WS', 'EN', 'RLI', 'WS'], 1], [0, 1]), ('control layout', [['LRI'], 0], [0, None])]]
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):
    classes, default = x
    depth = 0
    for i, c in enumerate(classes):
        if c in ('LRI', 'RLI', 'FSI'):
            depth += 1
        elif c == 'PDI':
            depth = 0
        elif depth == 0:
            if c == 'L':
                return [0, i]
            if c in ('R', 'AL'):
                return [1, i]
    return [default, None]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('nested isolates', [['LRI', 'RLI', 'R', 'PDI', 'L', 'PDI', 'R'], 0], [1, 6]), ('regression: nested isolate depth', [['LRI', 'ON', 'RLI', 'L', 'PDI', 'AL', 'R', 'WS'], 0], [0, None]), ('regression: nested isolate depth', [['LRI', 'WS', 'RLI', 'AN', 'PDI', 'AN', 'R', 'LRE', 'ES', 'L'], 1], [1, None]), ('regression: nested isolate depth', [['LRI', 'EN', 'AN', 'LRI', 'RLI', 'AL', 'R', 'AN', 'PDI', 'R'], 1], [1, None]), ('FSI content skipped', [['FSI', 'R', 'PDI', 'L'], 1], [0, 3]), ('stray PDI before isolate', [['PDI', 'RLI', 'L', 'PDI', 'R'], 0], [1, 4]), ('control layout', [['WS', 'L', 'EN', 'WS', 'EN'], 1], [0, 1]), ('control layout', [['FSI', 'EN', 'PDI', 'RLI'], 1], [1, None])], [('regression: nested isolate depth', [['WS', 'LRI', 'FSI', 'PDI', 'R', 'LRE'], 1], [1, None]), ('regression: nested isolate depth', [['FSI', 'RLI', 'AL', 'LRE', 'LRI', 'PDI', 'AL', 'L'], 1], [1, None]), ('regression: nested isolate depth', [['EN', 'ES', 'LRI', 'WS', 'WS', 'FSI', 'PDI', 'AL'], 1], [1, None]), ('regression: nested isolate depth', [['LRI', 'EN', 'AN', 'LRI', 'RLI', 'AL', 'R', 'AN', 'PDI', 'R'], 1], [1, None]), ('numbers are not strong', [['EN', 'ON', 'R'], 0], [1, 2]), ('stray PDI before isolate', [['PDI', 'RLI', 'L', 'PDI', 'R'], 0], [1, 4]), ('control layout', [['RLI', 'AL', 'L', 'L', 'LRE'], 1], [1, None]), ('control layout', [['ON', 'WS'], 1], [1, None])], [('regression: nested isolate depth', [['ON', 'RLI', 'ON', 'LRI', 'AL', 'PDI', 'L', 'NSM'], 0], [0, None]), ('regression: nested isolate depth', [['FSI', 'RLI', 'AL', 'LRE', 'LRI', 'PDI', 'AL', 'L'], 1], [1, None]), ('regression: nested isolate depth', [['LRI', 'ON', 'RLI', 'L', 'PDI', 'AL', 'R', 'WS'], 0], [0, None]), ('regression: nested isolate depth', [['WS', 'LRI', 'FSI', 'PDI', 'R', 'LRE'], 1], [1, None]), ('Arabic letter decides', [['ON', 'AL', 'L'], 0], [1, 1]), ('FSI content skipped', [['FSI', 'R', 'PDI', 'L'], 1], [0, 3]), ('control layout', [['LRI', 'RLI', 'AN', 'WS'], 1], [1, None]), ('control layout', [['AL', 'PDI', 'ON', 'R', 'ON', 'EN', 'LRE', 'NSM', 'R', 'R'], 1], [1, 0])], [('regression: nested isolate depth', [['LRI', 'WS', 'RLI', 'AN', 'PDI', 'AN', 'R', 'LRE', 'ES', 'L'], 1], [1, None]), ('nested isolates', [['LRI', 'RLI', 'R', 'PDI', 'L', 'PDI', 'R'], 0], [1, 6]), ('regression: nested isolate depth', [['LRI', 'ON', 'RLI', 'L', 'PDI', 'AL', 'R', 'WS'], 0], [0, None]), ('regression: nested isolate depth', [['EN', 'ES', 'LRI', 'WS', 'WS', 'FSI', 'PDI', 'AL'], 1], [1, None]), ('stray PDI before isolate', [['PDI', 'RLI', 'L', 'PDI', 'R'], 0], [1, 4]), ('Arabic letter decides', [['ON', 'AL', 'L'], 0], [1, 1]), ('control layout', [['ES', 'PDI', 'R', 'LRI', 'EN', 'PDI', 'AN', 'WS', 'RLI'], 0], [1, 2]), ('control layout', [['R', 'RLI', 'PDI', 'RLI', 'PDI', 'FSI', 'PDI', 'RLI', 'R'], 1], [1, 0])], [('nested isolates', [['LRI', 'RLI', 'R', 'PDI', 'L', 'PDI', 'R'], 0], [1, 6]), ('regression: nested isolate depth', [['ON', 'RLI', 'ON', 'LRI', 'AL', 'PDI', 'L', 'NSM'], 0], [0, None]), ('regression: nested isolate depth', [['LRI', 'ON', 'RLI', 'L', 'PDI', 'AL', 'R', 'WS'], 0], [0, None]), ('regression: nested isolate depth', [['FSI', 'RLI', 'AL', 'LRE', 'LRI', 'PDI', 'AL', 'L'], 1], [1, None]), ('stray PDI before isolate', [['PDI', 'RLI', 'L', 'PDI', 'R'], 0], [1, 4]), ('numbers are not strong', [['EN', 'ON', 'R'], 0], [1, 2]), ('control layout', [['AN', 'L', 'PDI', 'AL', 'R', 'WS', 'EN', 'RLI', 'WS'], 1], [0, 1]), ('control layout', [['LRI'], 0], [0, None])]]
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:
Text after an inner PDI is treated as outside all isolates.

Input [bidi classes, default level]. Scan for the first L (level 0) or R/AL (level 1), skipping characters between an isolate initiator (LRI, RLI, FSI) and its matching PDI (nesting counted; an unmatched PDI is ignored). Embedding codes are not skipped. Return [level, index of deciding character] or [default, None].

split: open-access


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

N = 1
observations = []
def solve(x):
    classes, default = x
    depth = 0
    for i, c in enumerate(classes):
        if c in ('LRI', 'RLI', 'FSI'):
            depth += 1
        elif c == 'PDI':
            if depth > 0:
                depth -= 1
        else:
            if c == 'L':
                return [0, i]
            if c in ('R', 'AL'):
                return [1, i]
    return [default, None]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('stray PDI before isolate', [['PDI', 'RLI', 'L', 'PDI', 'R'], 0], [1, 4]), ('regression: isolate content skipping', [['FSI', 'L'], 0], [0, None]), ('regression: isolate content skipping', [['FSI', 'EN', 'AL', 'PDI', 'NSM', 'AL', 'LRE', 'L', 'AL', 'PDI'], 0], [1, 5]), ('regression: isolate content skipping', [['FSI', 'AL', 'ON', 'RLI', 'FSI', 'PDI'], 1], [1, None]), ('numbers are not strong', [['EN', 'ON', 'R'], 0], [1, 2]), ('nested isolates', [['LRI', 'RLI', 'R', 'PDI', 'L', 'PDI', 'R'], 0], [1, 6]), ('control layout', [['L', 'PDI', 'WS', 'ON', 'PDI', 'ON', 'EN', 'LRE', 'EN', 'RLI'], 0], [0, 0]), ('control layout', [['FSI', 'AN'], 1], [1, None])], [('regression: isolate content skipping', [['FSI', 'ON', 'AL', 'EN', 'PDI', 'L', 'ES'], 1], [0, 5]), ('regression: isolate content skipping', [['LRE', 'EN', 'EN', 'WS', 'RLI', 'R'], 0], [0, None]), ('regression: isolate content skipping', [['FSI', 'ES', 'WS', 'EN', 'L', 'PDI'], 0], [0, None]), ('regression: isolate content skipping', [['RLI', 'L', 'PDI', 'FSI', 'LRE', 'WS', 'ON', 'RLI'], 1], [1, None]), ('Arabic letter decides', [['ON', 'AL', 'L'], 0], [1, 1]), ('stray PDI before isolate', [['PDI', 'RLI', 'L', 'PDI', 'R'], 0], [1, 4]), ('control layout', [['EN', 'RLI'], 1], [1, None]), ('control layout', [['EN', 'L', 'FSI', 'LRI', 'ON', 'R', 'EN', 'ON', 'ON', 'AL'], 0], [0, 1])], [('regression: isolate content skipping', [['LRI', 'FSI', 'WS', 'R', 'ES', 'AN'], 1], [1, None]), ('regression: isolate content skipping', [['WS', 'RLI', 'FSI', 'ON', 'AL'], 1], [1, None]), ('regression: isolate content skipping', [['RLI', 'WS', 'R', 'L', 'RLI'], 0], [0, None]), ('regression: isolate content skipping', [['FSI', 'R', 'L', 'LRE'], 1], [1, None]), ('Arabic letter decides', [['ON', 'AL', 'L'], 0], [1, 1]), ('numbers are not strong', [['EN', 'ON', 'R'], 0], [1, 2]), ('control layout', [['NSM', 'EN', 'L', 'PDI', 'ES', 'AL', 'LRI'], 0], [0, 2]), ('control layout', [['ON', 'WS', 'R', 'LRI', 'AL', 'LRE', 'R'], 0], [1, 2])], [('regression: isolate content skipping', [['EN', 'FSI', 'FSI', 'FSI', 'R', 'FSI', 'L'], 0], [0, None]), ('regression: isolate content skipping', [['LRI', 'ON', 'LRI', 'EN', 'L', 'PDI', 'EN'], 1], [1, None]), ('regression: isolate content skipping', [['LRI', 'AL', 'ON', 'PDI', 'LRI', 'EN', 'PDI'], 0], [0, None]), ('regression: isolate content skipping', [['RLI', 'AL', 'LRI', 'LRI', 'WS', 'ON'], 0], [0, None]), ('numbers are not strong', [['EN', 'ON', 'R'], 0], [1, 2]), ('Arabic letter decides', [['ON', 'AL', 'L'], 0], [1, 1]), ('control layout', [['L', 'PDI', 'EN', 'LRI', 'RLI', 'R', 'R', 'NSM', 'AN', 'R'], 0], [0, 0]), ('control layout', [['PDI'], 0], [0, None])], [('regression: isolate content skipping', [['FSI', 'L', 'EN', 'ON', 'AL', 'NSM', 'R', 'RLI', 'WS'], 0], [0, None]), ('regression: isolate content skipping', [['EN', 'ES', 'LRI', 'WS', 'WS', 'FSI', 'PDI', 'AL'], 1], [1, None]), ('regression: isolate content skipping', [['PDI', 'FSI', 'ON', 'R', 'RLI', 'WS', 'FSI', 'AL'], 1], [1, None]), ('regression: isolate content skipping', [['RLI', 'R', 'LRI', 'PDI', 'NSM', 'AN'], 1], [1, None]), ('numbers are not strong', [['EN', 'ON', 'R'], 0], [1, 2]), ('FSI content skipped', [['FSI', 'R', 'PDI', 'L'], 1], [0, 3]), ('control layout', [['ES', 'LRE', 'LRE', 'ON', 'AL', 'ON', 'R'], 0], [1, 4]), ('control layout', [['EN'], 0], [0, None])]]
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):
    classes, default = x
    depth = 0
    for i, c in enumerate(classes):
        if c in ('LRI', 'RLI', 'FSI'):
            depth += 1
        elif c == 'PDI':
            if depth > 0:
                depth -= 1
        elif depth <= 1:
            if c == 'L':
                return [0, i]
            if c in ('R', 'AL'):
                return [1, i]
    return [default, None]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('stray PDI before isolate', [['PDI', 'RLI', 'L', 'PDI', 'R'], 0], [1, 4]), ('regression: isolate content skipping', [['FSI', 'L'], 0], [0, None]), ('regression: isolate content skipping', [['FSI', 'EN', 'AL', 'PDI', 'NSM', 'AL', 'LRE', 'L', 'AL', 'PDI'], 0], [1, 5]), ('regression: isolate content skipping', [['FSI', 'AL', 'ON', 'RLI', 'FSI', 'PDI'], 1], [1, None]), ('numbers are not strong', [['EN', 'ON', 'R'], 0], [1, 2]), ('nested isolates', [['LRI', 'RLI', 'R', 'PDI', 'L', 'PDI', 'R'], 0], [1, 6]), ('control layout', [['L', 'PDI', 'WS', 'ON', 'PDI', 'ON', 'EN', 'LRE', 'EN', 'RLI'], 0], [0, 0]), ('control layout', [['FSI', 'AN'], 1], [1, None])], [('regression: isolate content skipping', [['FSI', 'ON', 'AL', 'EN', 'PDI', 'L', 'ES'], 1], [0, 5]), ('regression: isolate content skipping', [['LRE', 'EN', 'EN', 'WS', 'RLI', 'R'], 0], [0, None]), ('regression: isolate content skipping', [['FSI', 'ES', 'WS', 'EN', 'L', 'PDI'], 0], [0, None]), ('regression: isolate content skipping', [['RLI', 'L', 'PDI', 'FSI', 'LRE', 'WS', 'ON', 'RLI'], 1], [1, None]), ('Arabic letter decides', [['ON', 'AL', 'L'], 0], [1, 1]), ('stray PDI before isolate', [['PDI', 'RLI', 'L', 'PDI', 'R'], 0], [1, 4]), ('control layout', [['EN', 'RLI'], 1], [1, None]), ('control layout', [['EN', 'L', 'FSI', 'LRI', 'ON', 'R', 'EN', 'ON', 'ON', 'AL'], 0], [0, 1])], [('regression: isolate content skipping', [['LRI', 'FSI', 'WS', 'R', 'ES', 'AN'], 1], [1, None]), ('regression: isolate content skipping', [['WS', 'RLI', 'FSI', 'ON', 'AL'], 1], [1, None]), ('regression: isolate content skipping', [['RLI', 'WS', 'R', 'L', 'RLI'], 0], [0, None]), ('regression: isolate content skipping', [['FSI', 'R', 'L', 'LRE'], 1], [1, None]), ('Arabic letter decides', [['ON', 'AL', 'L'], 0], [1, 1]), ('numbers are not strong', [['EN', 'ON', 'R'], 0], [1, 2]), ('control layout', [['NSM', 'EN', 'L', 'PDI', 'ES', 'AL', 'LRI'], 0], [0, 2]), ('control layout', [['ON', 'WS', 'R', 'LRI', 'AL', 'LRE', 'R'], 0], [1, 2])], [('regression: isolate content skipping', [['EN', 'FSI', 'FSI', 'FSI', 'R', 'FSI', 'L'], 0], [0, None]), ('regression: isolate content skipping', [['LRI', 'ON', 'LRI', 'EN', 'L', 'PDI', 'EN'], 1], [1, None]), ('regression: isolate content skipping', [['LRI', 'AL', 'ON', 'PDI', 'LRI', 'EN', 'PDI'], 0], [0, None]), ('regression: isolate content skipping', [['RLI', 'AL', 'LRI', 'LRI', 'WS', 'ON'], 0], [0, None]), ('numbers are not strong', [['EN', 'ON', 'R'], 0], [1, 2]), ('Arabic letter decides', [['ON', 'AL', 'L'], 0], [1, 1]), ('control layout', [['L', 'PDI', 'EN', 'LRI', 'RLI', 'R', 'R', 'NSM', 'AN', 'R'], 0], [0, 0]), ('control layout', [['PDI'], 0], [0, None])], [('regression: isolate content skipping', [['FSI', 'L', 'EN', 'ON', 'AL', 'NSM', 'R', 'RLI', 'WS'], 0], [0, None]), ('regression: isolate content skipping', [['EN', 'ES', 'LRI', 'WS', 'WS', 'FSI', 'PDI', 'AL'], 1], [1, None]), ('regression: isolate content skipping', [['PDI', 'FSI', 'ON', 'R', 'RLI', 'WS', 'FSI', 'AL'], 1], [1, None]), ('regression: isolate content skipping', [['RLI', 'R', 'LRI', 'PDI', 'NSM', 'AN'], 1], [1, None]), ('numbers are not strong', [['EN', 'ON', 'R'], 0], [1, 2]), ('FSI content skipped', [['FSI', 'R', 'PDI', 'L'], 1], [0, 3]), ('control layout', [['ES', 'LRE', 'LRE', 'ON', 'AL', 'ON', 'R'], 0], [1, 4]), ('control layout', [['EN'], 0], [0, None])]]
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:
Letters inside isolates decide the paragraph direction.

Input [bidi classes, default level]. Scan for the first L (level 0) or R/AL (level 1), skipping characters between an isolate initiator (LRI, RLI, FSI) and its matching PDI (nesting counted; an unmatched PDI is ignored). Embedding codes are not skipped. Return [level, index of deciding character] or [default, None].

split: open-access


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

N = 1
observations = []
def solve(x):
    types, sos = x
    t = list(types)
    n = len(t)
    prev = sos
    for i in range(n):
        if t[i] == 'NSM':
            t[i] = sos
        prev = t[i]
    last_strong = sos
    for i in range(n):
        if t[i] in ('L', 'R', 'AL'):
            last_strong = t[i]
        elif t[i] == 'EN' and last_strong == 'AL':
            t[i] = 'AN'
    t = ['R' if c == 'AL' else c for c in t]
    for i in range(1, n - 1):
        if t[i] == 'ES' and t[i - 1] == 'EN' and t[i + 1] == 'EN':
            t[i] = 'EN'
        elif t[i] == 'CS' and t[i - 1] == t[i + 1] and t[i - 1] in ('EN', 'AN'):
            t[i] = t[i - 1]
    i = 0
    while i < n:
        if t[i] == 'ET':
            j = i
            while j < n and t[j] == 'ET':
                j += 1
            if (i > 0 and t[i - 1] == 'EN') or (j < n and t[j] == 'EN'):
                for k in range(i, j):
                    t[k] = 'EN'
            i = j
        else:
            i += 1
    t = ['ON' if c in ('ES', 'ET', 'CS') else c for c in t]
    strong = sos
    for i in range(n):
        if t[i] in ('L', 'R'):
            strong = t[i]
        elif t[i] == 'EN' and strong == 'L':
            t[i] = 'L'
    return t
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('regression: nonspacing mark inheritance', [['NSM', 'EN', 'LRI', 'ET', 'NSM', 'AN', 'ES', 'ET'], 'L'], ['L', 'L', 'LRI', 'ON', 'ON', 'AN', 'ON', 'ON']), ('regression: nonspacing mark inheritance', [['LRI', 'NSM', 'AN'], 'L'], ['LRI', 'ON', 'AN']), ('partial-repair probe', [['NSM', 'NSM', 'R', 'AL', 'AN', 'CS'], 'R'], ['R', 'R', 'R', 'R', 'AN', 'ON']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('control layout', [['AN', 'EN'], 'R'], ['AN', 'EN']), ('control layout', [['WS', 'L'], 'L'], ['WS', 'L'])], [('regression: nonspacing mark inheritance', [['L', 'LRI', 'CS', 'WS', 'CS', 'AN', 'NSM', 'CS', 'ON', 'AN', 'CS'], 'L'], ['L', 'LRI', 'ON', 'WS', 'ON', 'AN', 'AN', 'ON', 'ON', 'AN', 'ON']), ('regression: nonspacing mark inheritance', [['EN', 'AL', 'L', 'ES', 'NSM', 'ES', 'AL', 'ES', 'EN', 'AL'], 'R'], ['EN', 'R', 'L', 'ON', 'ON', 'ON', 'R', 'ON', 'AN', 'R']), ('partial-repair probe', [['EN', 'EN', 'NSM', 'NSM', 'EN', 'AN'], 'L'], ['L', 'L', 'L', 'L', 'L', 'AN']), ('partial-repair probe', [['R', 'L', 'NSM', 'NSM', 'AN', 'ES', 'WS', 'EN', 'EN', 'CS'], 'L'], ['R', 'L', 'L', 'L', 'AN', 'ON', 'WS', 'L', 'L', 'ON']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('control layout', [['WS', 'L', 'ET', 'EN', 'AN', 'R'], 'L'], ['WS', 'L', 'L', 'L', 'AN', 'R']), ('control layout', [['LRI', 'WS', 'ET'], 'R'], ['LRI', 'WS', 'ON'])], [('regression: nonspacing mark inheritance', [['EN', 'AL', 'L', 'ES', 'NSM', 'ES', 'AL', 'ES', 'EN', 'AL'], 'R'], ['EN', 'R', 'L', 'ON', 'ON', 'ON', 'R', 'ON', 'AN', 'R']), ('regression: nonspacing mark inheritance', [['PDI', 'ET', 'NSM', 'NSM', 'ET'], 'R'], ['PDI', 'ON', 'ON', 'ON', 'ON']), ('regression: nonspacing mark inheritance', [['NSM', 'AN', 'AL', 'NSM', 'AL', 'NSM', 'PDI', 'NSM', 'EN'], 'L'], ['L', 'AN', 'R', 'R', 'R', 'R', 'PDI', 'ON', 'AN']), ('partial-repair probe', [['NSM', 'NSM', 'EN', 'CS', 'EN', 'ON', 'WS', 'LRI', 'CS'], 'L'], ['L', 'L', 'L', 'L', 'L', 'ON', 'WS', 'LRI', 'ON']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('control layout', [['AL', 'R', 'ON'], 'R'], ['R', 'R', 'ON']), ('control layout', [['ET', 'EN', 'AN', 'L'], 'L'], ['L', 'L', 'AN', 'L'])], [('regression: nonspacing mark inheritance', [['AN', 'NSM', 'AN', 'EN', 'CS', 'CS', 'EN', 'EN', 'AL'], 'L'], ['AN', 'AN', 'AN', 'L', 'ON', 'ON', 'L', 'L', 'R']), ('regression: nonspacing mark inheritance', [['EN', 'CS', 'NSM', 'LRI'], 'R'], ['EN', 'ON', 'ON', 'LRI']), ('regression: nonspacing mark inheritance', [['ET', 'PDI', 'NSM', 'ON', 'ON', 'NSM', 'NSM', 'EN'], 'L'], ['ON', 'PDI', 'ON', 'ON', 'ON', 'ON', 'ON', 'L']), ('regression: nonspacing mark inheritance', [['ES', 'R', 'L', 'LRI', 'NSM'], 'R'], ['ON', 'R', 'L', 'LRI', 'ON']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('control layout', [['EN', 'CS', 'R', 'AL', 'ET', 'ES', 'AN', 'R', 'AL', 'AL', 'L'], 'L'], ['L', 'ON', 'R', 'R', 'ON', 'ON', 'AN', 'R', 'R', 'R', 'L']), ('control layout', [['L', 'ES', 'AL', 'LRI'], 'R'], ['L', 'ON', 'R', 'LRI'])], [('regression: nonspacing mark inheritance', [['L', 'L', 'CS', 'ET', 'CS', 'NSM', 'AL', 'LRI', 'PDI', 'L', 'ES'], 'R'], ['L', 'L', 'ON', 'ON', 'ON', 'ON', 'R', 'LRI', 'PDI', 'L', 'ON']), ('regression: nonspacing mark inheritance', [['L', 'CS', 'AL', 'NSM', 'ET', 'CS', 'AN', 'ES', 'EN'], 'R'], ['L', 'ON', 'R', 'R', 'ON', 'ON', 'AN', 'ON', 'AN']), ('partial-repair probe', [['ET', 'PDI', 'EN', 'NSM', 'NSM', 'R', 'L', 'AL'], 'L'], ['ON', 'PDI', 'L', 'L', 'L', 'R', 'L', 'R']), ('regression: nonspacing mark inheritance', [['NSM', 'AN', 'AL', 'NSM', 'AL', 'NSM', 'PDI', 'NSM', 'EN'], 'L'], ['L', 'AN', 'R', 'R', 'R', 'R', 'PDI', 'ON', 'AN']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('control layout', [['NSM', 'LRI', 'EN', 'L', 'WS'], 'L'], ['L', 'LRI', 'L', 'L', 'WS']), ('control layout', [['AN', 'ES', 'ET', 'ON', 'AL'], 'L'], ['AN', 'ON', 'ON', 'ON', 'R'])]]
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):
    types, sos = x
    t = list(types)
    n = len(t)
    prev = sos
    for i in range(n):
        if t[i] == 'NSM':
            t[i] = types[i - 1] if i else sos
        prev = t[i]
    last_strong = sos
    for i in range(n):
        if t[i] in ('L', 'R', 'AL'):
            last_strong = t[i]
        elif t[i] == 'EN' and last_strong == 'AL':
            t[i] = 'AN'
    t = ['R' if c == 'AL' else c for c in t]
    for i in range(1, n - 1):
        if t[i] == 'ES' and t[i - 1] == 'EN' and t[i + 1] == 'EN':
            t[i] = 'EN'
        elif t[i] == 'CS' and t[i - 1] == t[i + 1] and t[i - 1] in ('EN', 'AN'):
            t[i] = t[i - 1]
    i = 0
    while i < n:
        if t[i] == 'ET':
            j = i
            while j < n and t[j] == 'ET':
                j += 1
            if (i > 0 and t[i - 1] == 'EN') or (j < n and t[j] == 'EN'):
                for k in range(i, j):
                    t[k] = 'EN'
            i = j
        else:
            i += 1
    t = ['ON' if c in ('ES', 'ET', 'CS') else c for c in t]
    strong = sos
    for i in range(n):
        if t[i] in ('L', 'R'):
            strong = t[i]
        elif t[i] == 'EN' and strong == 'L':
            t[i] = 'L'
    return t
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('regression: nonspacing mark inheritance', [['NSM', 'EN', 'LRI', 'ET', 'NSM', 'AN', 'ES', 'ET'], 'L'], ['L', 'L', 'LRI', 'ON', 'ON', 'AN', 'ON', 'ON']), ('regression: nonspacing mark inheritance', [['LRI', 'NSM', 'AN'], 'L'], ['LRI', 'ON', 'AN']), ('partial-repair probe', [['NSM', 'NSM', 'R', 'AL', 'AN', 'CS'], 'R'], ['R', 'R', 'R', 'R', 'AN', 'ON']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('control layout', [['AN', 'EN'], 'R'], ['AN', 'EN']), ('control layout', [['WS', 'L'], 'L'], ['WS', 'L'])], [('regression: nonspacing mark inheritance', [['L', 'LRI', 'CS', 'WS', 'CS', 'AN', 'NSM', 'CS', 'ON', 'AN', 'CS'], 'L'], ['L', 'LRI', 'ON', 'WS', 'ON', 'AN', 'AN', 'ON', 'ON', 'AN', 'ON']), ('regression: nonspacing mark inheritance', [['EN', 'AL', 'L', 'ES', 'NSM', 'ES', 'AL', 'ES', 'EN', 'AL'], 'R'], ['EN', 'R', 'L', 'ON', 'ON', 'ON', 'R', 'ON', 'AN', 'R']), ('partial-repair probe', [['EN', 'EN', 'NSM', 'NSM', 'EN', 'AN'], 'L'], ['L', 'L', 'L', 'L', 'L', 'AN']), ('partial-repair probe', [['R', 'L', 'NSM', 'NSM', 'AN', 'ES', 'WS', 'EN', 'EN', 'CS'], 'L'], ['R', 'L', 'L', 'L', 'AN', 'ON', 'WS', 'L', 'L', 'ON']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('control layout', [['WS', 'L', 'ET', 'EN', 'AN', 'R'], 'L'], ['WS', 'L', 'L', 'L', 'AN', 'R']), ('control layout', [['LRI', 'WS', 'ET'], 'R'], ['LRI', 'WS', 'ON'])], [('regression: nonspacing mark inheritance', [['EN', 'AL', 'L', 'ES', 'NSM', 'ES', 'AL', 'ES', 'EN', 'AL'], 'R'], ['EN', 'R', 'L', 'ON', 'ON', 'ON', 'R', 'ON', 'AN', 'R']), ('regression: nonspacing mark inheritance', [['PDI', 'ET', 'NSM', 'NSM', 'ET'], 'R'], ['PDI', 'ON', 'ON', 'ON', 'ON']), ('regression: nonspacing mark inheritance', [['NSM', 'AN', 'AL', 'NSM', 'AL', 'NSM', 'PDI', 'NSM', 'EN'], 'L'], ['L', 'AN', 'R', 'R', 'R', 'R', 'PDI', 'ON', 'AN']), ('partial-repair probe', [['NSM', 'NSM', 'EN', 'CS', 'EN', 'ON', 'WS', 'LRI', 'CS'], 'L'], ['L', 'L', 'L', 'L', 'L', 'ON', 'WS', 'LRI', 'ON']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('control layout', [['AL', 'R', 'ON'], 'R'], ['R', 'R', 'ON']), ('control layout', [['ET', 'EN', 'AN', 'L'], 'L'], ['L', 'L', 'AN', 'L'])], [('regression: nonspacing mark inheritance', [['AN', 'NSM', 'AN', 'EN', 'CS', 'CS', 'EN', 'EN', 'AL'], 'L'], ['AN', 'AN', 'AN', 'L', 'ON', 'ON', 'L', 'L', 'R']), ('regression: nonspacing mark inheritance', [['EN', 'CS', 'NSM', 'LRI'], 'R'], ['EN', 'ON', 'ON', 'LRI']), ('regression: nonspacing mark inheritance', [['ET', 'PDI', 'NSM', 'ON', 'ON', 'NSM', 'NSM', 'EN'], 'L'], ['ON', 'PDI', 'ON', 'ON', 'ON', 'ON', 'ON', 'L']), ('regression: nonspacing mark inheritance', [['ES', 'R', 'L', 'LRI', 'NSM'], 'R'], ['ON', 'R', 'L', 'LRI', 'ON']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('control layout', [['EN', 'CS', 'R', 'AL', 'ET', 'ES', 'AN', 'R', 'AL', 'AL', 'L'], 'L'], ['L', 'ON', 'R', 'R', 'ON', 'ON', 'AN', 'R', 'R', 'R', 'L']), ('control layout', [['L', 'ES', 'AL', 'LRI'], 'R'], ['L', 'ON', 'R', 'LRI'])], [('regression: nonspacing mark inheritance', [['L', 'L', 'CS', 'ET', 'CS', 'NSM', 'AL', 'LRI', 'PDI', 'L', 'ES'], 'R'], ['L', 'L', 'ON', 'ON', 'ON', 'ON', 'R', 'LRI', 'PDI', 'L', 'ON']), ('regression: nonspacing mark inheritance', [['L', 'CS', 'AL', 'NSM', 'ET', 'CS', 'AN', 'ES', 'EN'], 'R'], ['L', 'ON', 'R', 'R', 'ON', 'ON', 'AN', 'ON', 'AN']), ('partial-repair probe', [['ET', 'PDI', 'EN', 'NSM', 'NSM', 'R', 'L', 'AL'], 'L'], ['ON', 'PDI', 'L', 'L', 'L', 'R', 'L', 'R']), ('regression: nonspacing mark inheritance', [['NSM', 'AN', 'AL', 'NSM', 'AL', 'NSM', 'PDI', 'NSM', 'EN'], 'L'], ['L', 'AN', 'R', 'R', 'R', 'R', 'PDI', 'ON', 'AN']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('control layout', [['NSM', 'LRI', 'EN', 'L', 'WS'], 'L'], ['L', 'LRI', 'L', 'L', 'WS']), ('control layout', [['AN', 'ES', 'ET', 'ON', 'AL'], 'L'], ['AN', 'ON', 'ON', 'ON', 'R'])]]
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:
Combining marks take the sequence start type instead of their base.

Input [classes of one isolating run sequence, sos]. W1 NSM takes the previous type (sos at start; ON after LRI/RLI/FSI/PDI). W2 EN after the last strong AL becomes AN. W3 AL->R. W4 a single ES between EN and EN -> EN; a single CS between two numbers of the same type takes that type. W5 a run of ET adjacent to EN -> EN. W6 remaining ES/ET/CS -> ON. W7 EN whose last strong (sos at start) is L -> L. Return resolved classes.

split: open-access


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

N = 1
observations = []
def solve(x):
    types, sos = x
    t = list(types)
    n = len(t)
    prev = sos
    for i in range(n):
        if t[i] == 'NSM':
            t[i] = prev
        prev = t[i]
    last_strong = sos
    for i in range(n):
        if t[i] in ('L', 'R', 'AL'):
            last_strong = t[i]
        elif t[i] == 'EN' and last_strong == 'AL':
            t[i] = 'AN'
    t = ['R' if c == 'AL' else c for c in t]
    for i in range(1, n - 1):
        if t[i] == 'ES' and t[i - 1] == 'EN' and t[i + 1] == 'EN':
            t[i] = 'EN'
        elif t[i] == 'CS' and t[i - 1] == t[i + 1] and t[i - 1] in ('EN', 'AN'):
            t[i] = t[i - 1]
    i = 0
    while i < n:
        if t[i] == 'ET':
            j = i
            while j < n and t[j] == 'ET':
                j += 1
            if (i > 0 and t[i - 1] == 'EN') or (j < n and t[j] == 'EN'):
                for k in range(i, j):
                    t[k] = 'EN'
            i = j
        else:
            i += 1
    t = ['ON' if c in ('ES', 'ET', 'CS') else c for c in t]
    strong = sos
    for i in range(n):
        if t[i] in ('L', 'R'):
            strong = t[i]
        elif t[i] == 'EN' and strong == 'L':
            t[i] = 'L'
    return t
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('regression: mark after isolate boundary', [['ON', 'AL', 'ET', 'LRI', 'LRI', 'NSM', 'ES', 'PDI', 'WS', 'EN', 'ET'], 'L'], ['ON', 'R', 'ON', 'LRI', 'LRI', 'ON', 'ON', 'PDI', 'WS', 'AN', 'ON']), ('regression: mark after isolate boundary', [['L', 'R', 'ET', 'AL', 'ET', 'EN', 'LRI', 'NSM', 'WS'], 'R'], ['L', 'R', 'ON', 'R', 'ON', 'AN', 'LRI', 'ON', 'WS']), ('regression: mark after isolate boundary', [['LRI', 'NSM', 'AN'], 'L'], ['LRI', 'ON', 'AN']), ('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('control layout', [['ET', 'L', 'CS', 'NSM', 'WS', 'ES', 'ON', 'LRI'], 'L'], ['ON', 'L', 'ON', 'ON', 'WS', 'ON', 'ON', 'LRI']), ('control layout', [['R', 'WS', 'NSM'], 'R'], ['R', 'WS', 'WS'])], [('regression: mark after isolate boundary', [['ON', 'AL', 'ET', 'LRI', 'LRI', 'NSM', 'ES', 'PDI', 'WS', 'EN', 'ET'], 'L'], ['ON', 'R', 'ON', 'LRI', 'LRI', 'ON', 'ON', 'PDI', 'WS', 'AN', 'ON']), ('regression: mark after isolate boundary', [['ET', 'PDI', 'NSM', 'ON', 'ON', 'NSM', 'NSM', 'EN'], 'L'], ['ON', 'PDI', 'ON', 'ON', 'ON', 'ON', 'ON', 'L']), ('regression: mark after isolate boundary', [['L', 'R', 'ET', 'AL', 'ET', 'EN', 'LRI', 'NSM', 'WS'], 'R'], ['L', 'R', 'ON', 'R', 'ON', 'AN', 'LRI', 'ON', 'WS']), ('regression: mark after isolate boundary', [['AL', 'AL', 'EN', 'WS', 'LRI', 'NSM', 'AL', 'CS'], 'L'], ['R', 'R', 'AN', 'WS', 'LRI', 'ON', 'R', 'ON']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('control layout', [['ES', 'WS', 'LRI', 'AN', 'EN', 'R', 'ET', 'AN', 'CS', 'R', 'ES'], 'L'], ['ON', 'WS', 'LRI', 'AN', 'L', 'R', 'ON', 'AN', 'ON', 'R', 'ON']), ('control layout', [['AL', 'R', 'ON'], 'R'], ['R', 'R', 'ON'])], [('regression: mark after isolate boundary', [['PDI', 'NSM', 'AL', 'EN', 'NSM'], 'R'], ['PDI', 'ON', 'R', 'AN', 'AN']), ('regression: mark after isolate boundary', [['ET', 'AL', 'EN', 'ET', 'R', 'ES', 'LRI', 'NSM', 'PDI', 'L'], 'R'], ['ON', 'R', 'AN', 'ON', 'R', 'ON', 'LRI', 'ON', 'PDI', 'L']), ('regression: mark after isolate boundary', [['EN', 'ON', 'EN', 'PDI', 'NSM', 'EN', 'LRI', 'NSM', 'AN', 'EN', 'CS'], 'R'], ['EN', 'ON', 'EN', 'PDI', 'ON', 'EN', 'LRI', 'ON', 'AN', 'EN', 'ON']), ('regression: mark after isolate boundary', [['ES', 'R', 'L', 'LRI', 'NSM'], 'R'], ['ON', 'R', 'L', 'LRI', 'ON']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['ES', 'WS', 'R', 'L', 'ET', 'ET', 'AL'], 'L'], ['ON', 'WS', 'R', 'L', 'ON', 'ON', 'R']), ('control layout', [['L', 'LRI', 'PDI', 'R', 'EN', 'NSM', 'AN', 'NSM'], 'L'], ['L', 'LRI', 'PDI', 'R', 'EN', 'EN', 'AN', 'AN'])], [('regression: mark after isolate boundary', [['EN', 'NSM', 'ES', 'NSM', 'EN', 'LRI', 'NSM', 'WS', 'L'], 'R'], ['EN', 'EN', 'ON', 'ON', 'EN', 'LRI', 'ON', 'WS', 'L']), ('regression: mark after isolate boundary', [['PDI', 'NSM', 'AL', 'R', 'WS'], 'R'], ['PDI', 'ON', 'R', 'R', 'WS']), ('regression: mark after isolate boundary', [['R', 'NSM', 'AN', 'CS', 'ET', 'ET', 'LRI', 'NSM', 'L', 'EN', 'R'], 'R'], ['R', 'R', 'AN', 'ON', 'ON', 'ON', 'LRI', 'ON', 'L', 'L', 'R']), ('regression: mark after isolate boundary', [['ES', 'R', 'L', 'LRI', 'NSM'], 'R'], ['ON', 'R', 'L', 'LRI', 'ON']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('control layout', [['NSM', 'CS', 'PDI', 'ES', 'CS', 'EN'], 'L'], ['L', 'ON', 'PDI', 'ON', 'ON', 'L']), ('control layout', [['NSM', 'AL'], 'R'], ['R', 'R'])], [('regression: mark after isolate boundary', [['NSM', 'L', 'LRI', 'CS', 'R', 'NSM', 'AL', 'LRI', 'NSM'], 'R'], ['R', 'L', 'LRI', 'ON', 'R', 'R', 'R', 'LRI', 'ON']), ('regression: mark after isolate boundary', [['EN', 'NSM', 'ES', 'NSM', 'EN', 'LRI', 'NSM', 'WS', 'L'], 'R'], ['EN', 'EN', 'ON', 'ON', 'EN', 'LRI', 'ON', 'WS', 'L']), ('regression: mark after isolate boundary', [['ON', 'AL', 'ET', 'LRI', 'LRI', 'NSM', 'ES', 'PDI', 'WS', 'EN', 'ET'], 'L'], ['ON', 'R', 'ON', 'LRI', 'LRI', 'ON', 'ON', 'PDI', 'WS', 'AN', 'ON']), ('regression: mark after isolate boundary', [['R', 'NSM', 'AN', 'CS', 'ET', 'ET', 'LRI', 'NSM', 'L', 'EN', 'R'], 'R'], ['R', 'R', 'AN', 'ON', 'ON', 'ON', 'LRI', 'ON', 'L', 'L', 'R']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['ET', 'EN', 'LRI', 'R', 'ET', 'ET', 'L', 'CS', 'EN', 'AL', 'L'], 'L'], ['L', 'L', 'LRI', 'R', 'ON', 'ON', 'L', 'ON', 'L', 'R', 'L']), ('control layout', [['AL', 'EN', 'CS', 'ET', 'ES', 'CS', 'CS'], 'L'], ['R', 'AN', 'ON', 'ON', 'ON', 'ON', 'ON'])]]
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):
    types, sos = x
    t = list(types)
    n = len(t)
    prev = sos
    for i in range(n):
        if t[i] == 'NSM':
            t[i] = 'ON' if prev == 'PDI' else prev
        prev = t[i]
    last_strong = sos
    for i in range(n):
        if t[i] in ('L', 'R', 'AL'):
            last_strong = t[i]
        elif t[i] == 'EN' and last_strong == 'AL':
            t[i] = 'AN'
    t = ['R' if c == 'AL' else c for c in t]
    for i in range(1, n - 1):
        if t[i] == 'ES' and t[i - 1] == 'EN' and t[i + 1] == 'EN':
            t[i] = 'EN'
        elif t[i] == 'CS' and t[i - 1] == t[i + 1] and t[i - 1] in ('EN', 'AN'):
            t[i] = t[i - 1]
    i = 0
    while i < n:
        if t[i] == 'ET':
            j = i
            while j < n and t[j] == 'ET':
                j += 1
            if (i > 0 and t[i - 1] == 'EN') or (j < n and t[j] == 'EN'):
                for k in range(i, j):
                    t[k] = 'EN'
            i = j
        else:
            i += 1
    t = ['ON' if c in ('ES', 'ET', 'CS') else c for c in t]
    strong = sos
    for i in range(n):
        if t[i] in ('L', 'R'):
            strong = t[i]
        elif t[i] == 'EN' and strong == 'L':
            t[i] = 'L'
    return t
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('regression: mark after isolate boundary', [['ON', 'AL', 'ET', 'LRI', 'LRI', 'NSM', 'ES', 'PDI', 'WS', 'EN', 'ET'], 'L'], ['ON', 'R', 'ON', 'LRI', 'LRI', 'ON', 'ON', 'PDI', 'WS', 'AN', 'ON']), ('regression: mark after isolate boundary', [['L', 'R', 'ET', 'AL', 'ET', 'EN', 'LRI', 'NSM', 'WS'], 'R'], ['L', 'R', 'ON', 'R', 'ON', 'AN', 'LRI', 'ON', 'WS']), ('regression: mark after isolate boundary', [['LRI', 'NSM', 'AN'], 'L'], ['LRI', 'ON', 'AN']), ('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('control layout', [['ET', 'L', 'CS', 'NSM', 'WS', 'ES', 'ON', 'LRI'], 'L'], ['ON', 'L', 'ON', 'ON', 'WS', 'ON', 'ON', 'LRI']), ('control layout', [['R', 'WS', 'NSM'], 'R'], ['R', 'WS', 'WS'])], [('regression: mark after isolate boundary', [['ON', 'AL', 'ET', 'LRI', 'LRI', 'NSM', 'ES', 'PDI', 'WS', 'EN', 'ET'], 'L'], ['ON', 'R', 'ON', 'LRI', 'LRI', 'ON', 'ON', 'PDI', 'WS', 'AN', 'ON']), ('regression: mark after isolate boundary', [['ET', 'PDI', 'NSM', 'ON', 'ON', 'NSM', 'NSM', 'EN'], 'L'], ['ON', 'PDI', 'ON', 'ON', 'ON', 'ON', 'ON', 'L']), ('regression: mark after isolate boundary', [['L', 'R', 'ET', 'AL', 'ET', 'EN', 'LRI', 'NSM', 'WS'], 'R'], ['L', 'R', 'ON', 'R', 'ON', 'AN', 'LRI', 'ON', 'WS']), ('regression: mark after isolate boundary', [['AL', 'AL', 'EN', 'WS', 'LRI', 'NSM', 'AL', 'CS'], 'L'], ['R', 'R', 'AN', 'WS', 'LRI', 'ON', 'R', 'ON']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('control layout', [['ES', 'WS', 'LRI', 'AN', 'EN', 'R', 'ET', 'AN', 'CS', 'R', 'ES'], 'L'], ['ON', 'WS', 'LRI', 'AN', 'L', 'R', 'ON', 'AN', 'ON', 'R', 'ON']), ('control layout', [['AL', 'R', 'ON'], 'R'], ['R', 'R', 'ON'])], [('regression: mark after isolate boundary', [['PDI', 'NSM', 'AL', 'EN', 'NSM'], 'R'], ['PDI', 'ON', 'R', 'AN', 'AN']), ('regression: mark after isolate boundary', [['ET', 'AL', 'EN', 'ET', 'R', 'ES', 'LRI', 'NSM', 'PDI', 'L'], 'R'], ['ON', 'R', 'AN', 'ON', 'R', 'ON', 'LRI', 'ON', 'PDI', 'L']), ('regression: mark after isolate boundary', [['EN', 'ON', 'EN', 'PDI', 'NSM', 'EN', 'LRI', 'NSM', 'AN', 'EN', 'CS'], 'R'], ['EN', 'ON', 'EN', 'PDI', 'ON', 'EN', 'LRI', 'ON', 'AN', 'EN', 'ON']), ('regression: mark after isolate boundary', [['ES', 'R', 'L', 'LRI', 'NSM'], 'R'], ['ON', 'R', 'L', 'LRI', 'ON']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['ES', 'WS', 'R', 'L', 'ET', 'ET', 'AL'], 'L'], ['ON', 'WS', 'R', 'L', 'ON', 'ON', 'R']), ('control layout', [['L', 'LRI', 'PDI', 'R', 'EN', 'NSM', 'AN', 'NSM'], 'L'], ['L', 'LRI', 'PDI', 'R', 'EN', 'EN', 'AN', 'AN'])], [('regression: mark after isolate boundary', [['EN', 'NSM', 'ES', 'NSM', 'EN', 'LRI', 'NSM', 'WS', 'L'], 'R'], ['EN', 'EN', 'ON', 'ON', 'EN', 'LRI', 'ON', 'WS', 'L']), ('regression: mark after isolate boundary', [['PDI', 'NSM', 'AL', 'R', 'WS'], 'R'], ['PDI', 'ON', 'R', 'R', 'WS']), ('regression: mark after isolate boundary', [['R', 'NSM', 'AN', 'CS', 'ET', 'ET', 'LRI', 'NSM', 'L', 'EN', 'R'], 'R'], ['R', 'R', 'AN', 'ON', 'ON', 'ON', 'LRI', 'ON', 'L', 'L', 'R']), ('regression: mark after isolate boundary', [['ES', 'R', 'L', 'LRI', 'NSM'], 'R'], ['ON', 'R', 'L', 'LRI', 'ON']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('control layout', [['NSM', 'CS', 'PDI', 'ES', 'CS', 'EN'], 'L'], ['L', 'ON', 'PDI', 'ON', 'ON', 'L']), ('control layout', [['NSM', 'AL'], 'R'], ['R', 'R'])], [('regression: mark after isolate boundary', [['NSM', 'L', 'LRI', 'CS', 'R', 'NSM', 'AL', 'LRI', 'NSM'], 'R'], ['R', 'L', 'LRI', 'ON', 'R', 'R', 'R', 'LRI', 'ON']), ('regression: mark after isolate boundary', [['EN', 'NSM', 'ES', 'NSM', 'EN', 'LRI', 'NSM', 'WS', 'L'], 'R'], ['EN', 'EN', 'ON', 'ON', 'EN', 'LRI', 'ON', 'WS', 'L']), ('regression: mark after isolate boundary', [['ON', 'AL', 'ET', 'LRI', 'LRI', 'NSM', 'ES', 'PDI', 'WS', 'EN', 'ET'], 'L'], ['ON', 'R', 'ON', 'LRI', 'LRI', 'ON', 'ON', 'PDI', 'WS', 'AN', 'ON']), ('regression: mark after isolate boundary', [['R', 'NSM', 'AN', 'CS', 'ET', 'ET', 'LRI', 'NSM', 'L', 'EN', 'R'], 'R'], ['R', 'R', 'AN', 'ON', 'ON', 'ON', 'LRI', 'ON', 'L', 'L', 'R']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['ET', 'EN', 'LRI', 'R', 'ET', 'ET', 'L', 'CS', 'EN', 'AL', 'L'], 'L'], ['L', 'L', 'LRI', 'R', 'ON', 'ON', 'L', 'ON', 'L', 'R', 'L']), ('control layout', [['AL', 'EN', 'CS', 'ET', 'ES', 'CS', 'CS'], 'L'], ['R', 'AN', 'ON', 'ON', 'ON', 'ON', 'ON'])]]
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:
A combining mark after an isolate initiator or PDI inherits an isolate class.

Input [classes of one isolating run sequence, sos]. W1 NSM takes the previous type (sos at start; ON after LRI/RLI/FSI/PDI). W2 EN after the last strong AL becomes AN. W3 AL->R. W4 a single ES between EN and EN -> EN; a single CS between two numbers of the same type takes that type. W5 a run of ET adjacent to EN -> EN. W6 remaining ES/ET/CS -> ON. W7 EN whose last strong (sos at start) is L -> L. Return resolved classes.

split: open-access


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

N = 1
observations = []
def solve(x):
    types, sos = x
    t = list(types)
    n = len(t)
    prev = sos
    for i in range(n):
        if t[i] == 'NSM':
            t[i] = 'ON' if prev in ('LRI', 'RLI', 'FSI', 'PDI') else prev
        prev = t[i]
    last_strong = sos
    for i in range(n):
        if t[i] in ('L', 'R'):
            last_strong = t[i]
        elif t[i] == 'EN' and last_strong == 'AL':
            t[i] = 'AN'
    t = ['R' if c == 'AL' else c for c in t]
    for i in range(1, n - 1):
        if t[i] == 'ES' and t[i - 1] == 'EN' and t[i + 1] == 'EN':
            t[i] = 'EN'
        elif t[i] == 'CS' and t[i - 1] == t[i + 1] and t[i - 1] in ('EN', 'AN'):
            t[i] = t[i - 1]
    i = 0
    while i < n:
        if t[i] == 'ET':
            j = i
            while j < n and t[j] == 'ET':
                j += 1
            if (i > 0 and t[i - 1] == 'EN') or (j < n and t[j] == 'EN'):
                for k in range(i, j):
                    t[k] = 'EN'
            i = j
        else:
            i += 1
    t = ['ON' if c in ('ES', 'ET', 'CS') else c for c in t]
    strong = sos
    for i in range(n):
        if t[i] in ('L', 'R'):
            strong = t[i]
        elif t[i] == 'EN' and strong == 'L':
            t[i] = 'L'
    return t
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('regression: Arabic context tracking', [['EN', 'R', 'R', 'L', 'AL', 'EN', 'AL', 'ES'], 'R'], ['EN', 'R', 'R', 'L', 'R', 'AN', 'R', 'ON']), ('partial-repair probe', [['NSM', 'AL', 'ON', 'ON', 'ES', 'R', 'ES', 'EN', 'PDI', 'AN'], 'R'], ['R', 'R', 'ON', 'ON', 'ON', 'R', 'ON', 'EN', 'PDI', 'AN']), ('regression: Arabic context tracking', [['AL', 'EN', 'NSM', 'R', 'NSM', 'EN', 'CS', 'AN', 'EN'], 'L'], ['R', 'AN', 'AN', 'R', 'R', 'EN', 'ON', 'AN', 'EN']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['WS', 'ES', 'R', 'L'], 'L'], ['WS', 'ON', 'R', 'L']), ('control layout', [['ET', 'R'], 'L'], ['ON', 'R'])], [('regression: Arabic context tracking', [['NSM', 'AL', 'WS', 'EN', 'CS', 'ON', 'ON', 'AL', 'PDI', 'AL'], 'L'], ['L', 'R', 'WS', 'AN', 'ON', 'ON', 'ON', 'R', 'PDI', 'R']), ('regression: Arabic context tracking', [['AL', 'R', 'CS', 'AN', 'AL', 'ES', 'EN', 'R', 'LRI', 'WS'], 'R'], ['R', 'R', 'ON', 'AN', 'R', 'ON', 'AN', 'R', 'LRI', 'WS']), ('partial-repair probe', [['PDI', 'NSM', 'AN', 'WS', 'WS', 'ET', 'AL', 'R', 'EN', 'ON', 'AN'], 'R'], ['PDI', 'ON', 'AN', 'WS', 'WS', 'ON', 'R', 'R', 'EN', 'ON', 'AN']), ('regression: Arabic context tracking', [['ET', 'AL', 'AN', 'EN', 'R', 'ET', 'EN', 'AN', 'EN'], 'L'], ['ON', 'R', 'AN', 'AN', 'R', 'EN', 'EN', 'AN', 'EN']), ('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['ES', 'EN', 'PDI'], 'L'], ['ON', 'L', 'PDI']), ('control layout', [['NSM', 'NSM', 'R', 'AL', 'AN', 'ON', 'L'], 'R'], ['R', 'R', 'R', 'R', 'AN', 'ON', 'L'])], [('regression: Arabic context tracking', [['L', 'AL', 'WS', 'EN', 'PDI', 'R', 'NSM'], 'R'], ['L', 'R', 'WS', 'AN', 'PDI', 'R', 'R']), ('regression: Arabic context tracking', [['AL', 'EN', 'NSM', 'R', 'NSM', 'EN', 'CS', 'AN', 'EN'], 'L'], ['R', 'AN', 'AN', 'R', 'R', 'EN', 'ON', 'AN', 'EN']), ('partial-repair probe', [['ON', 'PDI', 'AL', 'R', 'ON', 'CS', 'WS', 'EN'], 'R'], ['ON', 'PDI', 'R', 'R', 'ON', 'ON', 'WS', 'EN']), ('partial-repair probe', [['AL', 'ET', 'LRI', 'ES', 'NSM', 'R', 'LRI', 'ES', 'R', 'EN'], 'L'], ['R', 'ON', 'LRI', 'ON', 'ON', 'R', 'LRI', 'ON', 'R', 'EN']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('control layout', [['AL', 'AL', 'R'], 'L'], ['R', 'R', 'R']), ('control layout', [['R', 'ET', 'L'], 'L'], ['R', 'ON', 'L'])], [('regression: Arabic context tracking', [['ES', 'R', 'AL', 'EN', 'AL'], 'R'], ['ON', 'R', 'R', 'AN', 'R']), ('regression: Arabic context tracking', [['L', 'EN', 'AL', 'EN', 'ET'], 'L'], ['L', 'L', 'R', 'AN', 'ON']), ('regression: Arabic context tracking', [['AL', 'EN', 'EN', 'LRI', 'R', 'CS', 'AN', 'EN', 'EN'], 'R'], ['R', 'AN', 'AN', 'LRI', 'R', 'ON', 'AN', 'EN', 'EN']), ('partial-repair probe', [['ES', 'ET', 'EN', 'AN', 'EN', 'AL', 'R', 'ON', 'LRI', 'ES', 'EN'], 'R'], ['ON', 'EN', 'EN', 'AN', 'EN', 'R', 'R', 'ON', 'LRI', 'ON', 'EN']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('control layout', [['WS', 'NSM', 'L', 'NSM', 'PDI'], 'R'], ['WS', 'WS', 'L', 'L', 'PDI']), ('control layout', [['AN', 'R', 'AL', 'PDI', 'PDI', 'AL', 'AN', 'WS', 'AL', 'PDI', 'NSM'], 'R'], ['AN', 'R', 'R', 'PDI', 'PDI', 'R', 'AN', 'WS', 'R', 'PDI', 'ON'])], [('regression: Arabic context tracking', [['AL', 'ES', 'ON', 'AL', 'ON', 'CS', 'AN', 'EN', 'AL', 'NSM', 'ES'], 'R'], ['R', 'ON', 'ON', 'R', 'ON', 'ON', 'AN', 'AN', 'R', 'R', 'ON']), ('regression: Arabic context tracking', [['CS', 'ES', 'ES', 'AL', 'EN', 'NSM', 'AN'], 'L'], ['ON', 'ON', 'ON', 'R', 'AN', 'AN', 'AN']), ('partial-repair probe', [['NSM', 'AL', 'ON', 'ON', 'ES', 'R', 'ES', 'EN', 'PDI', 'AN'], 'R'], ['R', 'R', 'ON', 'ON', 'ON', 'R', 'ON', 'EN', 'PDI', 'AN']), ('partial-repair probe', [['AN', 'CS', 'AL', 'R', 'AN', 'CS', 'ON', 'EN'], 'L'], ['AN', 'ON', 'R', 'R', 'AN', 'ON', 'ON', 'EN']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('control layout', [['ET', 'CS', 'R', 'L', 'CS', 'PDI', 'AL', 'R', 'LRI', 'AL', 'CS'], 'R'], ['ON', 'ON', 'R', 'L', 'ON', 'PDI', 'R', 'R', 'LRI', 'R', 'ON']), ('control layout', [['AN', 'ET', 'AL'], 'L'], ['AN', 'ON', 'R'])]]
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):
    types, sos = x
    t = list(types)
    n = len(t)
    prev = sos
    for i in range(n):
        if t[i] == 'NSM':
            t[i] = 'ON' if prev in ('LRI', 'RLI', 'FSI', 'PDI') else prev
        prev = t[i]
    last_strong = sos
    for i in range(n):
        if t[i] in ('L', 'AL'):
            last_strong = t[i]
        elif t[i] == 'EN' and last_strong == 'AL':
            t[i] = 'AN'
    t = ['R' if c == 'AL' else c for c in t]
    for i in range(1, n - 1):
        if t[i] == 'ES' and t[i - 1] == 'EN' and t[i + 1] == 'EN':
            t[i] = 'EN'
        elif t[i] == 'CS' and t[i - 1] == t[i + 1] and t[i - 1] in ('EN', 'AN'):
            t[i] = t[i - 1]
    i = 0
    while i < n:
        if t[i] == 'ET':
            j = i
            while j < n and t[j] == 'ET':
                j += 1
            if (i > 0 and t[i - 1] == 'EN') or (j < n and t[j] == 'EN'):
                for k in range(i, j):
                    t[k] = 'EN'
            i = j
        else:
            i += 1
    t = ['ON' if c in ('ES', 'ET', 'CS') else c for c in t]
    strong = sos
    for i in range(n):
        if t[i] in ('L', 'R'):
            strong = t[i]
        elif t[i] == 'EN' and strong == 'L':
            t[i] = 'L'
    return t
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('regression: Arabic context tracking', [['EN', 'R', 'R', 'L', 'AL', 'EN', 'AL', 'ES'], 'R'], ['EN', 'R', 'R', 'L', 'R', 'AN', 'R', 'ON']), ('partial-repair probe', [['NSM', 'AL', 'ON', 'ON', 'ES', 'R', 'ES', 'EN', 'PDI', 'AN'], 'R'], ['R', 'R', 'ON', 'ON', 'ON', 'R', 'ON', 'EN', 'PDI', 'AN']), ('regression: Arabic context tracking', [['AL', 'EN', 'NSM', 'R', 'NSM', 'EN', 'CS', 'AN', 'EN'], 'L'], ['R', 'AN', 'AN', 'R', 'R', 'EN', 'ON', 'AN', 'EN']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['WS', 'ES', 'R', 'L'], 'L'], ['WS', 'ON', 'R', 'L']), ('control layout', [['ET', 'R'], 'L'], ['ON', 'R'])], [('regression: Arabic context tracking', [['NSM', 'AL', 'WS', 'EN', 'CS', 'ON', 'ON', 'AL', 'PDI', 'AL'], 'L'], ['L', 'R', 'WS', 'AN', 'ON', 'ON', 'ON', 'R', 'PDI', 'R']), ('regression: Arabic context tracking', [['AL', 'R', 'CS', 'AN', 'AL', 'ES', 'EN', 'R', 'LRI', 'WS'], 'R'], ['R', 'R', 'ON', 'AN', 'R', 'ON', 'AN', 'R', 'LRI', 'WS']), ('partial-repair probe', [['PDI', 'NSM', 'AN', 'WS', 'WS', 'ET', 'AL', 'R', 'EN', 'ON', 'AN'], 'R'], ['PDI', 'ON', 'AN', 'WS', 'WS', 'ON', 'R', 'R', 'EN', 'ON', 'AN']), ('regression: Arabic context tracking', [['ET', 'AL', 'AN', 'EN', 'R', 'ET', 'EN', 'AN', 'EN'], 'L'], ['ON', 'R', 'AN', 'AN', 'R', 'EN', 'EN', 'AN', 'EN']), ('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['ES', 'EN', 'PDI'], 'L'], ['ON', 'L', 'PDI']), ('control layout', [['NSM', 'NSM', 'R', 'AL', 'AN', 'ON', 'L'], 'R'], ['R', 'R', 'R', 'R', 'AN', 'ON', 'L'])], [('regression: Arabic context tracking', [['L', 'AL', 'WS', 'EN', 'PDI', 'R', 'NSM'], 'R'], ['L', 'R', 'WS', 'AN', 'PDI', 'R', 'R']), ('regression: Arabic context tracking', [['AL', 'EN', 'NSM', 'R', 'NSM', 'EN', 'CS', 'AN', 'EN'], 'L'], ['R', 'AN', 'AN', 'R', 'R', 'EN', 'ON', 'AN', 'EN']), ('partial-repair probe', [['ON', 'PDI', 'AL', 'R', 'ON', 'CS', 'WS', 'EN'], 'R'], ['ON', 'PDI', 'R', 'R', 'ON', 'ON', 'WS', 'EN']), ('partial-repair probe', [['AL', 'ET', 'LRI', 'ES', 'NSM', 'R', 'LRI', 'ES', 'R', 'EN'], 'L'], ['R', 'ON', 'LRI', 'ON', 'ON', 'R', 'LRI', 'ON', 'R', 'EN']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('control layout', [['AL', 'AL', 'R'], 'L'], ['R', 'R', 'R']), ('control layout', [['R', 'ET', 'L'], 'L'], ['R', 'ON', 'L'])], [('regression: Arabic context tracking', [['ES', 'R', 'AL', 'EN', 'AL'], 'R'], ['ON', 'R', 'R', 'AN', 'R']), ('regression: Arabic context tracking', [['L', 'EN', 'AL', 'EN', 'ET'], 'L'], ['L', 'L', 'R', 'AN', 'ON']), ('regression: Arabic context tracking', [['AL', 'EN', 'EN', 'LRI', 'R', 'CS', 'AN', 'EN', 'EN'], 'R'], ['R', 'AN', 'AN', 'LRI', 'R', 'ON', 'AN', 'EN', 'EN']), ('partial-repair probe', [['ES', 'ET', 'EN', 'AN', 'EN', 'AL', 'R', 'ON', 'LRI', 'ES', 'EN'], 'R'], ['ON', 'EN', 'EN', 'AN', 'EN', 'R', 'R', 'ON', 'LRI', 'ON', 'EN']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('control layout', [['WS', 'NSM', 'L', 'NSM', 'PDI'], 'R'], ['WS', 'WS', 'L', 'L', 'PDI']), ('control layout', [['AN', 'R', 'AL', 'PDI', 'PDI', 'AL', 'AN', 'WS', 'AL', 'PDI', 'NSM'], 'R'], ['AN', 'R', 'R', 'PDI', 'PDI', 'R', 'AN', 'WS', 'R', 'PDI', 'ON'])], [('regression: Arabic context tracking', [['AL', 'ES', 'ON', 'AL', 'ON', 'CS', 'AN', 'EN', 'AL', 'NSM', 'ES'], 'R'], ['R', 'ON', 'ON', 'R', 'ON', 'ON', 'AN', 'AN', 'R', 'R', 'ON']), ('regression: Arabic context tracking', [['CS', 'ES', 'ES', 'AL', 'EN', 'NSM', 'AN'], 'L'], ['ON', 'ON', 'ON', 'R', 'AN', 'AN', 'AN']), ('partial-repair probe', [['NSM', 'AL', 'ON', 'ON', 'ES', 'R', 'ES', 'EN', 'PDI', 'AN'], 'R'], ['R', 'R', 'ON', 'ON', 'ON', 'R', 'ON', 'EN', 'PDI', 'AN']), ('partial-repair probe', [['AN', 'CS', 'AL', 'R', 'AN', 'CS', 'ON', 'EN'], 'L'], ['AN', 'ON', 'R', 'R', 'AN', 'ON', 'ON', 'EN']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('control layout', [['ET', 'CS', 'R', 'L', 'CS', 'PDI', 'AL', 'R', 'LRI', 'AL', 'CS'], 'R'], ['ON', 'ON', 'R', 'L', 'ON', 'PDI', 'R', 'R', 'LRI', 'R', 'ON']), ('control layout', [['AN', 'ET', 'AL'], 'L'], ['AN', 'ON', 'R'])]]
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:
Numbers after Arabic letters stay European.

Input [classes of one isolating run sequence, sos]. W1 NSM takes the previous type (sos at start; ON after LRI/RLI/FSI/PDI). W2 EN after the last strong AL becomes AN. W3 AL->R. W4 a single ES between EN and EN -> EN; a single CS between two numbers of the same type takes that type. W5 a run of ET adjacent to EN -> EN. W6 remaining ES/ET/CS -> ON. W7 EN whose last strong (sos at start) is L -> L. Return resolved classes.

split: open-access


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

N = 1
observations = []
def solve(x):
    types, sos = x
    t = list(types)
    n = len(t)
    prev = sos
    for i in range(n):
        if t[i] == 'NSM':
            t[i] = 'ON' if prev in ('LRI', 'RLI', 'FSI', 'PDI') else prev
        prev = t[i]
    last_strong = sos
    for i in range(n):
        if t[i] in ('L', 'R', 'AL'):
            last_strong = t[i]
        elif t[i] == 'EN' and last_strong == 'AL':
            t[i] = 'AN'
    t = ['R' if c == 'AL' else c for c in t]
    for i in range(1, n - 1):
        if t[i] == 'ES' and t[i - 1] == t[i + 1] and t[i - 1] in ('EN', 'AN'):
            t[i] = 'EN'
        elif t[i] == 'CS' and t[i - 1] == t[i + 1] and t[i - 1] in ('EN', 'AN'):
            t[i] = t[i - 1]
    i = 0
    while i < n:
        if t[i] == 'ET':
            j = i
            while j < n and t[j] == 'ET':
                j += 1
            if (i > 0 and t[i - 1] == 'EN') or (j < n and t[j] == 'EN'):
                for k in range(i, j):
                    t[k] = 'EN'
            i = j
        else:
            i += 1
    t = ['ON' if c in ('ES', 'ET', 'CS') else c for c in t]
    strong = sos
    for i in range(n):
        if t[i] in ('L', 'R'):
            strong = t[i]
        elif t[i] == 'EN' and strong == 'L':
            t[i] = 'L'
    return t
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: plus sign between numbers', [['L', 'CS', 'AL', 'NSM', 'ET', 'CS', 'AN', 'ES', 'EN'], 'R'], ['L', 'ON', 'R', 'R', 'ON', 'ON', 'AN', 'ON', 'AN']), ('regression: plus sign between numbers', [['ES', 'EN', 'ES', 'WS', 'LRI', 'EN', 'EN', 'LRI', 'AN', 'ES', 'AN'], 'L'], ['ON', 'L', 'ON', 'WS', 'LRI', 'L', 'L', 'LRI', 'AN', 'ON', 'AN']), ('partial-repair probe', [['ES', 'WS', 'CS', 'EN', 'ES', 'CS'], 'R'], ['ON', 'WS', 'ON', 'EN', 'ON', 'ON']), ('partial-repair probe', [['EN', 'ES', 'AL', 'ET', 'ET', 'ON', 'L', 'EN', 'LRI', 'PDI'], 'L'], ['L', 'ON', 'R', 'ON', 'ON', 'ON', 'L', 'L', 'LRI', 'PDI']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['WS', 'ES'], 'L'], ['WS', 'ON']), ('control layout', [['AN', 'L', 'ES', 'WS', 'AN', 'AL', 'LRI', 'AL', 'NSM', 'ES'], 'L'], ['AN', 'L', 'ON', 'WS', 'AN', 'R', 'LRI', 'R', 'R', 'ON'])], [('regression: plus sign between numbers', [['ES', 'EN', 'ES', 'WS', 'LRI', 'EN', 'EN', 'LRI', 'AN', 'ES', 'AN'], 'L'], ['ON', 'L', 'ON', 'WS', 'LRI', 'L', 'L', 'LRI', 'AN', 'ON', 'AN']), ('regression: plus sign between numbers', [['L', 'CS', 'AL', 'NSM', 'ET', 'CS', 'AN', 'ES', 'EN'], 'R'], ['L', 'ON', 'R', 'R', 'ON', 'ON', 'AN', 'ON', 'AN']), ('partial-repair probe', [['AN', 'L', 'EN', 'ES', 'L'], 'R'], ['AN', 'L', 'L', 'ON', 'L']), ('partial-repair probe', [['ES', 'EN', 'ES', 'AN', 'AL', 'CS', 'ET', 'R', 'AN'], 'R'], ['ON', 'EN', 'ON', 'AN', 'R', 'ON', 'ON', 'R', 'AN']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('control layout', [['AL', 'EN', 'ET', 'L', 'EN', 'CS'], 'L'], ['R', 'AN', 'ON', 'L', 'L', 'ON']), ('control layout', [['NSM', 'R', 'L', 'AL', 'AL'], 'R'], ['R', 'R', 'L', 'R', 'R'])], [('regression: plus sign between numbers', [['L', 'CS', 'AL', 'NSM', 'ET', 'CS', 'AN', 'ES', 'EN'], 'R'], ['L', 'ON', 'R', 'R', 'ON', 'ON', 'AN', 'ON', 'AN']), ('regression: plus sign between numbers', [['ES', 'EN', 'ES', 'WS', 'LRI', 'EN', 'EN', 'LRI', 'AN', 'ES', 'AN'], 'L'], ['ON', 'L', 'ON', 'WS', 'LRI', 'L', 'L', 'LRI', 'AN', 'ON', 'AN']), ('partial-repair probe', [['ET', 'R', 'EN', 'NSM', 'ES', 'AL', 'CS', 'NSM', 'AL'], 'R'], ['ON', 'R', 'EN', 'EN', 'ON', 'R', 'ON', 'ON', 'R']), ('partial-repair probe', [['PDI', 'EN', 'EN', 'NSM', 'ES', 'ET', 'EN'], 'R'], ['PDI', 'EN', 'EN', 'EN', 'ON', 'EN', 'EN']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['EN', 'EN', 'NSM'], 'R'], ['EN', 'EN', 'EN']), ('control layout', [['AL', 'ON', 'NSM'], 'R'], ['R', 'ON', 'ON'])], [('regression: plus sign between numbers', [['L', 'CS', 'AL', 'NSM', 'ET', 'CS', 'AN', 'ES', 'EN'], 'R'], ['L', 'ON', 'R', 'R', 'ON', 'ON', 'AN', 'ON', 'AN']), ('regression: plus sign between numbers', [['ES', 'EN', 'ES', 'WS', 'LRI', 'EN', 'EN', 'LRI', 'AN', 'ES', 'AN'], 'L'], ['ON', 'L', 'ON', 'WS', 'LRI', 'L', 'L', 'LRI', 'AN', 'ON', 'AN']), ('partial-repair probe', [['EN', 'ES', 'CS'], 'L'], ['L', 'ON', 'ON']), ('partial-repair probe', [['PDI', 'EN', 'EN', 'NSM', 'ES', 'ET', 'EN'], 'R'], ['PDI', 'EN', 'EN', 'EN', 'ON', 'EN', 'EN']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('control layout', [['ET', 'CS', 'ES', 'WS', 'AN', 'CS', 'ES', 'L'], 'L'], ['ON', 'ON', 'ON', 'WS', 'AN', 'ON', 'ON', 'L']), ('control layout', [['EN', 'ET', 'L', 'ES', 'AL', 'AL', 'ES', 'PDI'], 'R'], ['EN', 'EN', 'L', 'ON', 'R', 'R', 'ON', 'PDI'])], [('regression: plus sign between numbers', [['L', 'CS', 'AL', 'NSM', 'ET', 'CS', 'AN', 'ES', 'EN'], 'R'], ['L', 'ON', 'R', 'R', 'ON', 'ON', 'AN', 'ON', 'AN']), ('regression: plus sign between numbers', [['ES', 'EN', 'ES', 'WS', 'LRI', 'EN', 'EN', 'LRI', 'AN', 'ES', 'AN'], 'L'], ['ON', 'L', 'ON', 'WS', 'LRI', 'L', 'L', 'LRI', 'AN', 'ON', 'AN']), ('partial-repair probe', [['ET', 'R', 'EN', 'NSM', 'ES', 'AL', 'CS', 'NSM', 'AL'], 'R'], ['ON', 'R', 'EN', 'EN', 'ON', 'R', 'ON', 'ON', 'R']), ('partial-repair probe', [['AL', 'CS', 'EN', 'EN', 'ES', 'L', 'EN', 'ES', 'L', 'ES'], 'R'], ['R', 'ON', 'AN', 'AN', 'ON', 'L', 'L', 'ON', 'L', 'ON']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('control layout', [['AN', 'L', 'EN'], 'R'], ['AN', 'L', 'L']), ('control layout', [['AL', 'AN', 'L', 'LRI', 'ET', 'EN', 'AL', 'L', 'NSM', 'PDI', 'EN'], 'L'], ['R', 'AN', 'L', 'LRI', 'L', 'L', 'R', 'L', 'L', 'PDI', 'L'])]]
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):
    types, sos = x
    t = list(types)
    n = len(t)
    prev = sos
    for i in range(n):
        if t[i] == 'NSM':
            t[i] = 'ON' if prev in ('LRI', 'RLI', 'FSI', 'PDI') else prev
        prev = t[i]
    last_strong = sos
    for i in range(n):
        if t[i] in ('L', 'R', 'AL'):
            last_strong = t[i]
        elif t[i] == 'EN' and last_strong == 'AL':
            t[i] = 'AN'
    t = ['R' if c == 'AL' else c for c in t]
    for i in range(1, n - 1):
        if t[i] == 'ES' and t[i - 1] == 'EN':
            t[i] = 'EN'
        elif t[i] == 'CS' and t[i - 1] == t[i + 1] and t[i - 1] in ('EN', 'AN'):
            t[i] = t[i - 1]
    i = 0
    while i < n:
        if t[i] == 'ET':
            j = i
            while j < n and t[j] == 'ET':
                j += 1
            if (i > 0 and t[i - 1] == 'EN') or (j < n and t[j] == 'EN'):
                for k in range(i, j):
                    t[k] = 'EN'
            i = j
        else:
            i += 1
    t = ['ON' if c in ('ES', 'ET', 'CS') else c for c in t]
    strong = sos
    for i in range(n):
        if t[i] in ('L', 'R'):
            strong = t[i]
        elif t[i] == 'EN' and strong == 'L':
            t[i] = 'L'
    return t
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: plus sign between numbers', [['L', 'CS', 'AL', 'NSM', 'ET', 'CS', 'AN', 'ES', 'EN'], 'R'], ['L', 'ON', 'R', 'R', 'ON', 'ON', 'AN', 'ON', 'AN']), ('regression: plus sign between numbers', [['ES', 'EN', 'ES', 'WS', 'LRI', 'EN', 'EN', 'LRI', 'AN', 'ES', 'AN'], 'L'], ['ON', 'L', 'ON', 'WS', 'LRI', 'L', 'L', 'LRI', 'AN', 'ON', 'AN']), ('partial-repair probe', [['ES', 'WS', 'CS', 'EN', 'ES', 'CS'], 'R'], ['ON', 'WS', 'ON', 'EN', 'ON', 'ON']), ('partial-repair probe', [['EN', 'ES', 'AL', 'ET', 'ET', 'ON', 'L', 'EN', 'LRI', 'PDI'], 'L'], ['L', 'ON', 'R', 'ON', 'ON', 'ON', 'L', 'L', 'LRI', 'PDI']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['WS', 'ES'], 'L'], ['WS', 'ON']), ('control layout', [['AN', 'L', 'ES', 'WS', 'AN', 'AL', 'LRI', 'AL', 'NSM', 'ES'], 'L'], ['AN', 'L', 'ON', 'WS', 'AN', 'R', 'LRI', 'R', 'R', 'ON'])], [('regression: plus sign between numbers', [['ES', 'EN', 'ES', 'WS', 'LRI', 'EN', 'EN', 'LRI', 'AN', 'ES', 'AN'], 'L'], ['ON', 'L', 'ON', 'WS', 'LRI', 'L', 'L', 'LRI', 'AN', 'ON', 'AN']), ('regression: plus sign between numbers', [['L', 'CS', 'AL', 'NSM', 'ET', 'CS', 'AN', 'ES', 'EN'], 'R'], ['L', 'ON', 'R', 'R', 'ON', 'ON', 'AN', 'ON', 'AN']), ('partial-repair probe', [['AN', 'L', 'EN', 'ES', 'L'], 'R'], ['AN', 'L', 'L', 'ON', 'L']), ('partial-repair probe', [['ES', 'EN', 'ES', 'AN', 'AL', 'CS', 'ET', 'R', 'AN'], 'R'], ['ON', 'EN', 'ON', 'AN', 'R', 'ON', 'ON', 'R', 'AN']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('control layout', [['AL', 'EN', 'ET', 'L', 'EN', 'CS'], 'L'], ['R', 'AN', 'ON', 'L', 'L', 'ON']), ('control layout', [['NSM', 'R', 'L', 'AL', 'AL'], 'R'], ['R', 'R', 'L', 'R', 'R'])], [('regression: plus sign between numbers', [['L', 'CS', 'AL', 'NSM', 'ET', 'CS', 'AN', 'ES', 'EN'], 'R'], ['L', 'ON', 'R', 'R', 'ON', 'ON', 'AN', 'ON', 'AN']), ('regression: plus sign between numbers', [['ES', 'EN', 'ES', 'WS', 'LRI', 'EN', 'EN', 'LRI', 'AN', 'ES', 'AN'], 'L'], ['ON', 'L', 'ON', 'WS', 'LRI', 'L', 'L', 'LRI', 'AN', 'ON', 'AN']), ('partial-repair probe', [['ET', 'R', 'EN', 'NSM', 'ES', 'AL', 'CS', 'NSM', 'AL'], 'R'], ['ON', 'R', 'EN', 'EN', 'ON', 'R', 'ON', 'ON', 'R']), ('partial-repair probe', [['PDI', 'EN', 'EN', 'NSM', 'ES', 'ET', 'EN'], 'R'], ['PDI', 'EN', 'EN', 'EN', 'ON', 'EN', 'EN']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['EN', 'EN', 'NSM'], 'R'], ['EN', 'EN', 'EN']), ('control layout', [['AL', 'ON', 'NSM'], 'R'], ['R', 'ON', 'ON'])], [('regression: plus sign between numbers', [['L', 'CS', 'AL', 'NSM', 'ET', 'CS', 'AN', 'ES', 'EN'], 'R'], ['L', 'ON', 'R', 'R', 'ON', 'ON', 'AN', 'ON', 'AN']), ('regression: plus sign between numbers', [['ES', 'EN', 'ES', 'WS', 'LRI', 'EN', 'EN', 'LRI', 'AN', 'ES', 'AN'], 'L'], ['ON', 'L', 'ON', 'WS', 'LRI', 'L', 'L', 'LRI', 'AN', 'ON', 'AN']), ('partial-repair probe', [['EN', 'ES', 'CS'], 'L'], ['L', 'ON', 'ON']), ('partial-repair probe', [['PDI', 'EN', 'EN', 'NSM', 'ES', 'ET', 'EN'], 'R'], ['PDI', 'EN', 'EN', 'EN', 'ON', 'EN', 'EN']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('control layout', [['ET', 'CS', 'ES', 'WS', 'AN', 'CS', 'ES', 'L'], 'L'], ['ON', 'ON', 'ON', 'WS', 'AN', 'ON', 'ON', 'L']), ('control layout', [['EN', 'ET', 'L', 'ES', 'AL', 'AL', 'ES', 'PDI'], 'R'], ['EN', 'EN', 'L', 'ON', 'R', 'R', 'ON', 'PDI'])], [('regression: plus sign between numbers', [['L', 'CS', 'AL', 'NSM', 'ET', 'CS', 'AN', 'ES', 'EN'], 'R'], ['L', 'ON', 'R', 'R', 'ON', 'ON', 'AN', 'ON', 'AN']), ('regression: plus sign between numbers', [['ES', 'EN', 'ES', 'WS', 'LRI', 'EN', 'EN', 'LRI', 'AN', 'ES', 'AN'], 'L'], ['ON', 'L', 'ON', 'WS', 'LRI', 'L', 'L', 'LRI', 'AN', 'ON', 'AN']), ('partial-repair probe', [['ET', 'R', 'EN', 'NSM', 'ES', 'AL', 'CS', 'NSM', 'AL'], 'R'], ['ON', 'R', 'EN', 'EN', 'ON', 'R', 'ON', 'ON', 'R']), ('partial-repair probe', [['AL', 'CS', 'EN', 'EN', 'ES', 'L', 'EN', 'ES', 'L', 'ES'], 'R'], ['R', 'ON', 'AN', 'AN', 'ON', 'L', 'L', 'ON', 'L', 'ON']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('control layout', [['AN', 'L', 'EN'], 'R'], ['AN', 'L', 'L']), ('control layout', [['AL', 'AN', 'L', 'LRI', 'ET', 'EN', 'AL', 'L', 'NSM', 'PDI', 'EN'], 'L'], ['R', 'AN', 'L', 'LRI', 'L', 'L', 'R', 'L', 'L', 'PDI', 'L'])]]
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:
A plus between Arabic numbers joins them, or European pairs split.

Input [classes of one isolating run sequence, sos]. W1 NSM takes the previous type (sos at start; ON after LRI/RLI/FSI/PDI). W2 EN after the last strong AL becomes AN. W3 AL->R. W4 a single ES between EN and EN -> EN; a single CS between two numbers of the same type takes that type. W5 a run of ET adjacent to EN -> EN. W6 remaining ES/ET/CS -> ON. W7 EN whose last strong (sos at start) is L -> L. Return resolved classes.

split: open-access


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

N = 1
observations = []
def solve(x):
    types, sos = x
    t = list(types)
    n = len(t)
    prev = sos
    for i in range(n):
        if t[i] == 'NSM':
            t[i] = 'ON' if prev in ('LRI', 'RLI', 'FSI', 'PDI') else prev
        prev = t[i]
    last_strong = sos
    for i in range(n):
        if t[i] in ('L', 'R', 'AL'):
            last_strong = t[i]
        elif t[i] == 'EN' and last_strong == 'AL':
            t[i] = 'AN'
    t = ['R' if c == 'AL' else c for c in t]
    for i in range(1, n - 1):
        if t[i] == 'ES' and t[i - 1] == 'EN' and t[i + 1] == 'EN':
            t[i] = 'EN'
        elif t[i] == 'CS' and t[i - 1] in ('EN', 'AN') and t[i + 1] in ('EN', 'AN'):
            t[i] = t[i - 1]
    i = 0
    while i < n:
        if t[i] == 'ET':
            j = i
            while j < n and t[j] == 'ET':
                j += 1
            if (i > 0 and t[i - 1] == 'EN') or (j < n and t[j] == 'EN'):
                for k in range(i, j):
                    t[k] = 'EN'
            i = j
        else:
            i += 1
    t = ['ON' if c in ('ES', 'ET', 'CS') else c for c in t]
    strong = sos
    for i in range(n):
        if t[i] in ('L', 'R'):
            strong = t[i]
        elif t[i] == 'EN' and strong == 'L':
            t[i] = 'L'
    return t
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: common separator number types', [['AL', 'EN', 'NSM', 'R', 'NSM', 'EN', 'CS', 'AN', 'EN'], 'L'], ['R', 'AN', 'AN', 'R', 'R', 'EN', 'ON', 'AN', 'EN']), ('regression: common separator number types', [['L', 'ET', 'AN', 'CS', 'EN', 'AL', 'NSM', 'AN', 'L', 'AN', 'PDI'], 'R'], ['L', 'ON', 'AN', 'ON', 'L', 'R', 'R', 'AN', 'L', 'AN', 'PDI']), ('partial-repair probe', [['AN', 'CS', 'AN', 'AL', 'EN', 'PDI', 'R', 'AL', 'ET'], 'R'], ['AN', 'AN', 'AN', 'R', 'AN', 'PDI', 'R', 'R', 'ON']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['L', 'AN', 'L', 'PDI', 'ET', 'AL', 'NSM'], 'L'], ['L', 'AN', 'L', 'PDI', 'ON', 'R', 'R']), ('control layout', [['AL', 'WS', 'AL', 'L'], 'L'], ['R', 'WS', 'R', 'L'])], [('regression: common separator number types', [['ES', 'EN', 'CS', 'AN', 'ON', 'LRI'], 'L'], ['ON', 'L', 'ON', 'AN', 'ON', 'LRI']), ('regression: common separator number types', [['L', 'ET', 'AN', 'CS', 'EN', 'AL', 'NSM', 'AN', 'L', 'AN', 'PDI'], 'R'], ['L', 'ON', 'AN', 'ON', 'L', 'R', 'R', 'AN', 'L', 'AN', 'PDI']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('partial-repair probe', [['L', 'AL', 'PDI', 'LRI', 'AL', 'EN', 'CS', 'EN', 'WS', 'CS'], 'R'], ['L', 'R', 'PDI', 'LRI', 'R', 'AN', 'AN', 'AN', 'WS', 'ON']), ('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('control layout', [['AL', 'ET', 'L', 'L', 'ET', 'CS', 'NSM', 'ET', 'ON', 'L'], 'R'], ['R', 'ON', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L']), ('control layout', [['L', 'L', 'AN', 'EN'], 'L'], ['L', 'L', 'AN', 'L'])], [('regression: common separator number types', [['ES', 'EN', 'CS', 'AN', 'L', 'ON', 'AL'], 'L'], ['ON', 'L', 'ON', 'AN', 'L', 'ON', 'R']), ('regression: common separator number types', [['AL', 'EN', 'NSM', 'R', 'NSM', 'EN', 'CS', 'AN', 'EN'], 'L'], ['R', 'AN', 'AN', 'R', 'R', 'EN', 'ON', 'AN', 'EN']), ('partial-repair probe', [['EN', 'EN', 'AL', 'EN', 'CS', 'EN', 'PDI', 'ON', 'AN'], 'R'], ['EN', 'EN', 'R', 'AN', 'AN', 'AN', 'PDI', 'ON', 'AN']), ('partial-repair probe', [['L', 'AL', 'PDI', 'LRI', 'AL', 'EN', 'CS', 'EN', 'WS', 'CS'], 'R'], ['L', 'R', 'PDI', 'LRI', 'R', 'AN', 'AN', 'AN', 'WS', 'ON']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['R', 'PDI', 'L', 'L', 'NSM', 'AL', 'EN', 'AN'], 'R'], ['R', 'PDI', 'L', 'L', 'L', 'R', 'AN', 'AN']), ('control layout', [['AL', 'NSM', 'CS', 'CS', 'AL'], 'L'], ['R', 'R', 'ON', 'ON', 'R'])], [('regression: common separator number types', [['AN', 'AN', 'CS', 'EN', 'ON', 'EN', 'EN'], 'R'], ['AN', 'AN', 'ON', 'EN', 'ON', 'EN', 'EN']), ('regression: common separator number types', [['L', 'ET', 'AN', 'CS', 'EN', 'AL', 'NSM', 'AN', 'L', 'AN', 'PDI'], 'R'], ['L', 'ON', 'AN', 'ON', 'L', 'R', 'R', 'AN', 'L', 'AN', 'PDI']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('partial-repair probe', [['AN', 'CS', 'AN', 'AL', 'EN', 'PDI', 'R', 'AL', 'ET'], 'R'], ['AN', 'AN', 'AN', 'R', 'AN', 'PDI', 'R', 'R', 'ON']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('control layout', [['ES', 'EN', 'ET', 'ON', 'WS', 'ET', 'AL', 'NSM', 'PDI', 'AL'], 'L'], ['ON', 'L', 'L', 'ON', 'WS', 'ON', 'R', 'R', 'PDI', 'R']), ('control layout', [['ET', 'AL', 'ES', 'NSM', 'ES', 'EN', 'PDI', 'WS', 'AN', 'CS'], 'R'], ['ON', 'R', 'ON', 'ON', 'ON', 'AN', 'PDI', 'WS', 'AN', 'ON'])], [('regression: common separator number types', [['ES', 'EN', 'CS', 'AN', 'L', 'ON', 'AL'], 'L'], ['ON', 'L', 'ON', 'AN', 'L', 'ON', 'R']), ('regression: common separator number types', [['R', 'L', 'AN', 'CS', 'EN', 'CS', 'NSM', 'ES', 'AL'], 'L'], ['R', 'L', 'AN', 'ON', 'L', 'ON', 'ON', 'ON', 'R']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('partial-repair probe', [['AN', 'CS', 'AN', 'AL', 'EN', 'PDI', 'R', 'AL', 'ET'], 'R'], ['AN', 'AN', 'AN', 'R', 'AN', 'PDI', 'R', 'R', 'ON']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['L', 'LRI', 'EN'], 'L'], ['L', 'LRI', 'L']), ('control layout', [['AL', 'PDI', 'ES', 'EN', 'L', 'R', 'WS', 'ES', 'CS', 'CS'], 'L'], ['R', 'PDI', 'ON', 'AN', 'L', 'R', 'WS', 'ON', 'ON', 'ON'])]]
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):
    types, sos = x
    t = list(types)
    n = len(t)
    prev = sos
    for i in range(n):
        if t[i] == 'NSM':
            t[i] = 'ON' if prev in ('LRI', 'RLI', 'FSI', 'PDI') else prev
        prev = t[i]
    last_strong = sos
    for i in range(n):
        if t[i] in ('L', 'R', 'AL'):
            last_strong = t[i]
        elif t[i] == 'EN' and last_strong == 'AL':
            t[i] = 'AN'
    t = ['R' if c == 'AL' else c for c in t]
    for i in range(1, n - 1):
        if t[i] == 'ES' and t[i - 1] == 'EN' and t[i + 1] == 'EN':
            t[i] = 'EN'
        elif t[i] == 'CS' and t[i - 1] == t[i + 1] == 'EN':
            t[i] = t[i - 1]
    i = 0
    while i < n:
        if t[i] == 'ET':
            j = i
            while j < n and t[j] == 'ET':
                j += 1
            if (i > 0 and t[i - 1] == 'EN') or (j < n and t[j] == 'EN'):
                for k in range(i, j):
                    t[k] = 'EN'
            i = j
        else:
            i += 1
    t = ['ON' if c in ('ES', 'ET', 'CS') else c for c in t]
    strong = sos
    for i in range(n):
        if t[i] in ('L', 'R'):
            strong = t[i]
        elif t[i] == 'EN' and strong == 'L':
            t[i] = 'L'
    return t
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: common separator number types', [['AL', 'EN', 'NSM', 'R', 'NSM', 'EN', 'CS', 'AN', 'EN'], 'L'], ['R', 'AN', 'AN', 'R', 'R', 'EN', 'ON', 'AN', 'EN']), ('regression: common separator number types', [['L', 'ET', 'AN', 'CS', 'EN', 'AL', 'NSM', 'AN', 'L', 'AN', 'PDI'], 'R'], ['L', 'ON', 'AN', 'ON', 'L', 'R', 'R', 'AN', 'L', 'AN', 'PDI']), ('partial-repair probe', [['AN', 'CS', 'AN', 'AL', 'EN', 'PDI', 'R', 'AL', 'ET'], 'R'], ['AN', 'AN', 'AN', 'R', 'AN', 'PDI', 'R', 'R', 'ON']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['L', 'AN', 'L', 'PDI', 'ET', 'AL', 'NSM'], 'L'], ['L', 'AN', 'L', 'PDI', 'ON', 'R', 'R']), ('control layout', [['AL', 'WS', 'AL', 'L'], 'L'], ['R', 'WS', 'R', 'L'])], [('regression: common separator number types', [['ES', 'EN', 'CS', 'AN', 'ON', 'LRI'], 'L'], ['ON', 'L', 'ON', 'AN', 'ON', 'LRI']), ('regression: common separator number types', [['L', 'ET', 'AN', 'CS', 'EN', 'AL', 'NSM', 'AN', 'L', 'AN', 'PDI'], 'R'], ['L', 'ON', 'AN', 'ON', 'L', 'R', 'R', 'AN', 'L', 'AN', 'PDI']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('partial-repair probe', [['L', 'AL', 'PDI', 'LRI', 'AL', 'EN', 'CS', 'EN', 'WS', 'CS'], 'R'], ['L', 'R', 'PDI', 'LRI', 'R', 'AN', 'AN', 'AN', 'WS', 'ON']), ('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('control layout', [['AL', 'ET', 'L', 'L', 'ET', 'CS', 'NSM', 'ET', 'ON', 'L'], 'R'], ['R', 'ON', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L']), ('control layout', [['L', 'L', 'AN', 'EN'], 'L'], ['L', 'L', 'AN', 'L'])], [('regression: common separator number types', [['ES', 'EN', 'CS', 'AN', 'L', 'ON', 'AL'], 'L'], ['ON', 'L', 'ON', 'AN', 'L', 'ON', 'R']), ('regression: common separator number types', [['AL', 'EN', 'NSM', 'R', 'NSM', 'EN', 'CS', 'AN', 'EN'], 'L'], ['R', 'AN', 'AN', 'R', 'R', 'EN', 'ON', 'AN', 'EN']), ('partial-repair probe', [['EN', 'EN', 'AL', 'EN', 'CS', 'EN', 'PDI', 'ON', 'AN'], 'R'], ['EN', 'EN', 'R', 'AN', 'AN', 'AN', 'PDI', 'ON', 'AN']), ('partial-repair probe', [['L', 'AL', 'PDI', 'LRI', 'AL', 'EN', 'CS', 'EN', 'WS', 'CS'], 'R'], ['L', 'R', 'PDI', 'LRI', 'R', 'AN', 'AN', 'AN', 'WS', 'ON']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['R', 'PDI', 'L', 'L', 'NSM', 'AL', 'EN', 'AN'], 'R'], ['R', 'PDI', 'L', 'L', 'L', 'R', 'AN', 'AN']), ('control layout', [['AL', 'NSM', 'CS', 'CS', 'AL'], 'L'], ['R', 'R', 'ON', 'ON', 'R'])], [('regression: common separator number types', [['AN', 'AN', 'CS', 'EN', 'ON', 'EN', 'EN'], 'R'], ['AN', 'AN', 'ON', 'EN', 'ON', 'EN', 'EN']), ('regression: common separator number types', [['L', 'ET', 'AN', 'CS', 'EN', 'AL', 'NSM', 'AN', 'L', 'AN', 'PDI'], 'R'], ['L', 'ON', 'AN', 'ON', 'L', 'R', 'R', 'AN', 'L', 'AN', 'PDI']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('partial-repair probe', [['AN', 'CS', 'AN', 'AL', 'EN', 'PDI', 'R', 'AL', 'ET'], 'R'], ['AN', 'AN', 'AN', 'R', 'AN', 'PDI', 'R', 'R', 'ON']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('control layout', [['ES', 'EN', 'ET', 'ON', 'WS', 'ET', 'AL', 'NSM', 'PDI', 'AL'], 'L'], ['ON', 'L', 'L', 'ON', 'WS', 'ON', 'R', 'R', 'PDI', 'R']), ('control layout', [['ET', 'AL', 'ES', 'NSM', 'ES', 'EN', 'PDI', 'WS', 'AN', 'CS'], 'R'], ['ON', 'R', 'ON', 'ON', 'ON', 'AN', 'PDI', 'WS', 'AN', 'ON'])], [('regression: common separator number types', [['ES', 'EN', 'CS', 'AN', 'L', 'ON', 'AL'], 'L'], ['ON', 'L', 'ON', 'AN', 'L', 'ON', 'R']), ('regression: common separator number types', [['R', 'L', 'AN', 'CS', 'EN', 'CS', 'NSM', 'ES', 'AL'], 'L'], ['R', 'L', 'AN', 'ON', 'L', 'ON', 'ON', 'ON', 'R']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('partial-repair probe', [['AN', 'CS', 'AN', 'AL', 'EN', 'PDI', 'R', 'AL', 'ET'], 'R'], ['AN', 'AN', 'AN', 'R', 'AN', 'PDI', 'R', 'R', 'ON']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['L', 'LRI', 'EN'], 'L'], ['L', 'LRI', 'L']), ('control layout', [['AL', 'PDI', 'ES', 'EN', 'L', 'R', 'WS', 'ES', 'CS', 'CS'], 'L'], ['R', 'PDI', 'ON', 'AN', 'L', 'R', 'WS', 'ON', 'ON', 'ON'])]]
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:
A comma between a European and an Arabic number is absorbed.

Input [classes of one isolating run sequence, sos]. W1 NSM takes the previous type (sos at start; ON after LRI/RLI/FSI/PDI). W2 EN after the last strong AL becomes AN. W3 AL->R. W4 a single ES between EN and EN -> EN; a single CS between two numbers of the same type takes that type. W5 a run of ET adjacent to EN -> EN. W6 remaining ES/ET/CS -> ON. W7 EN whose last strong (sos at start) is L -> L. Return resolved classes.

split: open-access