broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(commands, size):
    def stage(poly,inside,cross):
        res=[]
        for i in range(len(poly)):
            cur=poly[i]
            prev=poly[i-1]
            if inside(cur):
                res.append(cur)
                if not inside(prev): res.append(cross(prev,cur))
            elif inside(prev):
                res.append(cross(prev,cur))
        return res
    def at_x(k):
        return lambda p,c: (Fraction(k),p[1]+(c[1]-p[1])*(k-p[0])/(c[0]-p[0]))
    def at_y(k):
        return lambda p,c: (p[0]+(c[0]-p[0])*(k-p[1])/(c[1]-p[1]),Fraction(k))
    out=[]
    for poly in commands:
        src=[(Fraction(x),Fraction(y)) for x,y in poly]
        pts=stage(src,lambda p:p[0]>=0,at_x(0))
        pts=stage(pts,lambda p:p[0]<=size,at_x(size))
        pts=stage(pts,lambda p:p[1]>=0,at_y(0))
        pts=stage(pts,lambda p:p[1]<=size,at_y(size))
        clean=[p for i,p in enumerate(pts) if p!=pts[i-1]]
        if len(clean)<3: clean=[]
        out.append([[str(x),str(y)] for x,y in clean])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('explicit case 0', solve([[[1, 1], [5, 1], [5, 5], [1, 5]]], 6), [[['1', '1'], ['5', '1'], ['5', '5'], ['1', '5']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 6), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [8, 2], [2, 4]]], 6), [[['1', '1'], ['6', '12/7'], ['6', '8/3'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [8, -2], [8, 8], [-2, 8]]], 6), [[['0', '6'], ['0', '0'], ['6', '0'], ['6', '6']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 6), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 6), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 6), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 6), [[]])
    check('explicit case 8', solve([[[1, 1], [7, 1], [1, 9]]], 6), [[['1', '6'], ['1', '1'], ['6', '1'], ['6', '7/3'], ['13/4', '6']]])
    check('explicit case 9', solve([[['1/2', 2], [6, 2], [6, 5]]], 6), [[['1/2', '2'], ['6', '2'], ['6', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 6), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [8, 3], [6, 4], [5, 1]]], 6), [[['3', '1'], ['6', '11/5'], ['6', '4'], ['5', '1']]])
if N == 2:
    check('explicit case 0', solve([[[1, 1], [6, 1], [6, 6], [1, 6]]], 7), [[['1', '1'], ['6', '1'], ['6', '6'], ['1', '6']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 7), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [9, 2], [2, 4]]], 7), [[['1', '1'], ['7', '7/4'], ['7', '18/7'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [9, -2], [9, 9], [-2, 9]]], 7), [[['0', '7'], ['0', '0'], ['7', '0'], ['7', '7']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 7), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 7), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 7), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 7), [[]])
    check('explicit case 8', solve([[[1, 1], [8, 1], [1, 10]]], 7), [[['1', '7'], ['1', '1'], ['7', '1'], ['7', '16/7'], ['10/3', '7']]])
    check('explicit case 9', solve([[['1/2', 2], [7, 2], [7, 5]]], 7), [[['1/2', '2'], ['7', '2'], ['7', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 7), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [9, 3], [7, 4], [6, 1]]], 7), [[['3', '1'], ['7', '7/3'], ['7', '4'], ['6', '1']]])
if N == 3:
    check('explicit case 0', solve([[[1, 1], [7, 1], [7, 7], [1, 7]]], 8), [[['1', '1'], ['7', '1'], ['7', '7'], ['1', '7']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 8), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [10, 2], [2, 4]]], 8), [[['1', '1'], ['8', '16/9'], ['8', '5/2'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [10, -2], [10, 10], [-2, 10]]], 8), [[['0', '8'], ['0', '0'], ['8', '0'], ['8', '8']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 8), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 8), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 8), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 8), [[]])
    check('explicit case 8', solve([[[1, 1], [9, 1], [1, 11]]], 8), [[['1', '8'], ['1', '1'], ['8', '1'], ['8', '9/4'], ['17/5', '8']]])
    check('explicit case 9', solve([[['1/2', 2], [8, 2], [8, 5]]], 8), [[['1/2', '2'], ['8', '2'], ['8', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 8), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [10, 3], [8, 4], [7, 1]]], 8), [[['3', '1'], ['8', '17/7'], ['8', '4'], ['7', '1']]])
if N == 4:
    check('explicit case 0', solve([[[1, 1], [8, 1], [8, 8], [1, 8]]], 9), [[['1', '1'], ['8', '1'], ['8', '8'], ['1', '8']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 9), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [11, 2], [2, 4]]], 9), [[['1', '1'], ['9', '9/5'], ['9', '22/9'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [11, -2], [11, 11], [-2, 11]]], 9), [[['0', '9'], ['0', '0'], ['9', '0'], ['9', '9']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 9), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 9), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 9), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 9), [[]])
    check('explicit case 8', solve([[[1, 1], [10, 1], [1, 12]]], 9), [[['1', '9'], ['1', '1'], ['9', '1'], ['9', '20/9'], ['38/11', '9']]])
    check('explicit case 9', solve([[['1/2', 2], [9, 2], [9, 5]]], 9), [[['1/2', '2'], ['9', '2'], ['9', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 9), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [11, 3], [9, 4], [8, 1]]], 9), [[['3', '1'], ['9', '5/2'], ['9', '4'], ['8', '1']]])
if N == 5:
    check('explicit case 0', solve([[[1, 1], [9, 1], [9, 9], [1, 9]]], 10), [[['1', '1'], ['9', '1'], ['9', '9'], ['1', '9']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 10), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [12, 2], [2, 4]]], 10), [[['1', '1'], ['10', '20/11'], ['10', '12/5'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [12, -2], [12, 12], [-2, 12]]], 10), [[['0', '10'], ['0', '0'], ['10', '0'], ['10', '10']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 10), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 10), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 10), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 10), [[]])
    check('explicit case 8', solve([[[1, 1], [11, 1], [1, 13]]], 10), [[['1', '10'], ['1', '1'], ['10', '1'], ['10', '11/5'], ['7/2', '10']]])
    check('explicit case 9', solve([[['1/2', 2], [10, 2], [10, 5]]], 10), [[['1/2', '2'], ['10', '2'], ['10', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 10), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [12, 3], [10, 4], [9, 1]]], 10), [[['3', '1'], ['10', '23/9'], ['10', '4'], ['9', '1']]])
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
from fractions import Fraction
N = 1
observations = []
def solve(commands, size):
    def stage(poly,inside,cross):
        res=[]
        for i in range(len(poly)):
            cur=poly[i]
            prev=poly[i-1]
            if inside(cur):
                if not inside(prev): res.insert(0,cross(prev,cur))
                res.append(cur)
            elif inside(prev):
                res.append(cross(prev,cur))
        return res
    def at_x(k):
        return lambda p,c: (Fraction(k),p[1]+(c[1]-p[1])*(k-p[0])/(c[0]-p[0]))
    def at_y(k):
        return lambda p,c: (p[0]+(c[0]-p[0])*(k-p[1])/(c[1]-p[1]),Fraction(k))
    out=[]
    for poly in commands:
        src=[(Fraction(x),Fraction(y)) for x,y in poly]
        pts=stage(src,lambda p:p[0]>=0,at_x(0))
        pts=stage(pts,lambda p:p[0]<=size,at_x(size))
        pts=stage(pts,lambda p:p[1]>=0,at_y(0))
        pts=stage(pts,lambda p:p[1]<=size,at_y(size))
        clean=[p for i,p in enumerate(pts) if p!=pts[i-1]]
        if len(clean)<3: clean=[]
        out.append([[str(x),str(y)] for x,y in clean])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('explicit case 0', solve([[[1, 1], [5, 1], [5, 5], [1, 5]]], 6), [[['1', '1'], ['5', '1'], ['5', '5'], ['1', '5']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 6), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [8, 2], [2, 4]]], 6), [[['1', '1'], ['6', '12/7'], ['6', '8/3'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [8, -2], [8, 8], [-2, 8]]], 6), [[['0', '6'], ['0', '0'], ['6', '0'], ['6', '6']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 6), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 6), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 6), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 6), [[]])
    check('explicit case 8', solve([[[1, 1], [7, 1], [1, 9]]], 6), [[['1', '6'], ['1', '1'], ['6', '1'], ['6', '7/3'], ['13/4', '6']]])
    check('explicit case 9', solve([[['1/2', 2], [6, 2], [6, 5]]], 6), [[['1/2', '2'], ['6', '2'], ['6', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 6), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [8, 3], [6, 4], [5, 1]]], 6), [[['3', '1'], ['6', '11/5'], ['6', '4'], ['5', '1']]])
