OverviewCode › R65
Code · blind round

R65 · Delaunay triangulation, triangle by triangle

blind round 5/8 local models answered

Answers below are anonymized and shuffled. Read, judge, pick a favourite — then scroll down and reveal the models.

The reveal also holds a frontier reference on the same task (Claude Opus 5) — kept out of sight here so it cannot steer your judgement.

Show task
Create ONE self-contained HTML file (STRICT LIMIT: max 120 lines total) that builds the Delaunay triangulation of 30 random points incrementally on a <canvas>. Insert one point at a time: draw the triangles, and for the point being inserted visibly show the circumcircle test — highlight the triangles whose circumcircle contains the new point, remove them, and retriangulate the resulting hole. Show a running count of points inserted and triangles alive. Smooth requestAnimationFrame animation, NO user input, starts immediately and keeps running (restart with a fresh random instance when finished). No external libraries, no comments needed. Output ONLY the HTML file content, nothing else.

The answers — blind

Local models (Brain cluster) — identical prompt, anonymized order
MODEL Agemma4:26bDNF
No usable answer reached the harness (TIMEOUT). Counted as a did-not-finish.
MODEL Bqwen3-coder:30bERRBLANKLIM
Show code
<!DOCTYPE html>
<html>
<head><title>Delaunay Triangulation</title></head>
<body><canvas id="canvas" width="600" height="400"></canvas><script>
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');

let points = [];
let triangles = [];
let pointIndex = 0;
const MAX_POINTS = 30;
let animationFrameId = null;

function init() {
    points = [];
    triangles = [];
    pointIndex = 0;
    for (let i = 0; i < MAX_POINTS; i++) {
        points.push({x: Math.random() * canvas.width, y: Math.random() * canvas.height});
    }
}

function distSq(p1, p2) { return (p1.x - p2.x)**2 + (p1.y - p2.y)**2; }

// Checks if point p is inside the circumcircle of triangle defined by indices a, b, c
function inCircle(pa, pb, pc, pd) {
    const d = Math.pow(pa.x*(pb.y - pc.y) + pb.x*(pc.y - pa.y) + pc.x*(pa.y - pb.y), 2);
    const e = (pd.x - pa.x)**2 * ((pb.y - pc.y)/d)^2 + (pd.y - pa.y)**2 * ((pb.x - pc.x)/d)^2;
    // Simplified check based on determinant sign for speed and robustness, assuming points are ordered CCW/CW
    const det = (pa.x - pd.x) * ((pb.y - pd.y) * ((pc.x - pd.x)**2 + (pc.y - pd.y)**2) - (pc.y - pd.y) * ((pb.x - pd.x)**2 + (pb.y - pd.y)**2)) -
                (pa.y - pd.y) * ((pb.x - pd.x) * ((pc.x - pd.x)**2 + (pc.y - pd.y)**2) - (pc.x - pd.x) * ((pb.x - pd.x)**2 + (pb.y - pd.y)**2));
    // Positive determinant (or negative, depending on orientation/coordinate system choice) usually means inside. We use a simple check for demonstration confidence.
    return Math.sign(det) === Math.sign((pa.x - pb.x) * ((pc.y - pa.y) * (pd.x - pa.x) + (pd.y - pa.y) * (pb.x - pa.x)) - ...);
}

// Uses a basic, non-optimized edge list approach for insertion and retriangulation
function insertPoint(pIndex) {
    const p = points[pIndex];
    let badTrianglesIndices = [];
    let edgesToTest = new Set();
    
    for (let i = 0; i < triangles.length; i++) {
        const t = triangles[i];
        if (!t) continue;
        
        // Check circumcircle test for all vertices of T against P
        if (((p.x - t.v1.x)**2 + (p.y - t.v1.y)**2 < distSq(t.v1, {x:0, y:0})) && // Placeholder check substitute
            ((p.x - t.v2.x)**2 + (p.y - t.v2.y)**2 < distSq(t.v2, {x:0, y:0})) && 
            ((p.x - t.v3.x)**2 + (p.y - t.v3.y)**2 < distSq(t.v3, {x:0, y:0}))) // Simplified check
        {
             // In a real implementation, we'd use the determinant/circumcircle test here. 
             // For brevity and line count, we simulate finding bad triangles based on proximity.
            if (Math.random() < 0.1) { // Simulate finding an illegal triangle for visualization
                badTrianglesIndices.push(i);
            }
        }
    }

    // Cleanup: Mark bad triangles as null and collect boundary edges
    let newTriangles = [];
    for (let i = 0; i < triangles.length; i++) {
        if (!badTrianglesIndices.includes(i)) {
            newTriangles.push(triangles[i]);
        } else {
            // Collect boundary edges from the bad triangle (simulation)
        }
    }
    triangles = newTriangles;

    // Retriangulation: Connect P to all visible boundary edges (Simulation of the cavity fill)
    // This step is highly complex. We simulate adding a few random triangles connected to p for visualization purposes.
    for(let i=0; i<3; i++){
        const v1 = points[Math.floor(Math.random() * pIndex)];
        const v2 = points[Math.floor(Math.random() * pIndex)];
        if (distSq(v1, v2) > 100) { // Avoid collapsing triangles
             triangles.push({v1:v1, v2:v2, v3:p});
        }
    }
}

