FAILURE MAP
← Case archive

FA-70791 / GIS polygon topology / Open access

Dissolve grouping by attribute and shared edges: exact key comparison · case 01

Numeric 1 and text "1" zones are merged.

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

ROOT CAUSE

Keys are compared by their string form, so values of different types merge.

VERIFIED REPAIR

At the exact key comparison step restore `and keys[i] == keys[j]`, leaving the rest of the model unchanged.

Unsuccessful approach: Stripping whitespace still compares string forms of mixed-type keys.

Case contract

Input [polygons, keys]: closed rings on a noded coverage and one attribute value per polygon. Polygons are merged when their keys are exactly equal (type-sensitive, None never merges) and they share at least one edge, transitively. Return the groups as ascending index lists, the list of groups sorted by first index.

Why this case matters

Dissolving parcels into zoning or ownership blocks is a core GIS operation; grouping errors merge blocks that only touch at a corner or split contiguous ones.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    polys, keys = x
    def edges(r):
        return {tuple(sorted([tuple(a), tuple(b)])) for a, b in zip(r, r[1:]) if a != b}
    E = [edges(p) for p in polys]
    parent = list(range(len(polys)))
    def find(a):
        while parent[a] != a:
            a = parent[a]
        return a
    for i in range(len(polys)):
        for j in range(i + 1, len(polys)):
            if keys[i] is not None and str(keys[i]) == str(keys[j]) and E[i] & E[j]:
                parent[find(i)] = find(j)
    groups = {}
    for i in range(len(polys)):
        groups.setdefault(find(i), []).append(i)
    return sorted(groups.values())
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('control #0', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'a', 'b', 'a', 'b', 'b', 'c', 'c', 'c']], [[0, 1, 3], [2, 4, 5], [6, 7, 8]]), ('regression #1', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a']], [[0], [1], [2], [3], [4], [5], [6], [7], [8]]), ('regression #2', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'a', 'a', 'b', 'b', 'a', 'a', 'a', 'a']], [[0, 1, 2, 5, 6, 7, 8], [3, 4]]), ('regression #3', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [None, None, 'x', 'x', None, 'x', None, None, 'x']], [[0], [1], [2, 5, 8], [3], [4], [6], [7]]), ('regression #4', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [1, '1', 1, 2, 2, '2', 1, 1, 1]], [[0], [1], [2], [3, 4], [5], [6, 7, 8]]), ('regression #5', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['', '', 'k', 'k', '', 'k', 'k', 'k', 'k']], [[0, 1, 4], [2, 3, 5, 6, 7, 8]]), ('control #6', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z']], [[0, 1, 2, 3, 4, 5, 6, 7, 8]]), ('control #7', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']], [[0], [1], [2], [3], [4], [5], [6], [7], [8]])], [('regression #3', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [None, None, 'x', 'x', None, 'x', None, None, 'x']], [[0], [1], [2, 5, 8], [3], [4], [6], [7]]), ('regression #4', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [1, '1', 1, 2, 2, '2', 1, 1, 1]], [[0], [1], [2], [3, 4], [5], [6, 7, 8]]), ('regression #5', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['', '', 'k', 'k', '', 'k', 'k', 'k', 'k']], [[0, 1, 4], [2, 3, 5, 6, 7, 8]]), ('control #6', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z']], [[0, 1, 2, 3, 4, 5, 6, 7, 8]]), ('control #7', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']], [[0], [1], [2], [3], [4], [5], [6], [7], [8]]), ('regression #8', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']], [[0, 3, 6], [1, 4, 7], [2, 5, 8]]), ('regression #9', [[[[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]]], ['q', 'q', 'q', 'r']], [[0, 1, 2], [3]]), ('regression #10', [[[[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]]], ['m', 'm', 'm', 'm']], [[0, 1, 2], [3]])], [('regression #4', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [1, '1', 1, 2, 2, '2', 1, 1, 1]], [[0], [1], [2], [3, 4], [5], [6, 7, 8]]), ('control #7', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']], [[0], [1], [2], [3], [4], [5], [6], [7], [8]]), ('regression #8', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']], [[0, 3, 6], [1, 4, 7], [2, 5, 8]]), ('regression #9', [[[[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]]], ['q', 'q', 'q', 'r']], [[0, 1, 2], [3]]), ('regression #10', [[[[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]]], ['m', 'm', 'm', 'm']], [[0, 1, 2], [3]]), ('regression #11', [[[[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]]], ['s', 's', 't', 's', 's']], [[0, 1], [2], [3, 4]]), ('boundary #12', [[], []], []), ('regression #13', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['p', 'q', 'q', 'p', 'q', 'p', 'p', 'p', 'p']], [[0, 3, 5, 6, 7, 8], [1, 2, 4]])], [('control #0', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'a', 'b', 'a', 'b', 'b', 'c', 'c', 'c']], [[0, 1, 3], [2, 4, 5], [6, 7, 8]]), ('regression #1', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a']], [[0], [1], [2], [3], [4], [5], [6], [7], [8]]), ('regression #4', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [1, '1', 1, 2, 2, '2', 1, 1, 1]], [[0], [1], [2], [3, 4], [5], [6, 7, 8]]), ('regression #10', [[[[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]]], ['m', 'm', 'm', 'm']], [[0, 1, 2], [3]]), ('regression #11', [[[[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]]], ['s', 's', 't', 's', 's']], [[0, 1], [2], [3, 4]]), ('boundary #12', [[], []], []), ('regression #13', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['p', 'q', 'q', 'p', 'q', 'p', 'p', 'p', 'p']], [[0, 3, 5, 6, 7, 8], [1, 2, 4]]), ('regression #14', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]]], ['w', 'w', 'w', 'w']], [[0, 1, 3], [2]])], [('control #0', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'a', 'b', 'a', 'b', 'b', 'c', 'c', 'c']], [[0, 1, 3], [2, 4, 5], [6, 7, 8]]), ('regression #1', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a']], [[0], [1], [2], [3], [4], [5], [6], [7], [8]]), ('regression #2', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'a', 'a', 'b', 'b', 'a', 'a', 'a', 'a']], [[0, 1, 2, 5, 6, 7, 8], [3, 4]]), ('regression #3', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [None, None, 'x', 'x', None, 'x', None, None, 'x']], [[0], [1], [2, 5, 8], [3], [4], [6], [7]]), ('regression #4', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [1, '1', 1, 2, 2, '2', 1, 1, 1]], [[0], [1], [2], [3, 4], [5], [6, 7, 8]]), ('regression #5', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['', '', 'k', 'k', '', 'k', 'k', 'k', 'k']], [[0, 1, 4], [2, 3, 5, 6, 7, 8]]), ('regression #13', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['p', 'q', 'q', 'p', 'q', 'p', 'p', 'p', 'p']], [[0, 3, 5, 6, 7, 8], [1, 2, 4]]), ('regression #14', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]]], ['w', 'w', 'w', 'w']], [[0, 1, 3], [2]])]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
control #0[[0, 1, 3], [2, 4, 5], [6, 7, 8]][[0, 1, 3], [2, 4, 5], [6, 7, 8]]Passed
regression #1[[0], [1], [2], [3], [4], [5], [6], [7], [8]][[0], [1], [2], [3], [4], [5], [6], [7], [8]]Passed
regression #2[[0, 1, 2, 5, 6, 7, 8], [3, 4]][[0, 1, 2, 5, 6, 7, 8], [3, 4]]Passed
regression #3[[0], [1], [2, 5, 8], [3], [4], [6], [7]][[0], [1], [2, 5, 8], [3], [4], [6], [7]]Passed
regression #4[[0, 1, 2], [3, 4, 5], [6, 7, 8]][[0], [1], [2], [3, 4], [5], [6, 7, 8]]Failed
regression #5[[0, 1, 4], [2, 3, 5, 6, 7, 8]][[0, 1, 4], [2, 3, 5, 6, 7, 8]]Passed
control #6[[0, 1, 2, 3, 4, 5, 6, 7, 8]][[0, 1, 2, 3, 4, 5, 6, 7, 8]]Passed
control #7[[0], [1], [2], [3], [4], [5], [6], [7], [8]][[0], [1], [2], [3], [4], [5], [6], [7], [8]]Passed

SHA-256 / aab5d3c1d836430180c07cf2c741dea3b95217407102a9beec5cfa001578b24c

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    polys, keys = x
    def edges(r):
        return {tuple(sorted([tuple(a), tuple(b)])) for a, b in zip(r, r[1:]) if a != b}
    E = [edges(p) for p in polys]
    parent = list(range(len(polys)))
    def find(a):
        while parent[a] != a:
            a = parent[a]
        return a
    for i in range(len(polys)):
        for j in range(i + 1, len(polys)):
            if keys[i] is not None and str(keys[i]).strip() == str(keys[j]).strip() and E[i] & E[j]:
                parent[find(i)] = find(j)
    groups = {}
    for i in range(len(polys)):
        groups.setdefault(find(i), []).append(i)
    return sorted(groups.values())
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('control #0', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'a', 'b', 'a', 'b', 'b', 'c', 'c', 'c']], [[0, 1, 3], [2, 4, 5], [6, 7, 8]]), ('regression #1', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a']], [[0], [1], [2], [3], [4], [5], [6], [7], [8]]), ('regression #2', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'a', 'a', 'b', 'b', 'a', 'a', 'a', 'a']], [[0, 1, 2, 5, 6, 7, 8], [3, 4]]), ('regression #3', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [None, None, 'x', 'x', None, 'x', None, None, 'x']], [[0], [1], [2, 5, 8], [3], [4], [6], [7]]), ('regression #4', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [1, '1', 1, 2, 2, '2', 1, 1, 1]], [[0], [1], [2], [3, 4], [5], [6, 7, 8]]), ('regression #5', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['', '', 'k', 'k', '', 'k', 'k', 'k', 'k']], [[0, 1, 4], [2, 3, 5, 6, 7, 8]]), ('control #6', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z']], [[0, 1, 2, 3, 4, 5, 6, 7, 8]]), ('control #7', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']], [[0], [1], [2], [3], [4], [5], [6], [7], [8]])], [('regression #3', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [None, None, 'x', 'x', None, 'x', None, None, 'x']], [[0], [1], [2, 5, 8], [3], [4], [6], [7]]), ('regression #4', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [1, '1', 1, 2, 2, '2', 1, 1, 1]], [[0], [1], [2], [3, 4], [5], [6, 7, 8]]), ('regression #5', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['', '', 'k', 'k', '', 'k', 'k', 'k', 'k']], [[0, 1, 4], [2, 3, 5, 6, 7, 8]]), ('control #6', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z']], [[0, 1, 2, 3, 4, 5, 6, 7, 8]]), ('control #7', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']], [[0], [1], [2], [3], [4], [5], [6], [7], [8]]), ('regression #8', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']], [[0, 3, 6], [1, 4, 7], [2, 5, 8]]), ('regression #9', [[[[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]]], ['q', 'q', 'q', 'r']], [[0, 1, 2], [3]]), ('regression #10', [[[[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]]], ['m', 'm', 'm', 'm']], [[0, 1, 2], [3]])], [('regression #4', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [1, '1', 1, 2, 2, '2', 1, 1, 1]], [[0], [1], [2], [3, 4], [5], [6, 7, 8]]), ('control #7', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']], [[0], [1], [2], [3], [4], [5], [6], [7], [8]]), ('regression #8', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']], [[0, 3, 6], [1, 4, 7], [2, 5, 8]]), ('regression #9', [[[[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]]], ['q', 'q', 'q', 'r']], [[0, 1, 2], [3]]), ('regression #10', [[[[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]]], ['m', 'm', 'm', 'm']], [[0, 1, 2], [3]]), ('regression #11', [[[[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]]], ['s', 's', 't', 's', 's']], [[0, 1], [2], [3, 4]]), ('boundary #12', [[], []], []), ('regression #13', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['p', 'q', 'q', 'p', 'q', 'p', 'p', 'p', 'p']], [[0, 3, 5, 6, 7, 8], [1, 2, 4]])], [('control #0', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'a', 'b', 'a', 'b', 'b', 'c', 'c', 'c']], [[0, 1, 3], [2, 4, 5], [6, 7, 8]]), ('regression #1', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a']], [[0], [1], [2], [3], [4], [5], [6], [7], [8]]), ('regression #4', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [1, '1', 1, 2, 2, '2', 1, 1, 1]], [[0], [1], [2], [3, 4], [5], [6, 7, 8]]), ('regression #10', [[[[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]]], ['m', 'm', 'm', 'm']], [[0, 1, 2], [3]]), ('regression #11', [[[[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]]], ['s', 's', 't', 's', 's']], [[0, 1], [2], [3, 4]]), ('boundary #12', [[], []], []), ('regression #13', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['p', 'q', 'q', 'p', 'q', 'p', 'p', 'p', 'p']], [[0, 3, 5, 6, 7, 8], [1, 2, 4]]), ('regression #14', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]]], ['w', 'w', 'w', 'w']], [[0, 1, 3], [2]])], [('control #0', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'a', 'b', 'a', 'b', 'b', 'c', 'c', 'c']], [[0, 1, 3], [2, 4, 5], [6, 7, 8]]), ('regression #1', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a']], [[0], [1], [2], [3], [4], [5], [6], [7], [8]]), ('regression #2', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'a', 'a', 'b', 'b', 'a', 'a', 'a', 'a']], [[0, 1, 2, 5, 6, 7, 8], [3, 4]]), ('regression #3', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [None, None, 'x', 'x', None, 'x', None, None, 'x']], [[0], [1], [2, 5, 8], [3], [4], [6], [7]]), ('regression #4', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [1, '1', 1, 2, 2, '2', 1, 1, 1]], [[0], [1], [2], [3, 4], [5], [6, 7, 8]]), ('regression #5', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['', '', 'k', 'k', '', 'k', 'k', 'k', 'k']], [[0, 1, 4], [2, 3, 5, 6, 7, 8]]), ('regression #13', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['p', 'q', 'q', 'p', 'q', 'p', 'p', 'p', 'p']], [[0, 3, 5, 6, 7, 8], [1, 2, 4]]), ('regression #14', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]]], ['w', 'w', 'w', 'w']], [[0, 1, 3], [2]])]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
control #0[[0, 1, 3], [2, 4, 5], [6, 7, 8]][[0, 1, 3], [2, 4, 5], [6, 7, 8]]Passed
regression #1[[0], [1], [2], [3], [4], [5], [6], [7], [8]][[0], [1], [2], [3], [4], [5], [6], [7], [8]]Passed
regression #2[[0, 1, 2, 5, 6, 7, 8], [3, 4]][[0, 1, 2, 5, 6, 7, 8], [3, 4]]Passed
regression #3[[0], [1], [2, 5, 8], [3], [4], [6], [7]][[0], [1], [2, 5, 8], [3], [4], [6], [7]]Passed
regression #4[[0, 1, 2], [3, 4, 5], [6, 7, 8]][[0], [1], [2], [3, 4], [5], [6, 7, 8]]Failed
regression #5[[0, 1, 4], [2, 3, 5, 6, 7, 8]][[0, 1, 4], [2, 3, 5, 6, 7, 8]]Passed
control #6[[0, 1, 2, 3, 4, 5, 6, 7, 8]][[0, 1, 2, 3, 4, 5, 6, 7, 8]]Passed
control #7[[0], [1], [2], [3], [4], [5], [6], [7], [8]][[0], [1], [2], [3], [4], [5], [6], [7], [8]]Passed

SHA-256 / 2f50a873232b18901f1540934656f3a6311802353620358eb5200cd7750a88a0

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    polys, keys = x
    def edges(r):
        return {tuple(sorted([tuple(a), tuple(b)])) for a, b in zip(r, r[1:]) if a != b}
    E = [edges(p) for p in polys]
    parent = list(range(len(polys)))
    def find(a):
        while parent[a] != a:
            a = parent[a]
        return a
    for i in range(len(polys)):
        for j in range(i + 1, len(polys)):
            if keys[i] is not None and keys[i] == keys[j] and E[i] & E[j]:
                parent[find(i)] = find(j)
    groups = {}
    for i in range(len(polys)):
        groups.setdefault(find(i), []).append(i)
    return sorted(groups.values())
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('control #0', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'a', 'b', 'a', 'b', 'b', 'c', 'c', 'c']], [[0, 1, 3], [2, 4, 5], [6, 7, 8]]), ('regression #1', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a']], [[0], [1], [2], [3], [4], [5], [6], [7], [8]]), ('regression #2', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'a', 'a', 'b', 'b', 'a', 'a', 'a', 'a']], [[0, 1, 2, 5, 6, 7, 8], [3, 4]]), ('regression #3', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [None, None, 'x', 'x', None, 'x', None, None, 'x']], [[0], [1], [2, 5, 8], [3], [4], [6], [7]]), ('regression #4', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [1, '1', 1, 2, 2, '2', 1, 1, 1]], [[0], [1], [2], [3, 4], [5], [6, 7, 8]]), ('regression #5', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['', '', 'k', 'k', '', 'k', 'k', 'k', 'k']], [[0, 1, 4], [2, 3, 5, 6, 7, 8]]), ('control #6', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z']], [[0, 1, 2, 3, 4, 5, 6, 7, 8]]), ('control #7', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']], [[0], [1], [2], [3], [4], [5], [6], [7], [8]])], [('regression #3', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [None, None, 'x', 'x', None, 'x', None, None, 'x']], [[0], [1], [2, 5, 8], [3], [4], [6], [7]]), ('regression #4', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [1, '1', 1, 2, 2, '2', 1, 1, 1]], [[0], [1], [2], [3, 4], [5], [6, 7, 8]]), ('regression #5', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['', '', 'k', 'k', '', 'k', 'k', 'k', 'k']], [[0, 1, 4], [2, 3, 5, 6, 7, 8]]), ('control #6', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z']], [[0, 1, 2, 3, 4, 5, 6, 7, 8]]), ('control #7', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']], [[0], [1], [2], [3], [4], [5], [6], [7], [8]]), ('regression #8', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']], [[0, 3, 6], [1, 4, 7], [2, 5, 8]]), ('regression #9', [[[[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]]], ['q', 'q', 'q', 'r']], [[0, 1, 2], [3]]), ('regression #10', [[[[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]]], ['m', 'm', 'm', 'm']], [[0, 1, 2], [3]])], [('regression #4', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [1, '1', 1, 2, 2, '2', 1, 1, 1]], [[0], [1], [2], [3, 4], [5], [6, 7, 8]]), ('control #7', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']], [[0], [1], [2], [3], [4], [5], [6], [7], [8]]), ('regression #8', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']], [[0, 3, 6], [1, 4, 7], [2, 5, 8]]), ('regression #9', [[[[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]]], ['q', 'q', 'q', 'r']], [[0, 1, 2], [3]]), ('regression #10', [[[[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]]], ['m', 'm', 'm', 'm']], [[0, 1, 2], [3]]), ('regression #11', [[[[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]]], ['s', 's', 't', 's', 's']], [[0, 1], [2], [3, 4]]), ('boundary #12', [[], []], []), ('regression #13', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['p', 'q', 'q', 'p', 'q', 'p', 'p', 'p', 'p']], [[0, 3, 5, 6, 7, 8], [1, 2, 4]])], [('control #0', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'a', 'b', 'a', 'b', 'b', 'c', 'c', 'c']], [[0, 1, 3], [2, 4, 5], [6, 7, 8]]), ('regression #1', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a']], [[0], [1], [2], [3], [4], [5], [6], [7], [8]]), ('regression #4', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [1, '1', 1, 2, 2, '2', 1, 1, 1]], [[0], [1], [2], [3, 4], [5], [6, 7, 8]]), ('regression #10', [[[[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]]], ['m', 'm', 'm', 'm']], [[0, 1, 2], [3]]), ('regression #11', [[[[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]]], ['s', 's', 't', 's', 's']], [[0, 1], [2], [3, 4]]), ('boundary #12', [[], []], []), ('regression #13', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['p', 'q', 'q', 'p', 'q', 'p', 'p', 'p', 'p']], [[0, 3, 5, 6, 7, 8], [1, 2, 4]]), ('regression #14', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]]], ['w', 'w', 'w', 'w']], [[0, 1, 3], [2]])], [('control #0', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'a', 'b', 'a', 'b', 'b', 'c', 'c', 'c']], [[0, 1, 3], [2, 4, 5], [6, 7, 8]]), ('regression #1', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a']], [[0], [1], [2], [3], [4], [5], [6], [7], [8]]), ('regression #2', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['a', 'a', 'a', 'b', 'b', 'a', 'a', 'a', 'a']], [[0, 1, 2, 5, 6, 7, 8], [3, 4]]), ('regression #3', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [None, None, 'x', 'x', None, 'x', None, None, 'x']], [[0], [1], [2, 5, 8], [3], [4], [6], [7]]), ('regression #4', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], [1, '1', 1, 2, 2, '2', 1, 1, 1]], [[0], [1], [2], [3, 4], [5], [6, 7, 8]]), ('regression #5', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['', '', 'k', 'k', '', 'k', 'k', 'k', 'k']], [[0, 1, 4], [2, 3, 5, 6, 7, 8]]), ('regression #13', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]], [[4, 0], [6, 0], [6, 2], [4, 2], [4, 0]], [[0, 2], [2, 2], [2, 4], [0, 4], [0, 2]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 2], [6, 2], [6, 4], [4, 4], [4, 2]], [[0, 4], [2, 4], [2, 6], [0, 6], [0, 4]], [[2, 4], [4, 4], [4, 6], [2, 6], [2, 4]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]]], ['p', 'q', 'q', 'p', 'q', 'p', 'p', 'p', 'p']], [[0, 3, 5, 6, 7, 8], [1, 2, 4]]), ('regression #14', [[[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]], [[2, 2], [4, 2], [4, 4], [2, 4], [2, 2]], [[4, 4], [6, 4], [6, 6], [4, 6], [4, 4]], [[2, 0], [4, 0], [4, 2], [2, 2], [2, 0]]], ['w', 'w', 'w', 'w']], [[0, 1, 3], [2]])]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
control #0[[0, 1, 3], [2, 4, 5], [6, 7, 8]][[0, 1, 3], [2, 4, 5], [6, 7, 8]]Passed
regression #1[[0], [1], [2], [3], [4], [5], [6], [7], [8]][[0], [1], [2], [3], [4], [5], [6], [7], [8]]Passed
regression #2[[0, 1, 2, 5, 6, 7, 8], [3, 4]][[0, 1, 2, 5, 6, 7, 8], [3, 4]]Passed
regression #3[[0], [1], [2, 5, 8], [3], [4], [6], [7]][[0], [1], [2, 5, 8], [3], [4], [6], [7]]Passed
regression #4[[0], [1], [2], [3, 4], [5], [6, 7, 8]][[0], [1], [2], [3, 4], [5], [6, 7, 8]]Passed
regression #5[[0, 1, 4], [2, 3, 5, 6, 7, 8]][[0, 1, 4], [2, 3, 5, 6, 7, 8]]Passed
control #6[[0, 1, 2, 3, 4, 5, 6, 7, 8]][[0, 1, 2, 3, 4, 5, 6, 7, 8]]Passed
control #7[[0], [1], [2], [3], [4], [5], [6], [7], [8]][[0], [1], [2], [3], [4], [5], [6], [7], [8]]Passed

SHA-256 / 359aac0557a95d5c325f7e7213795ceea856d3048e9f1d3b9dd4ded1db80c3b4

Verification & scope

Stipulated deterministic toy contract on a bounded input domain; results are rounded as stated and no conformance with any published standard or library is claimed. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.

Observations recorded using Python 3.12.14 at 2026-09-29T14:48:23.889607+00:00.

Case digest / 6e8391f3f13d31c0c37c702bd4aa5760deb8a0ebf41a60606d72a3d5a17f31e2