if N == 2:
    check('explicit case 0', solve([[[1, 1], [6, 1], [6, 6], [1, 6]]], 7), [[['1', '1'], ['6', '1'], ['6', '6'], ['1', '6']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 7), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [9, 2], [2, 4]]], 7), [[['1', '1'], ['7', '7/4'], ['7', '18/7'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [9, -2], [9, 9], [-2, 9]]], 7), [[['0', '7'], ['0', '0'], ['7', '0'], ['7', '7']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 7), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 7), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 7), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 7), [[]])
    check('explicit case 8', solve([[[1, 1], [8, 1], [1, 10]]], 7), [[['1', '7'], ['1', '1'], ['7', '1'], ['7', '16/7'], ['10/3', '7']]])
    check('explicit case 9', solve([[['1/2', 2], [7, 2], [7, 5]]], 7), [[['1/2', '2'], ['7', '2'], ['7', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 7), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [9, 3], [7, 4], [6, 1]]], 7), [[['3', '1'], ['7', '7/3'], ['7', '4'], ['6', '1']]])
if N == 3:
    check('explicit case 0', solve([[[1, 1], [7, 1], [7, 7], [1, 7]]], 8), [[['1', '1'], ['7', '1'], ['7', '7'], ['1', '7']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 8), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [10, 2], [2, 4]]], 8), [[['1', '1'], ['8', '16/9'], ['8', '5/2'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [10, -2], [10, 10], [-2, 10]]], 8), [[['0', '8'], ['0', '0'], ['8', '0'], ['8', '8']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 8), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 8), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 8), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 8), [[]])
    check('explicit case 8', solve([[[1, 1], [9, 1], [1, 11]]], 8), [[['1', '8'], ['1', '1'], ['8', '1'], ['8', '9/4'], ['17/5', '8']]])
    check('explicit case 9', solve([[['1/2', 2], [8, 2], [8, 5]]], 8), [[['1/2', '2'], ['8', '2'], ['8', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 8), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [10, 3], [8, 4], [7, 1]]], 8), [[['3', '1'], ['8', '17/7'], ['8', '4'], ['7', '1']]])
if N == 4:
    check('explicit case 0', solve([[[1, 1], [8, 1], [8, 8], [1, 8]]], 9), [[['1', '1'], ['8', '1'], ['8', '8'], ['1', '8']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 9), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [11, 2], [2, 4]]], 9), [[['1', '1'], ['9', '9/5'], ['9', '22/9'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [11, -2], [11, 11], [-2, 11]]], 9), [[['0', '9'], ['0', '0'], ['9', '0'], ['9', '9']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 9), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 9), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 9), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 9), [[]])
    check('explicit case 8', solve([[[1, 1], [10, 1], [1, 12]]], 9), [[['1', '9'], ['1', '1'], ['9', '1'], ['9', '20/9'], ['38/11', '9']]])
    check('explicit case 9', solve([[['1/2', 2], [9, 2], [9, 5]]], 9), [[['1/2', '2'], ['9', '2'], ['9', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 9), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [11, 3], [9, 4], [8, 1]]], 9), [[['3', '1'], ['9', '5/2'], ['9', '4'], ['8', '1']]])
if N == 5:
    check('explicit case 0', solve([[[1, 1], [9, 1], [9, 9], [1, 9]]], 10), [[['1', '1'], ['9', '1'], ['9', '9'], ['1', '9']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 10), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [12, 2], [2, 4]]], 10), [[['1', '1'], ['10', '20/11'], ['10', '12/5'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [12, -2], [12, 12], [-2, 12]]], 10), [[['0', '10'], ['0', '0'], ['10', '0'], ['10', '10']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 10), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 10), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 10), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 10), [[]])
    check('explicit case 8', solve([[[1, 1], [11, 1], [1, 13]]], 10), [[['1', '10'], ['1', '1'], ['10', '1'], ['10', '11/5'], ['7/2', '10']]])
    check('explicit case 9', solve([[['1/2', 2], [10, 2], [10, 5]]], 10), [[['1/2', '2'], ['10', '2'], ['10', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 10), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [12, 3], [10, 4], [9, 1]]], 10), [[['3', '1'], ['10', '23/9'], ['10', '4'], ['9', '1']]])
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:
On an entering edge the inside vertex is emitted before the boundary intersection, producing a self-crossing output order.

Each command is a polygon vertex list with exact coordinates. It is clipped in continuous raster coordinates against x>=0, x<=size, y>=0 and y<=size in that order with Sutherland-Hodgman: each stage walks edges from the previous vertex to the current vertex, emits the boundary intersection when entering before the inside vertex, emits the intersection when leaving, and chains its output into the next stage. Boundary points are inside. Cyclically repeated consecutive vertices are then removed; fewer than three remaining vertices yields an empty polygon. Vertices are returned as exact rational strings.

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(commands, size):
    def stage(poly,inside,cross):
        res=[]
        for i in range(len(poly)):
            cur=poly[i]
            prev=poly[i-1]
            if inside(cur):
                if not inside(prev): res.append(cross(prev,cur))
                res.append(cur)
            elif inside(prev):
                pass
        return res
    def at_x(k):
        return lambda p,c: (Fraction(k),p[1]+(c[1]-p[1])*(k-p[0])/(c[0]-p[0]))
    def at_y(k):
        return lambda p,c: (p[0]+(c[0]-p[0])*(k-p[1])/(c[1]-p[1]),Fraction(k))
    out=[]
    for poly in commands:
        src=[(Fraction(x),Fraction(y)) for x,y in poly]
        pts=stage(src,lambda p:p[0]>=0,at_x(0))
        pts=stage(pts,lambda p:p[0]<=size,at_x(size))
        pts=stage(pts,lambda p:p[1]>=0,at_y(0))
        pts=stage(pts,lambda p:p[1]<=size,at_y(size))
        clean=[p for i,p in enumerate(pts) if p!=pts[i-1]]
        if len(clean)<3: clean=[]
        out.append([[str(x),str(y)] for x,y in clean])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('explicit case 0', solve([[[1, 1], [5, 1], [5, 5], [1, 5]]], 6), [[['1', '1'], ['5', '1'], ['5', '5'], ['1', '5']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 6), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [8, 2], [2, 4]]], 6), [[['1', '1'], ['6', '12/7'], ['6', '8/3'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [8, -2], [8, 8], [-2, 8]]], 6), [[['0', '6'], ['0', '0'], ['6', '0'], ['6', '6']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 6), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 6), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 6), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 6), [[]])
    check('explicit case 8', solve([[[1, 1], [7, 1], [1, 9]]], 6), [[['1', '6'], ['1', '1'], ['6', '1'], ['6', '7/3'], ['13/4', '6']]])
    check('explicit case 9', solve([[['1/2', 2], [6, 2], [6, 5]]], 6), [[['1/2', '2'], ['6', '2'], ['6', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 6), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [8, 3], [6, 4], [5, 1]]], 6), [[['3', '1'], ['6', '11/5'], ['6', '4'], ['5', '1']]])
if N == 2:
    check('explicit case 0', solve([[[1, 1], [6, 1], [6, 6], [1, 6]]], 7), [[['1', '1'], ['6', '1'], ['6', '6'], ['1', '6']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 7), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [9, 2], [2, 4]]], 7), [[['1', '1'], ['7', '7/4'], ['7', '18/7'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [9, -2], [9, 9], [-2, 9]]], 7), [[['0', '7'], ['0', '0'], ['7', '0'], ['7', '7']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 7), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 7), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 7), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 7), [[]])
    check('explicit case 8', solve([[[1, 1], [8, 1], [1, 10]]], 7), [[['1', '7'], ['1', '1'], ['7', '1'], ['7', '16/7'], ['10/3', '7']]])
    check('explicit case 9', solve([[['1/2', 2], [7, 2], [7, 5]]], 7), [[['1/2', '2'], ['7', '2'], ['7', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 7), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [9, 3], [7, 4], [6, 1]]], 7), [[['3', '1'], ['7', '7/3'], ['7', '4'], ['6', '1']]])