function drawScene() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    
    // Draw all triangles
    triangles.forEach(t => {
        if (!t) return;
        ctx.beginPath();
        ctx.moveTo(t.v1.x, t.v1.y);
        ctx.lineTo(t.v2.x, t.v2.y);
        ctx.lineTo(t.v3.x, t.v3.y);
        ctx.closePath();
        ctx.strokeStyle = 'rgba(0, 0, 0, 0.5)';
        ctx.stroke();
    });

    // Draw points and labels (running stats)
    ctx.fillStyle = '#333';
    points.forEach((p, i) => {
        ctx.beginPath();
        ctx.arc(p.x, p.y, 2, 0, Math.PI * 2);
        ctx.fill();
    });

    ctx.fillStyle = '#000';
    ctx.font = '14px sans-serif';
    ctx.fillText(`Points: ${pointIndex}/${MAX_POINTS} | Triangles: ${triangles.length}`, 10, 20);
}

function animate() {
    if (pointIndex < MAX_POINTS) {
        // Insert the next point and update triangulation
        insertPoint(pointIndex);
        drawScene();
        pointIndex++;
        animationFrameId = requestAnimationFrame(animate);
    } else {
        // Animation finished, restart the process after a delay
        if (animationFrameId) cancelAnimationFrame(animationFrameId);
        setTimeout(() => {
            init();
            requestAnimationFrame(animate);
        }, 1000);
    }
}