if N == 3:
    check('explicit case 0', solve([[[1, 1], [7, 1], [7, 7], [1, 7]]], 8), [[['1', '1'], ['7', '1'], ['7', '7'], ['1', '7']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 8), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [10, 2], [2, 4]]], 8), [[['1', '1'], ['8', '16/9'], ['8', '5/2'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [10, -2], [10, 10], [-2, 10]]], 8), [[['0', '8'], ['0', '0'], ['8', '0'], ['8', '8']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 8), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 8), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 8), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 8), [[]])
    check('explicit case 8', solve([[[1, 1], [9, 1], [1, 11]]], 8), [[['1', '8'], ['1', '1'], ['8', '1'], ['8', '9/4'], ['17/5', '8']]])
    check('explicit case 9', solve([[['1/2', 2], [8, 2], [8, 5]]], 8), [[['1/2', '2'], ['8', '2'], ['8', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 8), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [10, 3], [8, 4], [7, 1]]], 8), [[['3', '1'], ['8', '17/7'], ['8', '4'], ['7', '1']]])
if N == 4:
    check('explicit case 0', solve([[[1, 1], [8, 1], [8, 8], [1, 8]]], 9), [[['1', '1'], ['8', '1'], ['8', '8'], ['1', '8']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 9), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [11, 2], [2, 4]]], 9), [[['1', '1'], ['9', '9/5'], ['9', '22/9'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [11, -2], [11, 11], [-2, 11]]], 9), [[['0', '9'], ['0', '0'], ['9', '0'], ['9', '9']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 9), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 9), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 9), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 9), [[]])
    check('explicit case 8', solve([[[1, 1], [10, 1], [1, 12]]], 9), [[['1', '9'], ['1', '1'], ['9', '1'], ['9', '20/9'], ['38/11', '9']]])
    check('explicit case 9', solve([[['1/2', 2], [9, 2], [9, 5]]], 9), [[['1/2', '2'], ['9', '2'], ['9', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 9), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [11, 3], [9, 4], [8, 1]]], 9), [[['3', '1'], ['9', '5/2'], ['9', '4'], ['8', '1']]])
if N == 5:
    check('explicit case 0', solve([[[1, 1], [9, 1], [9, 9], [1, 9]]], 10), [[['1', '1'], ['9', '1'], ['9', '9'], ['1', '9']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 10), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [12, 2], [2, 4]]], 10), [[['1', '1'], ['10', '20/11'], ['10', '12/5'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [12, -2], [12, 12], [-2, 12]]], 10), [[['0', '10'], ['0', '0'], ['10', '0'], ['10', '10']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 10), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 10), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 10), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 10), [[]])
    check('explicit case 8', solve([[[1, 1], [11, 1], [1, 13]]], 10), [[['1', '10'], ['1', '1'], ['10', '1'], ['10', '11/5'], ['7/2', '10']]])
    check('explicit case 9', solve([[['1/2', 2], [10, 2], [10, 5]]], 10), [[['1/2', '2'], ['10', '2'], ['10', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 10), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [12, 3], [10, 4], [9, 1]]], 10), [[['3', '1'], ['10', '23/9'], ['10', '4'], ['9', '1']]])
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
from fractions import Fraction
N = 1
observations = []
def solve(commands, size):
    def stage(poly,inside,cross):
        res=[]
        for i in range(len(poly)):
            cur=poly[i]
            prev=poly[i-1]
            if inside(cur):
                if not inside(prev): res.append(cross(prev,cur))
                res.append(cur)
            elif inside(prev) and not res:
                res.append(cross(prev,cur))
        return res
    def at_x(k):
        return lambda p,c: (Fraction(k),p[1]+(c[1]-p[1])*(k-p[0])/(c[0]-p[0]))
    def at_y(k):
        return lambda p,c: (p[0]+(c[0]-p[0])*(k-p[1])/(c[1]-p[1]),Fraction(k))
    out=[]
    for poly in commands:
        src=[(Fraction(x),Fraction(y)) for x,y in poly]
        pts=stage(src,lambda p:p[0]>=0,at_x(0))
        pts=stage(pts,lambda p:p[0]<=size,at_x(size))
        pts=stage(pts,lambda p:p[1]>=0,at_y(0))
        pts=stage(pts,lambda p:p[1]<=size,at_y(size))
        clean=[p for i,p in enumerate(pts) if p!=pts[i-1]]
        if len(clean)<3: clean=[]
        out.append([[str(x),str(y)] for x,y in clean])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('explicit case 0', solve([[[1, 1], [5, 1], [5, 5], [1, 5]]], 6), [[['1', '1'], ['5', '1'], ['5', '5'], ['1', '5']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 6), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [8, 2], [2, 4]]], 6), [[['1', '1'], ['6', '12/7'], ['6', '8/3'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [8, -2], [8, 8], [-2, 8]]], 6), [[['0', '6'], ['0', '0'], ['6', '0'], ['6', '6']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 6), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 6), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 6), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 6), [[]])
    check('explicit case 8', solve([[[1, 1], [7, 1], [1, 9]]], 6), [[['1', '6'], ['1', '1'], ['6', '1'], ['6', '7/3'], ['13/4', '6']]])
    check('explicit case 9', solve([[['1/2', 2], [6, 2], [6, 5]]], 6), [[['1/2', '2'], ['6', '2'], ['6', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 6), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [8, 3], [6, 4], [5, 1]]], 6), [[['3', '1'], ['6', '11/5'], ['6', '4'], ['5', '1']]])
if N == 2:
    check('explicit case 0', solve([[[1, 1], [6, 1], [6, 6], [1, 6]]], 7), [[['1', '1'], ['6', '1'], ['6', '6'], ['1', '6']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 7), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [9, 2], [2, 4]]], 7), [[['1', '1'], ['7', '7/4'], ['7', '18/7'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [9, -2], [9, 9], [-2, 9]]], 7), [[['0', '7'], ['0', '0'], ['7', '0'], ['7', '7']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 7), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 7), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 7), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 7), [[]])
    check('explicit case 8', solve([[[1, 1], [8, 1], [1, 10]]], 7), [[['1', '7'], ['1', '1'], ['7', '1'], ['7', '16/7'], ['10/3', '7']]])
    check('explicit case 9', solve([[['1/2', 2], [7, 2], [7, 5]]], 7), [[['1/2', '2'], ['7', '2'], ['7', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 7), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [9, 3], [7, 4], [6, 1]]], 7), [[['3', '1'], ['7', '7/3'], ['7', '4'], ['6', '1']]])
if N == 3:
    check('explicit case 0', solve([[[1, 1], [7, 1], [7, 7], [1, 7]]], 8), [[['1', '1'], ['7', '1'], ['7', '7'], ['1', '7']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 8), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [10, 2], [2, 4]]], 8), [[['1', '1'], ['8', '16/9'], ['8', '5/2'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [10, -2], [10, 10], [-2, 10]]], 8), [[['0', '8'], ['0', '0'], ['8', '0'], ['8', '8']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 8), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 8), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 8), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 8), [[]])
    check('explicit case 8', solve([[[1, 1], [9, 1], [1, 11]]], 8), [[['1', '8'], ['1', '1'], ['8', '1'], ['8', '9/4'], ['17/5', '8']]])
    check('explicit case 9', solve([[['1/2', 2], [8, 2], [8, 5]]], 8), [[['1/2', '2'], ['8', '2'], ['8', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 8), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [10, 3], [8, 4], [7, 1]]], 8), [[['3', '1'], ['8', '17/7'], ['8', '4'], ['7', '1']]])
if N == 4:
    check('explicit case 0', solve([[[1, 1], [8, 1], [8, 8], [1, 8]]], 9), [[['1', '1'], ['8', '1'], ['8', '8'], ['1', '8']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 9), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [11, 2], [2, 4]]], 9), [[['1', '1'], ['9', '9/5'], ['9', '22/9'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [11, -2], [11, 11], [-2, 11]]], 9), [[['0', '9'], ['0', '0'], ['9', '0'], ['9', '9']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 9), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 9), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 9), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 9), [[]])
    check('explicit case 8', solve([[[1, 1], [10, 1], [1, 12]]], 9), [[['1', '9'], ['1', '1'], ['9', '1'], ['9', '20/9'], ['38/11', '9']]])
    check('explicit case 9', solve([[['1/2', 2], [9, 2], [9, 5]]], 9), [[['1/2', '2'], ['9', '2'], ['9', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 9), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [11, 3], [9, 4], [8, 1]]], 9), [[['3', '1'], ['9', '5/2'], ['9', '4'], ['8', '1']]])
if N == 5:
    check('explicit case 0', solve([[[1, 1], [9, 1], [9, 9], [1, 9]]], 10), [[['1', '1'], ['9', '1'], ['9', '9'], ['1', '9']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 10), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [12, 2], [2, 4]]], 10), [[['1', '1'], ['10', '20/11'], ['10', '12/5'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [12, -2], [12, 12], [-2, 12]]], 10), [[['0', '10'], ['0', '0'], ['10', '0'], ['10', '10']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 10), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 10), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 10), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 10), [[]])
    check('explicit case 8', solve([[[1, 1], [11, 1], [1, 13]]], 10), [[['1', '10'], ['1', '1'], ['10', '1'], ['10', '11/5'], ['7/2', '10']]])
    check('explicit case 9', solve([[['1/2', 2], [10, 2], [10, 5]]], 10), [[['1/2', '2'], ['10', '2'], ['10', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 10), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [12, 3], [10, 4], [9, 1]]], 10), [[['3', '1'], ['10', '23/9'], ['10', '4'], ['9', '1']]])
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 leaving edge emits nothing, so the boundary exit point is missing and the clipped polygon cuts a diagonal.

Each command is a polygon vertex list with exact coordinates. It is clipped in continuous raster coordinates against x>=0, x<=size, y>=0 and y<=size in that order with Sutherland-Hodgman: each stage walks edges from the previous vertex to the current vertex, emits the boundary intersection when entering before the inside vertex, emits the intersection when leaving, and chains its output into the next stage. Boundary points are inside. Cyclically repeated consecutive vertices are then removed; fewer than three remaining vertices yields an empty polygon. Vertices are returned as exact rational strings.

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(commands, size):
    def stage(poly,inside,cross):
        res=[]
        for i in range(len(poly)):
            cur=poly[i]
            prev=poly[i-1]
            if inside(cur):
                if not inside(prev): res.append(cross(prev,cur))
                res.append(cur)
            elif inside(prev):
                res.append(cross(prev,cur))
        return res
    def at_x(k):
        return lambda p,c: (Fraction(k),c[1]+(c[1]-p[1])*(k-p[0])/(c[0]-p[0]))
    def at_y(k):
        return lambda p,c: (p[0]+(c[0]-p[0])*(k-p[1])/(c[1]-p[1]),Fraction(k))
    out=[]
    for poly in commands:
        src=[(Fraction(x),Fraction(y)) for x,y in poly]
        pts=stage(src,lambda p:p[0]>=0,at_x(0))
        pts=stage(pts,lambda p:p[0]<=size,at_x(size))
        pts=stage(pts,lambda p:p[1]>=0,at_y(0))
        pts=stage(pts,lambda p:p[1]<=size,at_y(size))
        clean=[p for i,p in enumerate(pts) if p!=pts[i-1]]
        if len(clean)<3: clean=[]
        out.append([[str(x),str(y)] for x,y in clean])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('explicit case 0', solve([[[1, 1], [5, 1], [5, 5], [1, 5]]], 6), [[['1', '1'], ['5', '1'], ['5', '5'], ['1', '5']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 6), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [8, 2], [2, 4]]], 6), [[['1', '1'], ['6', '12/7'], ['6', '8/3'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [8, -2], [8, 8], [-2, 8]]], 6), [[['0', '6'], ['0', '0'], ['6', '0'], ['6', '6']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 6), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 6), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 6), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 6), [[]])
    check('explicit case 8', solve([[[1, 1], [7, 1], [1, 9]]], 6), [[['1', '6'], ['1', '1'], ['6', '1'], ['6', '7/3'], ['13/4', '6']]])
    check('explicit case 9', solve([[['1/2', 2], [6, 2], [6, 5]]], 6), [[['1/2', '2'], ['6', '2'], ['6', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 6), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [8, 3], [6, 4], [5, 1]]], 6), [[['3', '1'], ['6', '11/5'], ['6', '4'], ['5', '1']]])
if N == 2:
    check('explicit case 0', solve([[[1, 1], [6, 1], [6, 6], [1, 6]]], 7), [[['1', '1'], ['6', '1'], ['6', '6'], ['1', '6']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 7), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [9, 2], [2, 4]]], 7), [[['1', '1'], ['7', '7/4'], ['7', '18/7'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [9, -2], [9, 9], [-2, 9]]], 7), [[['0', '7'], ['0', '0'], ['7', '0'], ['7', '7']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 7), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 7), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 7), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 7), [[]])
    check('explicit case 8', solve([[[1, 1], [8, 1], [1, 10]]], 7), [[['1', '7'], ['1', '1'], ['7', '1'], ['7', '16/7'], ['10/3', '7']]])
    check('explicit case 9', solve([[['1/2', 2], [7, 2], [7, 5]]], 7), [[['1/2', '2'], ['7', '2'], ['7', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 7), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [9, 3], [7, 4], [6, 1]]], 7), [[['3', '1'], ['7', '7/3'], ['7', '4'], ['6', '1']]])
if N == 3:
    check('explicit case 0', solve([[[1, 1], [7, 1], [7, 7], [1, 7]]], 8), [[['1', '1'], ['7', '1'], ['7', '7'], ['1', '7']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 8), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [10, 2], [2, 4]]], 8), [[['1', '1'], ['8', '16/9'], ['8', '5/2'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [10, -2], [10, 10], [-2, 10]]], 8), [[['0', '8'], ['0', '0'], ['8', '0'], ['8', '8']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 8), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 8), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 8), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 8), [[]])
    check('explicit case 8', solve([[[1, 1], [9, 1], [1, 11]]], 8), [[['1', '8'], ['1', '1'], ['8', '1'], ['8', '9/4'], ['17/5', '8']]])
    check('explicit case 9', solve([[['1/2', 2], [8, 2], [8, 5]]], 8), [[['1/2', '2'], ['8', '2'], ['8', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 8), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [10, 3], [8, 4], [7, 1]]], 8), [[['3', '1'], ['8', '17/7'], ['8', '4'], ['7', '1']]])
if N == 4:
    check('explicit case 0', solve([[[1, 1], [8, 1], [8, 8], [1, 8]]], 9), [[['1', '1'], ['8', '1'], ['8', '8'], ['1', '8']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 9), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [11, 2], [2, 4]]], 9), [[['1', '1'], ['9', '9/5'], ['9', '22/9'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [11, -2], [11, 11], [-2, 11]]], 9), [[['0', '9'], ['0', '0'], ['9', '0'], ['9', '9']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 9), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 9), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 9), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 9), [[]])
    check('explicit case 8', solve([[[1, 1], [10, 1], [1, 12]]], 9), [[['1', '9'], ['1', '1'], ['9', '1'], ['9', '20/9'], ['38/11', '9']]])
    check('explicit case 9', solve([[['1/2', 2], [9, 2], [9, 5]]], 9), [[['1/2', '2'], ['9', '2'], ['9', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 9), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [11, 3], [9, 4], [8, 1]]], 9), [[['3', '1'], ['9', '5/2'], ['9', '4'], ['8', '1']]])
if N == 5:
    check('explicit case 0', solve([[[1, 1], [9, 1], [9, 9], [1, 9]]], 10), [[['1', '1'], ['9', '1'], ['9', '9'], ['1', '9']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 10), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [12, 2], [2, 4]]], 10), [[['1', '1'], ['10', '20/11'], ['10', '12/5'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [12, -2], [12, 12], [-2, 12]]], 10), [[['0', '10'], ['0', '0'], ['10', '0'], ['10', '10']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 10), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 10), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 10), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 10), [[]])
    check('explicit case 8', solve([[[1, 1], [11, 1], [1, 13]]], 10), [[['1', '10'], ['1', '1'], ['10', '1'], ['10', '11/5'], ['7/2', '10']]])
    check('explicit case 9', solve([[['1/2', 2], [10, 2], [10, 5]]], 10), [[['1/2', '2'], ['10', '2'], ['10', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 10), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [12, 3], [10, 4], [9, 1]]], 10), [[['3', '1'], ['10', '23/9'], ['10', '4'], ['9', '1']]])
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
from fractions import Fraction
N = 1
observations = []
def solve(commands, size):
    def stage(poly,inside,cross):
        res=[]
        for i in range(len(poly)):
            cur=poly[i]
            prev=poly[i-1]
            if inside(cur):
                if not inside(prev): res.append(cross(prev,cur))
                res.append(cur)
            elif inside(prev):
                res.append(cross(prev,cur))
        return res
    def at_x(k):
        return lambda p,c: (Fraction(k),p[1]+(c[1]-p[1])*(k-c[0])/(c[0]-p[0]))
    def at_y(k):
        return lambda p,c: (p[0]+(c[0]-p[0])*(k-p[1])/(c[1]-p[1]),Fraction(k))
    out=[]
    for poly in commands:
        src=[(Fraction(x),Fraction(y)) for x,y in poly]
        pts=stage(src,lambda p:p[0]>=0,at_x(0))
        pts=stage(pts,lambda p:p[0]<=size,at_x(size))
        pts=stage(pts,lambda p:p[1]>=0,at_y(0))
        pts=stage(pts,lambda p:p[1]<=size,at_y(size))
        clean=[p for i,p in enumerate(pts) if p!=pts[i-1]]
        if len(clean)<3: clean=[]
        out.append([[str(x),str(y)] for x,y in clean])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('explicit case 0', solve([[[1, 1], [5, 1], [5, 5], [1, 5]]], 6), [[['1', '1'], ['5', '1'], ['5', '5'], ['1', '5']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 6), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [8, 2], [2, 4]]], 6), [[['1', '1'], ['6', '12/7'], ['6', '8/3'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [8, -2], [8, 8], [-2, 8]]], 6), [[['0', '6'], ['0', '0'], ['6', '0'], ['6', '6']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 6), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 6), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 6), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 6), [[]])
    check('explicit case 8', solve([[[1, 1], [7, 1], [1, 9]]], 6), [[['1', '6'], ['1', '1'], ['6', '1'], ['6', '7/3'], ['13/4', '6']]])
    check('explicit case 9', solve([[['1/2', 2], [6, 2], [6, 5]]], 6), [[['1/2', '2'], ['6', '2'], ['6', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 6), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [8, 3], [6, 4], [5, 1]]], 6), [[['3', '1'], ['6', '11/5'], ['6', '4'], ['5', '1']]])