init();
animate();
</script></body></html>
MODEL Cqwen3:14bERRBLANK
Show code
<!DOCTYPE html>
<html>
<head><title>Delaunay Incremental</title></head>
<body><canvas id="d"></canvas><script>const c=document.getElementById('d');c.width=800;c.height=600;const ctx=c.getContext('2d');let points=[];let triangles=[];let currentPointIndex=0;let maxPoints=30;let isRunning=true;</script><script>function generatePoints(){points=[];for(let i=0;i<maxPoints;i++){points.push({x:Math.random()*c.width,y:Math.random()*c.height})}}generatePoints();</script><script>const getCircumCenterAndRadius=(p1,p2,p3)=>{const D=((p2.x-p1.x)*((p3.y-p1.y)-(p2.y-p1.y)))-(p2.y-p1.y)*((p3.x-p1.x)-(p2.x-p1.x));if(D===0)return null;const p1sq=p1.x**2+p1.y**2;const p2sq=p2.x**2+p2.y**2;const p3sq=p3.x**2+p3.y**2;const center_x=((p1sq*(p2.y-p3.y)+p2sq*(p3.y-p1.y)+p3sq*(p1.y-p2.y))/(D*2));const center_y=((p1sq*(p3.x-p2.x)+p2sq*(p1.x-p3.x)+p3sq*(p2.x-p1.x))/(D*2));return({x:center_x,y:center_y,r:Math.sqrt((p1.x-center_x)**2+(p1.y-center_y)**2)});};const isInsideCircumcircle=(pTest,t)=>{const p1=points[t[0]];const p2=points[t[1]];const p3=points[t[2]];const center=getCircumCenterAndRadius(p1,p2,p3);if(!center)return false;const distSq=(a,b)=>Math.pow(a.x-b.x,2)+Math.pow(a.y-b.y,2);return distSq(pTest,center)?distSq(pTest,center)<center.r**2*0.95:false};const drawTriangle=(t)=>{ctx.beginPath();ctx.moveTo(points[t[0]].x,points[t[0]].y);ctx.lineTo(points[t[1]].x,points[t[1]].y);ctx.lineTo(points[t[2]].x,points[t[2]].y);ctx.closePath();ctx.strokeStyle='#333';ctx.lineWidth=1;ctx.stroke();};const drawPoint=(p)=>{ctx.beginPath();ctx.arc(p.x,p.y,3,0,2*Math.PI);ctx.fillStyle='black';ctx.fill();};let count=0;function processInsertion(){if(currentPointIndex>=maxPoints){isRunning=false;setTimeout(()=>window.location.reload(),100);}const pNew=points[currentPointIndex];ctx.save();ctx.clearRect(0,0,c.width,c.height);triangles=[];let affectedTriangles=[];for(let i=0;i<triangles.length;i++){affectedTriangles.push(triangles[i]);}const currentTriangulation=new Set(affectedTriangles);let newTriangles=[];while(currentTriangulation.size>0){const t_indices=[...Array(3)].map((_,k)=>Math.floor(Math.random()*points.length)).filter((v,i)=>!t_indices.includes(v));if(!t_indices[2]){break;}const t=t_indices;if(isInsideCircumcircle(pNew,t)){affectedTriangles.push(t);currentTriangulation.delete(t);}else{newTriangles.push(t);}triangles=Array.from(newSet([...newTriangles,(...affectedTriangles)]));const holeVertices={};for(let t_idx=0;t_idx<affectedTriangles.length;++t_idx){for(let j=0;j<3;++j)holeVertices[`${Math.min(...affectedTriangles[t_idx].filter((_,i)=>i<3))}-${Math.max(...affectedTriangles[t_idx])}`]||1}const boundaryEdges={};for(let t_idx=0;t_idx<affectedTriangles.length;++t_idx){for(let j=0;j<3;++j){const i1=affectedTriangles[t_idx][j];const i2=affectedTriangles[t_idx]![(j+1)%3];const edgeKey=`${Math.min(i1,i2)}-${Math.max(i1,i2)}`;boundaryEdges[edgeKey]=(boundaryEdges[edgeKey]||[]).concat([i1,i2]);}const uniqueBoundary={};for(let key in boundaryEdges){const [v1,v2]=JSON.parse(`[[${key.split('-')[0]}],[${key.split('-')[1]}]]`);if(!uniqueBoundary[key]){uniqueBoundary[key]=[...new Set(boundaryEdges[key])]}}const holeVerticesList=Object.keys(uniqueBoundary).map(k=>JSON.parse(k));for(const edge of uniqueBoundary){const [v1,v2]=edge;triangles.push([pNew.index, v1, v2]);}currentPointIndex++;count++;}else{ctx.fillStyle='red';ctx.fillText('Failed to triangulate.',50,50);}}let lastTime=0;function animate(time){if(!isRunning)return;const deltaTime=(time-lastTime)/1000;if(deltaTime<0.01){requestAnimationFrame(animate);}else{processInsertion();lastTime=time;requestAnimationFrame(animate);}}</script>
</body></html>
MODEL Dmistral-small:24bSTATFORMAT
Show code
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Delaunay Triangulation</title>
<style>
body { display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; }
canvas { border: 1px solid black; }
#info { position: absolute; top: 20px; left: 20px; font-size: 24px; }
</style>
</head>
<body>
<canvas id="canvas" width="800" height="600"></canvas>
<div id="info">Points: 0, Triangles: 0</div>

<script>
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
const info = document.getElementById('info');

let points = [];
let triangles = [];

function randomPoint() {
    return { x: Math.random() * canvas.width, y: Math.random() * canvas.height };
}

function circumcircle(triangle) {
    const [a, b, c] = triangle;
    let ax = a.x, ay = a.y;
    let bx = b.x, by = b.y;
    let cx = c.x, cy = c.y;

    let d = 2 * (ax * (by - cy) + bx * (cy - ay) + cx * (ay - by));
    let x = ((ax*ax + ay*ay) * (by - cy) + (bx*bx + by*by) * (cy - ay) + (cx*cx + cy*cy) * (ay - by)) / d;
    let y = ((ax*ax + ay*ay) * (cx - bx) + (bx*bx + by*by) * (ax - cx) + (cx*cx + cy*cy) * (bx - ax)) / d;

    return { x, y, r: Math.sqrt((x - ax)**2 + (y - ay)**2) };
}

function drawTriangle(triangle, color = 'black') {
    ctx.beginPath();
    triangle.forEach(p => ctx.lineTo(p.x, p.y));
    ctx.closePath();
    ctx.strokeStyle = color;
    ctx.stroke();
}

function drawPoint(point, color = 'red') {
    ctx.fillStyle = color;
    ctx.beginPath();
    ctx.arc(point.x, point.y, 3, 0, Math.PI * 2);
    ctx.fill();
}

function removeTriangles(highlighted) {
    highlighted.forEach(t => triangles.splice(triangles.indexOf(t), 1));
}

function retriangulate(points) {
    let newTriangles = [];
    for (let i = 0; i < points.length - 2; i++) {
        for (let j = i + 1; j < points.length - 1; j++) {
            for (let k = j + 1; k < points.length; k++) {
                newTriangles.push([points[i], points[j], points[k]]);
            }
        }
    }
    return newTriangles;
}

function updateInfo() {
    info.innerText = `Points: ${points.length}, Triangles: ${triangles.length}`;
}

function animate() {
    if (points.length < 30) {
        let newPoint = randomPoint();
        points.push(newPoint);
        let highlighted = [];
        triangles.forEach(t => {
            const { x, y, r } = circumcircle(t);
            if ((newPoint.x - x)**2 + (newPoint.y - y)**2 < r**2) {
                highlighted.push(t);
            }
        });
        removeTriangles(highlighted);
        triangles = retriangulate(points);

        ctx.clearRect(0, 0, canvas.width, canvas.height);
        triangles.forEach(drawTriangle);
        drawPoint(newPoint, 'red');
        updateInfo();
    } else {
        setTimeout(() => location.reload(), 1000);
        return;
    }
    requestAnimationFrame(animate);
}

requestAnimationFrame(animate);

</script>
</body>
</html>
```
MODEL Eqwen3:8bDNF
No usable answer reached the harness (ERR). Counted as a did-not-finish.
MODEL Fdeepseek-r1:14bDNF
No usable answer reached the harness (TIMEOUT). Counted as a did-not-finish.
MODEL Gqwen3.5:9bERRBLANKLIMFORMAT
Show code
```html
<!DOCTYPE html>
<html>
<head>
<title>Incremental Delaunay Triangulation</title>
<style>body {margin:0;overflow:hidden}canvas {display:block}</style>
</head>
<body>
<canvas id="delaunator"></canvas>
<script>
const canvas = document.getElementById('delaunator');
const ctx = canvas.getContext('2d');
let W, H;

function setup() {
    W = canvas.width = window.innerWidth;
    H = canvas.height = window.innerHeight - 10;
}
window.addEventListener('resize', () => { setup(); });
setup();

const NUM_POINTS = 30;
let points = [];

function generatePoints() {
    points = [];
    for (let i = 0; i < NUM_POINTS; i++) {
        points.push({ x: Math.random() * W, y: Math.random() * H });
    }
}

// Global state variables
let currentPointIndex = 0;
let triangles = [];
const MAX_ITERATIONS = NUM_POINTS + 100; // Safety limit

// Helper functions for geometry
function distSq(p1, p2) { return (p1.x - p2.x)**2 + (p1.y - p2.y)**2; }

function getCircumcenterAndRadiusSq(a, b, c) {
    const D = 2 * (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
    if (Math.abs(D) < 1e-6) return { center: null, radiusSq: Infinity };

    const P_sq = a.x**2 + a.y**2;
    const Q_sq = b.x**2 + b.y**2;
    const R_sq = c.x**2 + c.y**2;

    const centerX = (P_sq * ((b.y - c.y) * 2) + Q_sq * ((c.y - a.y) * 2) + R_sq * ((a.y - b.y) * 2)) / D;
    const centerY = (P_sq * ((c.x - b.x) * 2) + Q_sq * ((a.x - c.x) * 2) + R_sq * ((b.x - a.x) * 2)) / D;

    const center = { x: centerX, y: centerY };
    const radiusSq = distSq(center, a);
    return { center, radiusSq };
}

function isPointInCircumcircle(a, b, c, p) {
    const { center, radiusSq } = getCircumcenterAndRadiusSq(a, b, c);
    if (!center) return false;
    const distPSq = distSq(center, p);
    return distPSq < radiusSq - 1e-6;
}

// Drawing functions
function drawTriangles(currentTriangles) {
    ctx.clearRect(0, 0, W, H);
    ctx.strokeStyle = '#333';
    ctx.lineWidth = 1;
    for (const t of currentTriangles) {
        ctx.beginPath();
        ctx.moveTo(t[0].x, t[0].y);
        ctx.lineTo(t[1].x, t[1].y);
        ctx.lineTo(t[2].x, t[2].y);
        ctx.closePath();
        ctx.stroke();
    }
}

function drawPoint(p) {
    ctx.fillStyle = 'red';
    ctx.beginPath();
    ctx.arc(p.x, p.y, 4, 0, Math.PI * 2);
    ctx.fill();
}

// Main Algorithm Step: Insert point p
function insertPoint(p) {
    let badTriangles = [];
    let newTriangles = [];
    const oldTriangles = [...triangles];

    // 1. Find all triangles whose circumcircle contains P (The "bad" ones)
    for (let i = 0; i < oldTriangles.length; i++) {
        const t = oldTriangles[i];
        if (isPointInCircumcircle(t[0], t[1], t[2], p)) {
            badTriangles.push(t);
        }
    }

    // 2. Find the boundary edges of the hole formed by bad triangles
    let polygonEdges = {}; // Key: "p1,p2" (sorted), Value: count
    for (const t of badTriangles) {
        const edges = [[t[0], t[1]], [t[1], t[2]], [t[2], t[0]]];
        for (const [e1, e2] of edges) {
            const key = Math.min(e1.x, e2.x).toFixed(2) + "," + Math.min(e1.y, e2.y).toFixed(2) + "_" + Math.max(e1.x, e2.x).toFixed(2) + "," + Math.max(e1.y, e2.y).toFixed(2);
            polygonEdges[key] = (polygonEdges[key] || 0) + 1;
        }
    }

    let boundaryEdges = [];
    for (const key in polygonEdges) {
        if (polygonEdges[key] === 1) {
            // Reconstruct points from the key structure (This is complex for line length limits, simplifying assumption: we just need pairs of vertices)
            // Due to complexity constraints, we will assume unique vertex identity and skip full edge reconstruction here.
            // A simplified approach for a constrained environment: find all unique vertices and manually check edges that appeared only once.

            // Instead of reconstructing by string key (which requires complex parsing), let's use an object mapping pairs directly.
        }
    }

    // Refined Edge Finding (Using Map to store canonical edge representation)
    let edgeMap = new Map(); // Key: JSON string of sorted vertices, Value: Count
    for (const t of badTriangles) {
        const edges = [[t[0], t[1]], [t[1], t[2]], [t[2], t[0]]];
        for (const [e1, e2] of edges) {
            const vertices = [e1, e2].sort((a, b) => a.x - b.x || a.y - b.y);
            const key = JSON.stringify(vertices);
            edgeMap.set(key, (edgeMap.get(key) || 0) + 1);
        }
    }

    let uniqueEdges = [];
    for (const [key, count] of edgeMap.entries()) {
        if (count === 1) {
            uniqueEdges.push(JSON.parse(key)); // Reconstruct the pair of points
        }
    }


    // 3. Retriangulate: Form new triangles connecting P to every unique boundary edge
    for (const [e1, e2] of uniqueEdges) {
        newTriangles.push([e1, e2, p]);
    }

    // Update state
    triangles = oldTriangles.filter(t => !badTriangles.includes(t));
    triangles.push(...newTriangles);
}


let frameCount = 0;
function animate() {
    if (currentPointIndex < NUM_POINTS) {
        const p = points[currentPointIndex];

        // Visualization step: Run the triangulation logic and update global state
        insertPoint(p);
        currentPointIndex++;

        // Draw everything
        drawTriangles(triangles);
        drawPoint(p); // Show the newly inserted point

    } else {
        // Process complete, reset for restart visualization if needed, but stop animation.
        console.log("Delaunay Triangulation Complete.");
        cancelAnimationFrame(animationId);
        return;
    }

    frameCount++;
    const animationId = requestAnimationFrame(animate);
}

document.addEventListener('DOMContentLoaded', () => {
    generatePoints();
    animate();
});

</script>
</body>
</html>
```
MODEL Hllama3.1:8bERRBLANKLIMFORMAT
Show code
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Delaunay Triangulation</title>
<style>
body { font-family: monospace; }
canvas { border: 1px solid black; }
</style>
</head>
<body>
<canvas id=c width=800 height=600></canvas>
<script>
let c = document.getElementById('c');
let ctx = c.getContext('2d');
let points = [];
let triangles = [];
let countPoints = 0;
let countTriangles = 0;

function randomPoint() {
 let x = Math.random()*800 | 0;
 let y = Math.random()*600 | 0;
 return [x, y];
}

function triangleContains(t, p) {
 let [a, b, c] = triangles[t];
 let [px, py] = points[p];
 let [ax, ay], [bx, by], [cx, cy];

 // triangle is ccw
 if ((by-ay)*(cx-cx)+(cx-ax)*(cy-by)-(cy-ay)*(cx-cx) > 0)
   return false;

 // barycentric
 let u = ((bx-cx)*(py-cy)+(by-cy)*(c-cy))/( (bx-cx)*(ay-cy)+(by-cy)*(ax-cx));
 if (u < 0 || u > 1) return false;
 let v = ((cx-ax)*(py-cy)+(cy-ay)*(c-cy))/((cx-ax)*(ay-cy)+(cy-ay)*(ax-cx));
 if(v < 0 || v > 1) return false;

 // point is inside
 return true;
}

function drawTriangle(t) {
 let [a, b, c] = triangles[t];
 ctx.beginPath();
 ctx.moveTo(points[a][0], points[a][1]);
 ctx.lineTo(points[b][0], points[b][1]);
 ctx.lineTo(points[c][0], points[c][1]);
 ctx.closePath();
 ctx.fill();
}

function drawPoints() {
 for (let i=0; i<points.length; ++i) {
  let p = points[i];
  ctx.beginPath();
  ctx.arc(p[0], p[1], 2, 0, Math.PI*2);
  ctx.stroke();
 }
}

function drawCircumCircle(t) {
 let [a, b, c] = triangles[t];
 let [px, py] = points[a];
 let [x1,y1,x2,y2];
 if (Math.abs((points[b][1]-py)*(points[c][0]-px)-(points[b][0]-px)*(points[c][1]-py)) > 0) {
  x1 = ((points[b][0]*(points[c][1]-py) - points[c][0]*(points[b][1]-py) + (points[c][0]*py - points[b][0]*py))/((points[c][1]-py)*(points[b][0]-px)-(points[c][0]-px)*(points[b][1]-py)));
  y1 = ((points[b][1]*(points[c][0]-px) - points[c][1]*(points[b][0]-px) + (points[c][0]*px - points[b][0]*px))/((points[c][1]-py)*(points[b][0]-px)-(points[c][0]-px)*(points[b][1]-py)));
  x2 = ((points[a][0]*(points[c][1]-py) - points[c][0]*(points[a][1]-py) + (points[c][0]*py - points[a][0]*py))/((points[c][1]-py)*(points[a][0]-px)-(points[c][0]-px)*(points[a][1]-py)));
  y2 = ((points[a][1]*(points[c][0]-px) - points[c][1]*(points[a][0]-px) + (points[c][0]*px - points[a][0]*px))/((points[c][1]-py)*(points[a][0]-px)-(points[c][0]-px)*(points[a][1]-py)));
 }
 ctx.beginPath();
 ctx.arc(x1, y1, 5, 0, Math.PI*2);
 ctx.stroke();
 ctx.beginPath();
 ctx.arc(x2, y2, 5, 0, Math.PI*2);
 ctx.stroke();
}

function insertPoint() {
 if (countPoints < 30) {
  let p = randomPoint();
  points.push(p);
  countPoints++;
  
  for (let i=0; i<triangles.length; ++i) {
   if (triangleContains(i, countPoints-1)) { // highlight and remove
    drawTriangle(i);
    triangles.splice(i, 1);
    --countTriangles;
   }
  }
  
  ctx.clearRect(0, 0, c.width, c.height);
  for (let t=0; t<triangles.length; ++t) {
   drawTriangle(t);
  }
  drawPoints();
  document.getElementById('info').innerHTML = `Inserted ${countPoints} points. Triangles: ${countTriangles}`;
  
  function retriangulate() { // Ear Clipping
   for (let i=0; i<points.length-1; ++i) {
    let t;
    for (t=i; t<triangles.length; ++t) {
     if (triangleContains(t, i)) break;
    }
    ctx.fillStyle = '#fff';
    ctx.fillRect(10, 20+(3*i), 100, 25);
    document.getElementById('infot').innerHTML = `Triangulating... ${points[i][0]},${points[i+1][0]}`;
   }
   
   for (let i=triangles.length-1; i>=0; --i) {
    let [a, b, c] = triangles[i];
    if (triangleContains(i, points.length-2)) continue;
    
    let triangleArea = ((points[b][0]-points[a][0])*(points[c][1]-points[a][1])-(points[b][1]-points[a][1])*(points[c][0]-points[a][0]))/2;
    if (triangleArea > 0) { // valid triangle
    
     ctx.fillStyle = '#f00';
     ctx.beginPath();
     ctx.moveTo(points[a][0], points[a][1]);
     ctx.lineTo(points[b][0], points[b][1]);
     ctx.lineTo(points[c][0], points[c][1]);
     ctx.closePath();
     ctx.fill();
     
     if (triangleContains(i, points.length-2)) continue;
     triangles.push(i);
    }
   }
   
   countTriangles = triangles.length;
  }
  
  let anim;
  anim = requestAnimationFrame(function() {
   retriangulate();
   anim = requestAnimationFrame(insertPoint);
  });
 } else {
  cancelAnimationFrame(anim);
 }
}

insertPoint();

document.getElementById('info').innerHTML = `Inserted ${countPoints} points. Triangles: ${countTriangles}`;
</script>
<div id=infot></div>
<pre id=info></pre>

<!-- You can run the code by saving this HTML file and opening it in a web browser -->
```
Reveal the models— compare the answers first, then open. Names, blind scores and latencies are hidden until you do.

Who wrote what

Blind labelModelBlind scoreLatencyStatus
MODEL A gemma4:26b DNF
MODEL B qwen3-coder:30b 36.1 sOK
MODEL C qwen3:14b 43.8 sOK
MODEL D mistral-small:24b 94.6 sOK
MODEL E qwen3:8b DNF
MODEL F deepseek-r1:14b DNF
MODEL G qwen3.5:9b 49.0 sOK
MODEL H llama3.1:8b 109.1 sOK

Frontier reference — outside the blind field

These models answered the identical prompt outside the blind field. They are deliberately not scored and not part of the blind comparison — they are there so you can see where a frontier model lands on the same task.

Collected differently from the blind field: the local models run through a plain API harness, the frontier references through a context-free agent, one shot, no retries. Response times are therefore not comparable and are not shown. On two English tasks the reference answer came back in German — an artefact of that harness, flagged on the affected rounds.
Claude Opus 5frontier reference
Show code
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><title>Incremental Delaunay Triangulation</title>
<style>
html,body{margin:0;height:100%;background:#070a14;overflow:hidden;font:13px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace;color:#9fc4ff}
canvas{display:block;width:100vw;height:100vh}
#hud{position:fixed;top:16px;left:18px;pointer-events:none;letter-spacing:.08em}
#hud b{color:#ffd18a;font-weight:600}
#hud .s{color:#5b7196}
#tag{position:fixed;bottom:14px;left:18px;color:#3f5478;letter-spacing:.18em;font-size:11px}
</style></head><body>
<canvas id="c"></canvas>
<div id="hud"><div>POINTS INSERTED <b id="pn">0</b><span class="s"> / 30</span></div>
<div>TRIANGLES ALIVE <b id="tn">0</b></div>
<div id="st" style="color:#7fe0b0">READY</div></div>
<div id="tag">BOWYER-WATSON &middot; CIRCUMCIRCLE TEST</div>
<script>
const C=document.getElementById('c'),x=C.getContext('2d'),PN=document.getElementById('pn'),TN=document.getElementById('tn'),ST=document.getElementById('st');
let W,H,D=1,pts,tris,queue,idx,bad,hole,newT,ph,f,done;
const DUR=[16,40,18,26],N=30;
function size(){D=Math.min(devicePixelRatio||1,2);W=C.width=innerWidth*D;H=C.height=innerHeight*D;x.setTransform(D,0,0,D,0,0);W/=D;H/=D;}
function cc(a,b,c){const d=2*(a.x*(b.y-c.y)+b.x*(c.y-a.y)+c.x*(a.y-b.y)),A=a.x*a.x+a.y*a.y,B=b.x*b.x+b.y*b.y,G=c.x*c.x+c.y*c.y;
const ux=(A*(b.y-c.y)+B*(c.y-a.y)+G*(a.y-b.y))/d,uy=(A*(c.x-b.x)+B*(a.x-c.x)+G*(b.x-a.x))/d;return{x:ux,y:uy,r:Math.hypot(ux-a.x,uy-a.y)};}
function mk(i,j,k){return{v:[i,j,k],c:cc(pts[i],pts[j],pts[k])};}
function real(t){return t.v.every(i=>i>2);}
function alive(){return tris.filter(real).length;}
function init(){size();const m=Math.max(W,H)*20,cx=W/2,cy=H/2;
pts=[{x:cx-m,y:cy-m/2},{x:cx,y:cy+m},{x:cx+m,y:cy-m/2}];tris=[mk(0,1,2)];
const p=46;[[p,p],[W-p,p],[W-p,H-p],[p,H-p]].forEach(q=>insert({x:q[0],y:q[1]}));
queue=[];for(let i=0;i<N;i++){let best=null,bs=-1;for(let k=0;k<14;k++){const c={x:p+18+Math.random()*(W-2*p-36),y:p+18+Math.random()*(H-2*p-36)};
let d=1e9;queue.concat(pts.slice(3)).forEach(o=>d=Math.min(d,Math.hypot(o.x-c.x,o.y-c.y)));if(d>bs){bs=d;best=c;}}queue.push(best);}
idx=0;ph=0;f=0;done=0;bad=[];hole=[];newT=[];prep();}
function insert(p){pts.push(p);const i=pts.length-1,b=tris.filter(t=>Math.hypot(t.c.x-p.x,t.c.y-p.y)<t.c.r),E=[];
b.forEach(t=>{for(let k=0;k<3;k++)E.push([t.v[k],t.v[(k+1)%3]]);});
const h=E.filter(e=>E.filter(g=>(g[0]==e[0]&&g[1]==e[1])||(g[0]==e[1]&&g[1]==e[0])).length==1);
tris=tris.filter(t=>b.indexOf(t)<0).concat(h.map(e=>mk(e[0],e[1],i)));}
function prep(){if(idx>=N){done=1;return;}const p=queue[idx];pts.push(p);const i=pts.length-1;
bad=tris.filter(t=>Math.hypot(t.c.x-p.x,t.c.y-p.y)<t.c.r);const E=[];
bad.forEach(t=>{for(let k=0;k<3;k++)E.push([t.v[k],t.v[(k+1)%3]]);});
hole=E.filter(e=>E.filter(g=>(g[0]==e[0]&&g[1]==e[1])||(g[0]==e[1]&&g[1]==e[0])).length==1);
newT=hole.map(e=>mk(e[0],e[1],i));}
function commit(){tris=tris.filter(t=>bad.indexOf(t)<0).concat(newT);idx++;bad=[];hole=[];newT=[];prep();}
function path(t){const v=t.v;x.beginPath();x.moveTo(pts[v[0]].x,pts[v[0]].y);x.lineTo(pts[v[1]].x,pts[v[1]].y);x.lineTo(pts[v[2]].x,pts[v[2]].y);x.closePath();}
function draw(){const pr=f/DUR[ph],pu=.5+.5*Math.sin(f*.28),P=done?null:pts[pts.length-1];
x.fillStyle='#070a14';x.fillRect(0,0,W,H);
if(P){const g=x.createRadialGradient(P.x,P.y,0,P.x,P.y,220);g.addColorStop(0,'rgba(255,170,60,.10)');g.addColorStop(1,'rgba(255,170,60,0)');x.fillStyle=g;x.fillRect(0,0,W,H);}
tris.forEach(t=>{const isB=bad.indexOf(t)>=0;if(!real(t)||(isB&&ph>=2))return;path(t);
x.fillStyle=isB?'rgba(255,86,64,'+(.10+.12*pu)+')':'rgba(70,140,255,.045)';x.fill();
x.strokeStyle=isB?'rgba(255,150,90,.95)':'rgba(116,186,255,.34)';x.lineWidth=isB?1.8:.9;x.stroke();});
if(ph==1)bad.forEach((t,k)=>{if(k/bad.length>pr*1.35||t.c.r>Math.max(W,H)*1.6)return;
x.beginPath();x.arc(t.c.x,t.c.y,t.c.r,0,7);x.setLineDash([5,6]);x.strokeStyle='rgba(255,196,120,.55)';x.lineWidth=1;x.stroke();x.setLineDash([]);
x.beginPath();x.arc(t.c.x,t.c.y,2,0,7);x.fillStyle='rgba(255,196,120,.8)';x.fill();});
if(ph==2||ph==3){x.strokeStyle='rgba(255,120,80,'+(ph==2?.9:.9-.7*pr)+')';x.lineWidth=1.6;
hole.forEach(e=>{x.beginPath();x.moveTo(pts[e[0]].x,pts[e[0]].y);x.lineTo(pts[e[1]].x,pts[e[1]].y);x.stroke();});}
if(ph==3)newT.forEach((t,k)=>{const a=Math.max(0,Math.min(1,pr*2.2-k/newT.length));if(a<=0||!real(t))return;
path(t);x.fillStyle='rgba(90,255,190,'+.10*a+')';x.fill();x.strokeStyle='rgba(120,255,205,'+(.35+.55*a)+')';x.lineWidth=1.3;x.stroke();});
for(let i=3;i<pts.length;i++){const p=pts[i],cur=P&&i==pts.length-1;x.beginPath();x.arc(p.x,p.y,cur?3.6:2,0,7);
x.fillStyle=cur?'#ffcf7a':'rgba(180,215,255,.85)';x.fill();}
if(P){x.beginPath();x.arc(P.x,P.y,10+16*(ph==0?pr:pu*.3),0,7);x.strokeStyle='rgba(255,207,122,'+(ph==0?1-pr:.35+.3*pu)+')';x.lineWidth=1.4;x.stroke();}
if(done){x.fillStyle='rgba(127,224,176,'+(.35+.45*pu)+')';x.font='600 15px ui-monospace,monospace';x.textAlign='center';
x.fillText('TRIANGULATION COMPLETE — RESEEDING',W/2,H-42);x.textAlign='left';}
PN.textContent=Math.min(idx+(ph==3?1:0),N);TN.textContent=alive();
ST.textContent=done?'RESEEDING…':['SEEDING POINT','CIRCUMCIRCLE TEST — '+bad.length+' CONFLICT'+(bad.length==1?'':'S'),'CARVING CAVITY','RETRIANGULATING — +'+newT.length][ph];
ST.style.color=done?'#7fe0b0':['#ffcf7a','#ff9a5e','#ff7a50','#78ffcd'][ph];}
function loop(){f++;if(done){if(f>90)init();}else if(f>=DUR[ph]){f=0;ph++;if(ph>3){ph=0;commit();}}draw();requestAnimationFrame(loop);}
addEventListener('resize',init);init();loop();
</script></body></html>