if N == 2:
    check('explicit case 0', solve([[[1, 1], [6, 1], [6, 6], [1, 6]]], 7), [[['1', '1'], ['6', '1'], ['6', '6'], ['1', '6']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 7), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [9, 2], [2, 4]]], 7), [[['1', '1'], ['7', '7/4'], ['7', '18/7'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [9, -2], [9, 9], [-2, 9]]], 7), [[['0', '7'], ['0', '0'], ['7', '0'], ['7', '7']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 7), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 7), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 7), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 7), [[]])
    check('explicit case 8', solve([[[1, 1], [8, 1], [1, 10]]], 7), [[['1', '7'], ['1', '1'], ['7', '1'], ['7', '16/7'], ['10/3', '7']]])
    check('explicit case 9', solve([[['1/2', 2], [7, 2], [7, 5]]], 7), [[['1/2', '2'], ['7', '2'], ['7', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 7), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [9, 3], [7, 4], [6, 1]]], 7), [[['3', '1'], ['7', '7/3'], ['7', '4'], ['6', '1']]])
if N == 3:
    check('explicit case 0', solve([[[1, 1], [7, 1], [7, 7], [1, 7]]], 8), [[['1', '1'], ['7', '1'], ['7', '7'], ['1', '7']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 8), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [10, 2], [2, 4]]], 8), [[['1', '1'], ['8', '16/9'], ['8', '5/2'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [10, -2], [10, 10], [-2, 10]]], 8), [[['0', '8'], ['0', '0'], ['8', '0'], ['8', '8']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 8), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 8), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 8), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 8), [[]])
    check('explicit case 8', solve([[[1, 1], [9, 1], [1, 11]]], 8), [[['1', '8'], ['1', '1'], ['8', '1'], ['8', '9/4'], ['17/5', '8']]])
    check('explicit case 9', solve([[['1/2', 2], [8, 2], [8, 5]]], 8), [[['1/2', '2'], ['8', '2'], ['8', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 8), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [10, 3], [8, 4], [7, 1]]], 8), [[['3', '1'], ['8', '17/7'], ['8', '4'], ['7', '1']]])
if N == 4:
    check('explicit case 0', solve([[[1, 1], [8, 1], [8, 8], [1, 8]]], 9), [[['1', '1'], ['8', '1'], ['8', '8'], ['1', '8']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 9), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [11, 2], [2, 4]]], 9), [[['1', '1'], ['9', '9/5'], ['9', '22/9'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [11, -2], [11, 11], [-2, 11]]], 9), [[['0', '9'], ['0', '0'], ['9', '0'], ['9', '9']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 9), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 9), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 9), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 9), [[]])
    check('explicit case 8', solve([[[1, 1], [10, 1], [1, 12]]], 9), [[['1', '9'], ['1', '1'], ['9', '1'], ['9', '20/9'], ['38/11', '9']]])
    check('explicit case 9', solve([[['1/2', 2], [9, 2], [9, 5]]], 9), [[['1/2', '2'], ['9', '2'], ['9', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 9), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [11, 3], [9, 4], [8, 1]]], 9), [[['3', '1'], ['9', '5/2'], ['9', '4'], ['8', '1']]])
if N == 5:
    check('explicit case 0', solve([[[1, 1], [9, 1], [9, 9], [1, 9]]], 10), [[['1', '1'], ['9', '1'], ['9', '9'], ['1', '9']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 10), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [12, 2], [2, 4]]], 10), [[['1', '1'], ['10', '20/11'], ['10', '12/5'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [12, -2], [12, 12], [-2, 12]]], 10), [[['0', '10'], ['0', '0'], ['10', '0'], ['10', '10']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 10), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 10), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 10), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 10), [[]])
    check('explicit case 8', solve([[[1, 1], [11, 1], [1, 13]]], 10), [[['1', '10'], ['1', '1'], ['10', '1'], ['10', '11/5'], ['7/2', '10']]])
    check('explicit case 9', solve([[['1/2', 2], [10, 2], [10, 5]]], 10), [[['1/2', '2'], ['10', '2'], ['10', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 10), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [12, 3], [10, 4], [9, 1]]], 10), [[['3', '1'], ['10', '23/9'], ['10', '4'], ['9', '1']]])
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:
Vertical-boundary intersections add the previous-vertex parameter to the current vertex y coordinate.

Each command is a polygon vertex list with exact coordinates. It is clipped in continuous raster coordinates against x>=0, x<=size, y>=0 and y<=size in that order with Sutherland-Hodgman: each stage walks edges from the previous vertex to the current vertex, emits the boundary intersection when entering before the inside vertex, emits the intersection when leaving, and chains its output into the next stage. Boundary points are inside. Cyclically repeated consecutive vertices are then removed; fewer than three remaining vertices yields an empty polygon. Vertices are returned as exact rational strings.

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(commands, size):
    def stage(poly,inside,cross):
        res=[]
        for i in range(len(poly)):
            cur=poly[i]
            prev=poly[i-1]
            if inside(cur):
                if not inside(prev): res.append(cross(prev,cur))
                res.append(cur)
            elif inside(prev):
                res.append(cross(prev,cur))
        return res
    def at_x(k):
        return lambda p,c: (Fraction(k),p[1]+(c[1]-p[1])*(k-p[0])/(c[0]-p[0]))
    def at_y(k):
        return lambda p,c: (p[0]+(c[0]-p[0])*(k-p[1])/(c[1]-p[1]),Fraction(k))
    out=[]
    for poly in commands:
        src=[(Fraction(x),Fraction(y)) for x,y in poly]
        pts=stage(src,lambda p:p[0]>=0,at_x(0))
        pts=stage(pts,lambda p:p[0]<=size,at_x(size))
        pts=stage(src,lambda p:p[1]>=0,at_y(0))
        pts=stage(pts,lambda p:p[1]<=size,at_y(size))
        clean=[p for i,p in enumerate(pts) if p!=pts[i-1]]
        if len(clean)<3: clean=[]
        out.append([[str(x),str(y)] for x,y in clean])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('explicit case 0', solve([[[1, 1], [5, 1], [5, 5], [1, 5]]], 6), [[['1', '1'], ['5', '1'], ['5', '5'], ['1', '5']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 6), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [8, 2], [2, 4]]], 6), [[['1', '1'], ['6', '12/7'], ['6', '8/3'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [8, -2], [8, 8], [-2, 8]]], 6), [[['0', '6'], ['0', '0'], ['6', '0'], ['6', '6']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 6), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 6), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 6), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 6), [[]])
    check('explicit case 8', solve([[[1, 1], [7, 1], [1, 9]]], 6), [[['1', '6'], ['1', '1'], ['6', '1'], ['6', '7/3'], ['13/4', '6']]])
    check('explicit case 9', solve([[['1/2', 2], [6, 2], [6, 5]]], 6), [[['1/2', '2'], ['6', '2'], ['6', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 6), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [8, 3], [6, 4], [5, 1]]], 6), [[['3', '1'], ['6', '11/5'], ['6', '4'], ['5', '1']]])
if N == 2:
    check('explicit case 0', solve([[[1, 1], [6, 1], [6, 6], [1, 6]]], 7), [[['1', '1'], ['6', '1'], ['6', '6'], ['1', '6']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 7), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [9, 2], [2, 4]]], 7), [[['1', '1'], ['7', '7/4'], ['7', '18/7'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [9, -2], [9, 9], [-2, 9]]], 7), [[['0', '7'], ['0', '0'], ['7', '0'], ['7', '7']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 7), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 7), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 7), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 7), [[]])
    check('explicit case 8', solve([[[1, 1], [8, 1], [1, 10]]], 7), [[['1', '7'], ['1', '1'], ['7', '1'], ['7', '16/7'], ['10/3', '7']]])
    check('explicit case 9', solve([[['1/2', 2], [7, 2], [7, 5]]], 7), [[['1/2', '2'], ['7', '2'], ['7', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 7), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [9, 3], [7, 4], [6, 1]]], 7), [[['3', '1'], ['7', '7/3'], ['7', '4'], ['6', '1']]])
if N == 3:
    check('explicit case 0', solve([[[1, 1], [7, 1], [7, 7], [1, 7]]], 8), [[['1', '1'], ['7', '1'], ['7', '7'], ['1', '7']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 8), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [10, 2], [2, 4]]], 8), [[['1', '1'], ['8', '16/9'], ['8', '5/2'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [10, -2], [10, 10], [-2, 10]]], 8), [[['0', '8'], ['0', '0'], ['8', '0'], ['8', '8']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 8), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 8), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 8), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 8), [[]])
    check('explicit case 8', solve([[[1, 1], [9, 1], [1, 11]]], 8), [[['1', '8'], ['1', '1'], ['8', '1'], ['8', '9/4'], ['17/5', '8']]])
    check('explicit case 9', solve([[['1/2', 2], [8, 2], [8, 5]]], 8), [[['1/2', '2'], ['8', '2'], ['8', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 8), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [10, 3], [8, 4], [7, 1]]], 8), [[['3', '1'], ['8', '17/7'], ['8', '4'], ['7', '1']]])
if N == 4:
    check('explicit case 0', solve([[[1, 1], [8, 1], [8, 8], [1, 8]]], 9), [[['1', '1'], ['8', '1'], ['8', '8'], ['1', '8']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 9), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [11, 2], [2, 4]]], 9), [[['1', '1'], ['9', '9/5'], ['9', '22/9'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [11, -2], [11, 11], [-2, 11]]], 9), [[['0', '9'], ['0', '0'], ['9', '0'], ['9', '9']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 9), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 9), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 9), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 9), [[]])
    check('explicit case 8', solve([[[1, 1], [10, 1], [1, 12]]], 9), [[['1', '9'], ['1', '1'], ['9', '1'], ['9', '20/9'], ['38/11', '9']]])
    check('explicit case 9', solve([[['1/2', 2], [9, 2], [9, 5]]], 9), [[['1/2', '2'], ['9', '2'], ['9', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 9), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [11, 3], [9, 4], [8, 1]]], 9), [[['3', '1'], ['9', '5/2'], ['9', '4'], ['8', '1']]])
if N == 5:
    check('explicit case 0', solve([[[1, 1], [9, 1], [9, 9], [1, 9]]], 10), [[['1', '1'], ['9', '1'], ['9', '9'], ['1', '9']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 10), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [12, 2], [2, 4]]], 10), [[['1', '1'], ['10', '20/11'], ['10', '12/5'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [12, -2], [12, 12], [-2, 12]]], 10), [[['0', '10'], ['0', '0'], ['10', '0'], ['10', '10']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 10), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 10), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 10), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 10), [[]])
    check('explicit case 8', solve([[[1, 1], [11, 1], [1, 13]]], 10), [[['1', '10'], ['1', '1'], ['10', '1'], ['10', '11/5'], ['7/2', '10']]])
    check('explicit case 9', solve([[['1/2', 2], [10, 2], [10, 5]]], 10), [[['1/2', '2'], ['10', '2'], ['10', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 10), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [12, 3], [10, 4], [9, 1]]], 10), [[['3', '1'], ['10', '23/9'], ['10', '4'], ['9', '1']]])
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
from fractions import Fraction
N = 1
observations = []
def solve(commands, size):
    def stage(poly,inside,cross):
        res=[]
        for i in range(len(poly)):
            cur=poly[i]
            prev=poly[i-1]
            if inside(cur):
                if not inside(prev): res.append(cross(prev,cur))
                res.append(cur)
            elif inside(prev):
                res.append(cross(prev,cur))
        return res
    def at_x(k):
        return lambda p,c: (Fraction(k),p[1]+(c[1]-p[1])*(k-p[0])/(c[0]-p[0]))
    def at_y(k):
        return lambda p,c: (p[0]+(c[0]-p[0])*(k-p[1])/(c[1]-p[1]),Fraction(k))
    out=[]
    for poly in commands:
        src=[(Fraction(x),Fraction(y)) for x,y in poly]
        pts=stage(src,lambda p:p[0]>=0,at_x(0))
        pts=stage(pts,lambda p:p[0]<=size,at_x(size))
        pts=stage(pts or src,lambda p:p[1]>=0,at_y(0))
        pts=stage(pts,lambda p:p[1]<=size,at_y(size))
        clean=[p for i,p in enumerate(pts) if p!=pts[i-1]]
        if len(clean)<3: clean=[]
        out.append([[str(x),str(y)] for x,y in clean])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('explicit case 0', solve([[[1, 1], [5, 1], [5, 5], [1, 5]]], 6), [[['1', '1'], ['5', '1'], ['5', '5'], ['1', '5']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 6), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [8, 2], [2, 4]]], 6), [[['1', '1'], ['6', '12/7'], ['6', '8/3'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [8, -2], [8, 8], [-2, 8]]], 6), [[['0', '6'], ['0', '0'], ['6', '0'], ['6', '6']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 6), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 6), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 6), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 6), [[]])
    check('explicit case 8', solve([[[1, 1], [7, 1], [1, 9]]], 6), [[['1', '6'], ['1', '1'], ['6', '1'], ['6', '7/3'], ['13/4', '6']]])
    check('explicit case 9', solve([[['1/2', 2], [6, 2], [6, 5]]], 6), [[['1/2', '2'], ['6', '2'], ['6', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 6), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [8, 3], [6, 4], [5, 1]]], 6), [[['3', '1'], ['6', '11/5'], ['6', '4'], ['5', '1']]])
if N == 2:
    check('explicit case 0', solve([[[1, 1], [6, 1], [6, 6], [1, 6]]], 7), [[['1', '1'], ['6', '1'], ['6', '6'], ['1', '6']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 7), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [9, 2], [2, 4]]], 7), [[['1', '1'], ['7', '7/4'], ['7', '18/7'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [9, -2], [9, 9], [-2, 9]]], 7), [[['0', '7'], ['0', '0'], ['7', '0'], ['7', '7']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 7), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 7), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 7), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 7), [[]])
    check('explicit case 8', solve([[[1, 1], [8, 1], [1, 10]]], 7), [[['1', '7'], ['1', '1'], ['7', '1'], ['7', '16/7'], ['10/3', '7']]])
    check('explicit case 9', solve([[['1/2', 2], [7, 2], [7, 5]]], 7), [[['1/2', '2'], ['7', '2'], ['7', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 7), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [9, 3], [7, 4], [6, 1]]], 7), [[['3', '1'], ['7', '7/3'], ['7', '4'], ['6', '1']]])
if N == 3:
    check('explicit case 0', solve([[[1, 1], [7, 1], [7, 7], [1, 7]]], 8), [[['1', '1'], ['7', '1'], ['7', '7'], ['1', '7']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 8), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [10, 2], [2, 4]]], 8), [[['1', '1'], ['8', '16/9'], ['8', '5/2'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [10, -2], [10, 10], [-2, 10]]], 8), [[['0', '8'], ['0', '0'], ['8', '0'], ['8', '8']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 8), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 8), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 8), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 8), [[]])
    check('explicit case 8', solve([[[1, 1], [9, 1], [1, 11]]], 8), [[['1', '8'], ['1', '1'], ['8', '1'], ['8', '9/4'], ['17/5', '8']]])
    check('explicit case 9', solve([[['1/2', 2], [8, 2], [8, 5]]], 8), [[['1/2', '2'], ['8', '2'], ['8', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 8), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [10, 3], [8, 4], [7, 1]]], 8), [[['3', '1'], ['8', '17/7'], ['8', '4'], ['7', '1']]])
if N == 4:
    check('explicit case 0', solve([[[1, 1], [8, 1], [8, 8], [1, 8]]], 9), [[['1', '1'], ['8', '1'], ['8', '8'], ['1', '8']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 9), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [11, 2], [2, 4]]], 9), [[['1', '1'], ['9', '9/5'], ['9', '22/9'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [11, -2], [11, 11], [-2, 11]]], 9), [[['0', '9'], ['0', '0'], ['9', '0'], ['9', '9']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 9), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 9), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 9), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 9), [[]])
    check('explicit case 8', solve([[[1, 1], [10, 1], [1, 12]]], 9), [[['1', '9'], ['1', '1'], ['9', '1'], ['9', '20/9'], ['38/11', '9']]])
    check('explicit case 9', solve([[['1/2', 2], [9, 2], [9, 5]]], 9), [[['1/2', '2'], ['9', '2'], ['9', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 9), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [11, 3], [9, 4], [8, 1]]], 9), [[['3', '1'], ['9', '5/2'], ['9', '4'], ['8', '1']]])
if N == 5:
    check('explicit case 0', solve([[[1, 1], [9, 1], [9, 9], [1, 9]]], 10), [[['1', '1'], ['9', '1'], ['9', '9'], ['1', '9']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 10), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [12, 2], [2, 4]]], 10), [[['1', '1'], ['10', '20/11'], ['10', '12/5'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [12, -2], [12, 12], [-2, 12]]], 10), [[['0', '10'], ['0', '0'], ['10', '0'], ['10', '10']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 10), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 10), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 10), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 10), [[]])
    check('explicit case 8', solve([[[1, 1], [11, 1], [1, 13]]], 10), [[['1', '10'], ['1', '1'], ['10', '1'], ['10', '11/5'], ['7/2', '10']]])
    check('explicit case 9', solve([[['1/2', 2], [10, 2], [10, 5]]], 10), [[['1/2', '2'], ['10', '2'], ['10', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 10), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [12, 3], [10, 4], [9, 1]]], 10), [[['3', '1'], ['10', '23/9'], ['10', '4'], ['9', '1']]])
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:
The bottom stage restarts from the unclipped source polygon, discarding the left and right clipping.

Each command is a polygon vertex list with exact coordinates. It is clipped in continuous raster coordinates against x>=0, x<=size, y>=0 and y<=size in that order with Sutherland-Hodgman: each stage walks edges from the previous vertex to the current vertex, emits the boundary intersection when entering before the inside vertex, emits the intersection when leaving, and chains its output into the next stage. Boundary points are inside. Cyclically repeated consecutive vertices are then removed; fewer than three remaining vertices yields an empty polygon. Vertices are returned as exact rational strings.

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(commands, size):
    def stage(poly,inside,cross):
        res=[]
        for i in range(len(poly)):
            cur=poly[i]
            prev=poly[i-1]
            if inside(cur):
                if not inside(prev): res.append(cross(prev,cur))
                res.append(cur)
            elif inside(prev):
                res.append(cross(prev,cur))
        return res
    def at_x(k):
        return lambda p,c: (Fraction(k),p[1]+(c[1]-p[1])*(k-p[0])/(c[0]-p[0]))
    def at_y(k):
        return lambda p,c: (p[0]+(c[0]-p[0])*(k-p[1])/(c[1]-p[1]),Fraction(k))
    out=[]
    for poly in commands:
        src=[(Fraction(x),Fraction(y)) for x,y in poly]
        pts=stage(src,lambda p:p[0]>=0,at_x(0))
        pts=stage(pts,lambda p:p[0]<=size-1,at_x(size-1))
        pts=stage(pts,lambda p:p[1]>=0,at_y(0))
        pts=stage(pts,lambda p:p[1]<=size,at_y(size))
        clean=[p for i,p in enumerate(pts) if p!=pts[i-1]]
        if len(clean)<3: clean=[]
        out.append([[str(x),str(y)] for x,y in clean])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('explicit case 0', solve([[[1, 1], [5, 1], [5, 5], [1, 5]]], 6), [[['1', '1'], ['5', '1'], ['5', '5'], ['1', '5']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 6), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [8, 2], [2, 4]]], 6), [[['1', '1'], ['6', '12/7'], ['6', '8/3'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [8, -2], [8, 8], [-2, 8]]], 6), [[['0', '6'], ['0', '0'], ['6', '0'], ['6', '6']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 6), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 6), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 6), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 6), [[]])
    check('explicit case 8', solve([[[1, 1], [7, 1], [1, 9]]], 6), [[['1', '6'], ['1', '1'], ['6', '1'], ['6', '7/3'], ['13/4', '6']]])
    check('explicit case 9', solve([[['1/2', 2], [6, 2], [6, 5]]], 6), [[['1/2', '2'], ['6', '2'], ['6', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 6), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [8, 3], [6, 4], [5, 1]]], 6), [[['3', '1'], ['6', '11/5'], ['6', '4'], ['5', '1']]])
if N == 2:
    check('explicit case 0', solve([[[1, 1], [6, 1], [6, 6], [1, 6]]], 7), [[['1', '1'], ['6', '1'], ['6', '6'], ['1', '6']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 7), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [9, 2], [2, 4]]], 7), [[['1', '1'], ['7', '7/4'], ['7', '18/7'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [9, -2], [9, 9], [-2, 9]]], 7), [[['0', '7'], ['0', '0'], ['7', '0'], ['7', '7']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 7), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 7), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 7), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 7), [[]])
    check('explicit case 8', solve([[[1, 1], [8, 1], [1, 10]]], 7), [[['1', '7'], ['1', '1'], ['7', '1'], ['7', '16/7'], ['10/3', '7']]])
    check('explicit case 9', solve([[['1/2', 2], [7, 2], [7, 5]]], 7), [[['1/2', '2'], ['7', '2'], ['7', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 7), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [9, 3], [7, 4], [6, 1]]], 7), [[['3', '1'], ['7', '7/3'], ['7', '4'], ['6', '1']]])
if N == 3:
    check('explicit case 0', solve([[[1, 1], [7, 1], [7, 7], [1, 7]]], 8), [[['1', '1'], ['7', '1'], ['7', '7'], ['1', '7']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 8), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [10, 2], [2, 4]]], 8), [[['1', '1'], ['8', '16/9'], ['8', '5/2'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [10, -2], [10, 10], [-2, 10]]], 8), [[['0', '8'], ['0', '0'], ['8', '0'], ['8', '8']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 8), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 8), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 8), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 8), [[]])
    check('explicit case 8', solve([[[1, 1], [9, 1], [1, 11]]], 8), [[['1', '8'], ['1', '1'], ['8', '1'], ['8', '9/4'], ['17/5', '8']]])
    check('explicit case 9', solve([[['1/2', 2], [8, 2], [8, 5]]], 8), [[['1/2', '2'], ['8', '2'], ['8', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 8), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [10, 3], [8, 4], [7, 1]]], 8), [[['3', '1'], ['8', '17/7'], ['8', '4'], ['7', '1']]])
if N == 4:
    check('explicit case 0', solve([[[1, 1], [8, 1], [8, 8], [1, 8]]], 9), [[['1', '1'], ['8', '1'], ['8', '8'], ['1', '8']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 9), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [11, 2], [2, 4]]], 9), [[['1', '1'], ['9', '9/5'], ['9', '22/9'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [11, -2], [11, 11], [-2, 11]]], 9), [[['0', '9'], ['0', '0'], ['9', '0'], ['9', '9']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 9), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 9), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 9), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 9), [[]])
    check('explicit case 8', solve([[[1, 1], [10, 1], [1, 12]]], 9), [[['1', '9'], ['1', '1'], ['9', '1'], ['9', '20/9'], ['38/11', '9']]])
    check('explicit case 9', solve([[['1/2', 2], [9, 2], [9, 5]]], 9), [[['1/2', '2'], ['9', '2'], ['9', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 9), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [11, 3], [9, 4], [8, 1]]], 9), [[['3', '1'], ['9', '5/2'], ['9', '4'], ['8', '1']]])
if N == 5:
    check('explicit case 0', solve([[[1, 1], [9, 1], [9, 9], [1, 9]]], 10), [[['1', '1'], ['9', '1'], ['9', '9'], ['1', '9']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 10), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [12, 2], [2, 4]]], 10), [[['1', '1'], ['10', '20/11'], ['10', '12/5'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [12, -2], [12, 12], [-2, 12]]], 10), [[['0', '10'], ['0', '0'], ['10', '0'], ['10', '10']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 10), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 10), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 10), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 10), [[]])
    check('explicit case 8', solve([[[1, 1], [11, 1], [1, 13]]], 10), [[['1', '10'], ['1', '1'], ['10', '1'], ['10', '11/5'], ['7/2', '10']]])
    check('explicit case 9', solve([[['1/2', 2], [10, 2], [10, 5]]], 10), [[['1/2', '2'], ['10', '2'], ['10', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 10), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [12, 3], [10, 4], [9, 1]]], 10), [[['3', '1'], ['10', '23/9'], ['10', '4'], ['9', '1']]])
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
from fractions import Fraction
N = 1
observations = []
def solve(commands, size):
    def stage(poly,inside,cross):
        res=[]
        for i in range(len(poly)):
            cur=poly[i]
            prev=poly[i-1]
            if inside(cur):
                if not inside(prev): res.append(cross(prev,cur))
                res.append(cur)
            elif inside(prev):
                res.append(cross(prev,cur))
        return res
    def at_x(k):
        return lambda p,c: (Fraction(k),p[1]+(c[1]-p[1])*(k-p[0])/(c[0]-p[0]))
    def at_y(k):
        return lambda p,c: (p[0]+(c[0]-p[0])*(k-p[1])/(c[1]-p[1]),Fraction(k))
    out=[]
    for poly in commands:
        src=[(Fraction(x),Fraction(y)) for x,y in poly]
        pts=stage(src,lambda p:p[0]>=0,at_x(0))
        pts=stage(pts,lambda p:p[0]<=size-1,at_x(size))
        pts=stage(pts,lambda p:p[1]>=0,at_y(0))
        pts=stage(pts,lambda p:p[1]<=size,at_y(size))
        clean=[p for i,p in enumerate(pts) if p!=pts[i-1]]
        if len(clean)<3: clean=[]
        out.append([[str(x),str(y)] for x,y in clean])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('explicit case 0', solve([[[1, 1], [5, 1], [5, 5], [1, 5]]], 6), [[['1', '1'], ['5', '1'], ['5', '5'], ['1', '5']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 6), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [8, 2], [2, 4]]], 6), [[['1', '1'], ['6', '12/7'], ['6', '8/3'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [8, -2], [8, 8], [-2, 8]]], 6), [[['0', '6'], ['0', '0'], ['6', '0'], ['6', '6']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 6), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 6), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 6), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 6), [[]])
    check('explicit case 8', solve([[[1, 1], [7, 1], [1, 9]]], 6), [[['1', '6'], ['1', '1'], ['6', '1'], ['6', '7/3'], ['13/4', '6']]])
    check('explicit case 9', solve([[['1/2', 2], [6, 2], [6, 5]]], 6), [[['1/2', '2'], ['6', '2'], ['6', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 6), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [8, 3], [6, 4], [5, 1]]], 6), [[['3', '1'], ['6', '11/5'], ['6', '4'], ['5', '1']]])
if N == 2:
    check('explicit case 0', solve([[[1, 1], [6, 1], [6, 6], [1, 6]]], 7), [[['1', '1'], ['6', '1'], ['6', '6'], ['1', '6']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 7), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [9, 2], [2, 4]]], 7), [[['1', '1'], ['7', '7/4'], ['7', '18/7'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [9, -2], [9, 9], [-2, 9]]], 7), [[['0', '7'], ['0', '0'], ['7', '0'], ['7', '7']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 7), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 7), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 7), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 7), [[]])
    check('explicit case 8', solve([[[1, 1], [8, 1], [1, 10]]], 7), [[['1', '7'], ['1', '1'], ['7', '1'], ['7', '16/7'], ['10/3', '7']]])
    check('explicit case 9', solve([[['1/2', 2], [7, 2], [7, 5]]], 7), [[['1/2', '2'], ['7', '2'], ['7', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 7), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [9, 3], [7, 4], [6, 1]]], 7), [[['3', '1'], ['7', '7/3'], ['7', '4'], ['6', '1']]])
if N == 3:
    check('explicit case 0', solve([[[1, 1], [7, 1], [7, 7], [1, 7]]], 8), [[['1', '1'], ['7', '1'], ['7', '7'], ['1', '7']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 8), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [10, 2], [2, 4]]], 8), [[['1', '1'], ['8', '16/9'], ['8', '5/2'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [10, -2], [10, 10], [-2, 10]]], 8), [[['0', '8'], ['0', '0'], ['8', '0'], ['8', '8']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 8), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 8), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 8), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 8), [[]])
    check('explicit case 8', solve([[[1, 1], [9, 1], [1, 11]]], 8), [[['1', '8'], ['1', '1'], ['8', '1'], ['8', '9/4'], ['17/5', '8']]])
    check('explicit case 9', solve([[['1/2', 2], [8, 2], [8, 5]]], 8), [[['1/2', '2'], ['8', '2'], ['8', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 8), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [10, 3], [8, 4], [7, 1]]], 8), [[['3', '1'], ['8', '17/7'], ['8', '4'], ['7', '1']]])
if N == 4:
    check('explicit case 0', solve([[[1, 1], [8, 1], [8, 8], [1, 8]]], 9), [[['1', '1'], ['8', '1'], ['8', '8'], ['1', '8']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 9), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [11, 2], [2, 4]]], 9), [[['1', '1'], ['9', '9/5'], ['9', '22/9'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [11, -2], [11, 11], [-2, 11]]], 9), [[['0', '9'], ['0', '0'], ['9', '0'], ['9', '9']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 9), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 9), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 9), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 9), [[]])
    check('explicit case 8', solve([[[1, 1], [10, 1], [1, 12]]], 9), [[['1', '9'], ['1', '1'], ['9', '1'], ['9', '20/9'], ['38/11', '9']]])
    check('explicit case 9', solve([[['1/2', 2], [9, 2], [9, 5]]], 9), [[['1/2', '2'], ['9', '2'], ['9', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 9), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [11, 3], [9, 4], [8, 1]]], 9), [[['3', '1'], ['9', '5/2'], ['9', '4'], ['8', '1']]])
if N == 5:
    check('explicit case 0', solve([[[1, 1], [9, 1], [9, 9], [1, 9]]], 10), [[['1', '1'], ['9', '1'], ['9', '9'], ['1', '9']]])
    check('explicit case 1', solve([[[-2, 1], [3, 1], [3, 4]]], 10), [[['0', '11/5'], ['0', '1'], ['3', '1'], ['3', '4']]])
    check('explicit case 2', solve([[[1, 1], [12, 2], [2, 4]]], 10), [[['1', '1'], ['10', '20/11'], ['10', '12/5'], ['2', '4']]])
    check('explicit case 3', solve([[[-2, -2], [12, -2], [12, 12], [-2, 12]]], 10), [[['0', '10'], ['0', '0'], ['10', '0'], ['10', '10']]])
    check('explicit case 4', solve([[[2, -3], [4, 2], [1, 3]]], 10), [[['3/2', '0'], ['16/5', '0'], ['4', '2'], ['1', '3']]])
    check('explicit case 5', solve([[[-3, 1], [-1, 1], [-2, 3]]], 10), [[]])
    check('explicit case 6', solve([[[0, 1], [0, 3], [-2, 2]]], 10), [[]])
    check('explicit case 7', solve([[[0, 0], [-1, -2], [-2, -1]]], 10), [[]])
    check('explicit case 8', solve([[[1, 1], [11, 1], [1, 13]]], 10), [[['1', '10'], ['1', '1'], ['10', '1'], ['10', '11/5'], ['7/2', '10']]])
    check('explicit case 9', solve([[['1/2', 2], [10, 2], [10, 5]]], 10), [[['1/2', '2'], ['10', '2'], ['10', '5']]])
    check('explicit case 10', solve([[[-2, 2], [2, 1], [0, 3]]], 10), [[['0', '3/2'], ['2', '1'], ['0', '3']]])
    check('explicit case 11', solve([[[3, 1], [12, 3], [10, 4], [9, 1]]], 10), [[['3', '1'], ['10', '23/9'], ['10', '4'], ['9', '1']]])
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:
The right stage clips at the last pixel center rather than the raster edge, removing the final half pixel of coverage.

Each command is a polygon vertex list with exact coordinates. It is clipped in continuous raster coordinates against x>=0, x<=size, y>=0 and y<=size in that order with Sutherland-Hodgman: each stage walks edges from the previous vertex to the current vertex, emits the boundary intersection when entering before the inside vertex, emits the intersection when leaving, and chains its output into the next stage. Boundary points are inside. Cyclically repeated consecutive vertices are then removed; fewer than three remaining vertices yields an empty polygon. Vertices are returned as exact rational strings.

split: open-access