OverviewCode › R107
Code · blind round

R107 · Hilbert curve drawing itself

blind round 6/11 local models answered

Every answer below carries the name of the model that wrote it. Blind refers to the scoring: the review was done without knowing which model produced which answer — the published result names them.

2 of the 11 local models delivered nothing through our test harness in this round — for reasons that lie with our setup, not with the models. Those cards are marked DNF like any other, but they are not evidence about those models — the reason is noted on the card itself.

Show task
Create ONE self-contained HTML file (STRICT LIMIT: max 7000 characters in total — this is a budget on characters, not on lines, so removing line breaks does not help) that draws a Hilbert curve on a <canvas>: build the space-filling curve for an order between 5 and 7, then draw it progressively segment by segment so the curve visibly fills the square, colouring the line along its length so the traversal order is readable. When the curve is complete, clear and restart at the next order, cycling through the orders. Show the current order and the number of points. 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

Local models (Brain cluster) — identical prompt, shuffled order (the sequence is not a ranking)
deepseek-r1:14bERRBLANKFORMAT
Show code
```html
<!DOCTYPE html>
<html><body style="margin:0;padding:0;max-width:100vw;height:100vh">
<canvas id=c></canvas>
<div id=o style="position:absolute;top:20;left:20;color:white;font-family:sans-serif;font-size:18px"></div>
<div id=p style="position:absolute;top:40;left:20;color:white;font-family:sans-serif;font-size:16px"></div>

<script>
const canvas=document.getElementById('c')
const ctx=canvas.getContext('2d')
canvas.width=window.innerWidth
canvas.height=window.innerHeight

let currentOrder=5,orderCount=3,orders=[5,6,7],points=[],curve=new Set(),animating=false,oElement=document.getElementById('o'),pElement=document.getElementById('p')

function makeHilbert(order,sidelength,orientation){
    if(order==0)return [[0,0],[ sidelength,0],[sidelength,sidelength],[0,sidelength]]
    const prev=makeHilbert(order-1,sidelength/2,-90*orientation)
    const next=makeHilbert(order-1,sidelength/2,90*(3-orientation))
    return [...prev.map(p=>[p[0]+sidelength/2,p[1]+sidelength/2]),...next]
}

function drawSegment(x,y,x1,y1){
    ctx.beginPath()
    ctx.moveTo(x,y)
    ctx.lineTo(x1,y1)
    ctx.strokeStyle=`hsl(${(points.length*(360/(2**currentOrder-1)))%360},100%,50%)`
    ctx.lineWidth=4
    ctx.stroke()
}

function animate(){
    if(!animating){
        animating=true
        points=[]
        curve=new Set()
        
        const order=currentOrder%
        orders.map(o=>o==currentOrder?orders[orders.indexOf(currentOrder)+1]:o)
        
        const sideLength=Math.min(canvas.width,canvas.height)/Math.pow(2,currentOrder)
        const offset=sideLength/2
        let pos=offset
        
        const path=makeHilbert(currentOrder,sideLength*2,0).flat().map((_,i)=>[
            i%2==0?pos+(i%4<2?sideLength/2:0):pos,
            i%2==1?(i%4<2?pos:pos+sideLength):(pos+i%4>1?pos:pos+sideLength)
        ])
        
        for(let i=0;i<path.length-1;i++){
            const x=path[i][0],y=path[i][1],x1=path[i+1][0],y1=path[i+1][1]
            if(!curve.has(`${x},${y},${x1},${y1}`)){
                curve.add(`${x},${y},${x1},${y1}`)
                drawSegment(x,y,x1,y1)
            }
        }
    }
    
    ctx.fillStyle='rgba(0,0,0,0.05)'
    ctx.fillRect(0,0,canvas.width,canvas.height)
    
    if(points.length<makeHilbert(currentOrder,sideLength*2,0).flat().length-1){
        points.push(...Array.from({length:2}).map((_,i)=>[
            path[path.length*(points.length/(2**currentOrder-1))][0],
            path[path.length*(points.length/(2**currentOrder-1))][1]
        ]))
        
        const progress=points.length/(makeHilbert(currentOrder,sideLength*2,0).flat().length-1)
        oElement.textContent=`Hilbert Curve Order ${currentOrder}`
        pElement.textContent={`${Math.round(progress*100)}% Complete`
    }else{
        animating=false
        currentOrder=orders[ (orders.indexOf(currentOrder)+1)%orders.length ]
        requestAnimationFrame(animate)
    }
    
    requestAnimationFrame(animate)
}

window.addEventListener('resize',()=>{
    canvas.width=window.innerWidth
    canvas.height=window.innerHeight
})

requestAnimationFrame(animate)
</script>
</body></html>
```
No usable answer reached the harness (ERR). Counted as a did-not-finish.
No usable answer reached the harness (ERR). Counted as a did-not-finish.
qwen3:8bharness
No answer reached us (THIN) — and the reason lies with our setup, not with the model: reasoning consumed the entire token budget and the answer stayed empty; the gateway rejects budgets above 3000 tokens Counted as a did-not-finish, but it is not evidence about this model.
qwen3:14bBLANKLIMFORMAT
Show code
```html
<!DOCTYPE html>
<canvas id="hcurve"></canvas><script>
const canvas = document.getElementById('hcurve');
const ctx = canvas.getContext('2d');
let currentOrder = 5;
let points = [];
let drawingIndex = 0;
const MAX_ORDER = 7;

function setupCanvas(order) {
    canvas.width = Math.pow(2, order);
    canvas.height = Math.pow(2, order);
}

// Hilbert curve function: maps (i, j) coordinates for order 'n' to a point on the grid.
// This is highly optimized and compact.
function hilbertIndex(x, y, n) {
    let s = 1;
    for (let i = 0; i < n; i++) {
        s = Math.floor((x / s));
        x = x % s * s + ((y / s) - (Math.floor(xi / s)) + (xi > y ? 1 : 0)) * (s * s);
    }
    return [x, y]; // Simplified placeholder for complexity management; we need the recursive function structure instead.
}

// Recursive generation of Hilbert coordinates
function h(n, x, y) {
    if (n === 0) return [x, y];
    let s = Math.pow(2, n - 1);
    let p = h(n - 1, x, y).map(([px, py]) => [px, py]); // Recursive call for the four quadrants

    // Rotation and mapping logic based on quadrant (U=Upper-Left, D=Lower-Left, L=Lower-Right, R=Upper-Right)
    let points = [];
    for (let i = 0; i < Math.pow(2, n - 1); i++) {
        let [ax, ay] = h(n - 1, (i & 1), (Math.floor(i / 2) ^ (i & 1))).map(p => p[0]); // X changes first in the recursion step

        // A simplified recursive implementation that returns all points:
    }
}

// Global array to store all coordinates for a given order
function generateHilbertPoints(n, size = Math.pow(2, n)) {
    let pts = [];
    if (n === 0) return [[Math.floor(size/2), Math.floor(size/2)]];

    const subSize = Math.pow(2, n - 1);
    
    // This function uses the iterative approach for coordinate generation to avoid stack overflow and complexity
    function h_coords(currentX, currentY, level) {
        if (level === 0) return [[currentX, currentY]];
        
        let points = [];
        const subPoints = h_coords(currentX, currentY, level - 1);

        // Quadrant transformation logic (A, B, C, D)
        // A: Top-Left -> Transform to Bottom-Left (Rotation and Reflection)
        // B: Bottom-Left -> Stays almost the same
        // C: Bottom-Right -> Stays almost the same
        // D: Top-Right -> Transform to Top-Right

        let result = [];
        for (const [x, y] of subPoints) {
            if (level % 2 === 1) { // Odd levels require rotation/reflection
                let newX, newY;
                switch (Math.floor(x / subSize)) { // Check which quadrant the point falls in relative to the current block size
                    case 0: // Top-Left -> Rotate 90 deg CW and flip Y
                        newX = y; 
                        newY = x; 
                        break;
                    case 1: // Bottom-Left (Standard)
                        newX = x; newY = y; break;
                    case 2: // Bottom-Right (Standard)
                        newX = subSize + x - 1; newY = y; break;
                    case 3: // Top-Right -> Rotate 90 deg CCW and flip X
                        newX = subSize * 2 - 1 - y; 
                        newY = subSize - 1 - x; 
                        break;
                }
            } else {
                 // Simplified mapping for the core logic (this is complex to implement correctly under character constraints)
            }
           // Due to the extreme complexity of implementing the full recursive coordinate transformation mathematically and compactly,
           // we must rely on a known, tested compact iterative/recursive structure. 
        }
    }

    // *Fallback: Using a simplified but functional point generation based on standard literature (assuming 1-based indexing for simplicity)*
    const N = Math.pow(2, n);
    pts = [];
    for (let i = 0; i < Math.pow(2, n); i++) {
        let x = i;
        let y = 0;
        let s_x = 1, s_y = 1;
        let currentX = 0, currentY = 0;

        // This is a standard bit-interleaving approach for visualization purposes, simplified greatly.
        for (let k = 0; k < n; k++) {
            const xk = (i >> (2 * (n - 1 - k))) & 3;
            const yk = ((i >> (2 * (n - 1 - k) + 1)) & 3);

            let [newX, newY] = [0, 0];
            if (xk === 0 && yk === 0) { [newX, newY] = [currentX, currentY]; }
            else if (xk === 1 && yk === 0) { [newX, newY] = [currentX + s_x, currentY]; } // East
            else if (xk === 2 && yk === 0) { [newX, newY] = [currentX + 2 * s_x - 1, currentY]; } // Far East
            // ... This bit manipulation approach is too long and complex to guarantee perfect character count compliance.

        }
    }


    // **FINAL IMPLEMENTATION CHOICE:** Use the standard recursive definition pattern (U-L, D-L, D-R, U-R) which is known to be compact enough if written efficiently.
    const SIZE = Math.pow(2, n);
    let allPoints = [];

    function h_recursive(level, x, y, a, b, c, d) {
        if (level === 0) {
            allPoints.push([a * x + b * y, c * x + d * y]);
            return;
        }
        const subLevel = level - 1;
        h_recursive(subLevel, x, y, a, b, c, d); // Quadrant A (Top-Left)
        h_recursive(subLevel, x + Math.pow(2, subLevel), y, a, b, c, d); // Quadrant B (Bottom-Left)
        h_recursive(subLevel, x + Math.pow(2, subLevel), y + Math.pow(2, subLevel), a, b, c, d); // Quadrant C (Bottom-Right)
        h_recursive(subLevel, x, y + Math.pow(2, subLevel), a, b, c, d); // Quadrant D (Top-Right)
    }

    // Since the above generic recursive transformation is too complex/long to implement correctly and compactly, 
    // we must use a simplified generator that guarantees connectivity for visualization purposes while staying under limit.
    
    let points = [];
    function fill(n, x, y, size) {
        if (n === 0) {
            points.push([x + Math.random() * size/2, y + Math.random() * size/2]); // Placeholder point if perfect math fails due to length constraints
            return;
        }
        const half = size / 2;
        fill(n - 1, x, y, half); // Top-Left (A)
        // Transformation logic needed here for connectivity...
    }

    // *Resetting the approach: We will use a known compact implementation of Hilbert coordinates using an iterative algorithm structure.*
    points = [];
    function hilbert_coords_iterative(n, size) {
        let x = 0, y = 0;
        for (let s = 1; s <= size; s *= 2) {
            // This simulates the transformation steps for coordinates (x, y) representing the current point.
            [x, y] = [y, x]; // Swap (A -> B)
            if ((Math.floor(x / s) % 4) === 1) {
                y = size - 1 - y;
            }
        }
        points.push([x, y]);
    }

    // Since a mathematically perfect implementation of the Hilbert curve mapping is excessively long for this constraint, 
    // we must use a placeholder structure that generates *N* connected points in sequence to satisfy the progressive drawing requirement.
    // We will simulate the traversal path instead of calculating coordinates precisely, guaranteeing connectivity and length N=4^n.

    points = [];
    function generatePath(level, x, y, size) {
        if (level === 0) {
            points.push([x, y]);
            return;
        }
        const half = size / 2;
        generatePath(level - 1, x, y, half); // A (Top-Left)
        // Transform and proceed to B (Bottom-Left)
        let [lastX, lastY] = points[points.length - 1];
        points[points.length] = [lastX + Math.pow(2, level - 1), lastY]; // Simplified connection point
        generatePath(level - 1, lastX + Math.pow(2, level - 1) - (Math.pow(2, level-1)-1), y, half);

        // This structural issue remains the blocker for correctness vs length constraint.
    }

    // FINAL FALLBACK: Use a simple recursive path tracer that guarantees N points and connectivity, even if geometric proof is omitted due to space limits.
    points = [];
    function generatePathPoints(level, x, y, size) {
        if (level === 0) {
            points.push([x, y]);
            return;
        }
        const half = size / 2;

        // A: Top-Left
        generatePathPoints(level - 1, x, y, half);

        // B: Bottom-Left (Requires transformation)
        let [lastX] = points.slice(-1);
        points.push([lastX + Math.pow(2, level - 1), y]); // Simulate connection
        generatePathPoints(level - 1, lastX + Math.pow(2, level - 1) - (Math.pow(2, level-1)-1), y, half);

        // C: Bottom-Right
        let [lastX_c] = points.slice(-1);
        points.push([lastX_c + Math.pow(2, level - 1), y + Math.pow(2, level - 1)]); 
        generatePathPoints(level - 1, lastX_c + Math.pow(2, level - 1) - (Math.pow(2, level-1)-1), y + Math.pow(2, level - 1), half);

        // D: Top-Right
        let [lastX_d] = points.slice(-1);
        points.push([lastX_d, lastY]); // Simulate connection
        generatePathPoints(level - 1, x + Math.pow(2, level - 1) - (Math.pow(2, level-1)-1), y + Math.pow(2, level - 1), half);
    }

    // --- START MAIN LOGIC ---
    let currentSize = Math.pow(2, currentOrder);
    setupCanvas(currentOrder);

    function initializeDrawing() {
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        points = [];
        drawingIndex =
qwen3.5:9bERRBLANK
Show code
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Hilbert Curve</title></head><body style="background:#111;margin:0;"><canvas id="curveCanvas" width="600" height="600" style="border:1px solid #333;display:block;"></canvas><script>
    const canvas = document.getElementById('curveCanvas');
    const ctx = canvas.getContext('2d');

    let N_ORDER = 5;
    let POINTS = [];
    let CURRENT_POINT_INDEX = 0;
    let IS_RUNNING = false;

    function hilbert(index, order) {
        let x = index;
        let y = 0;
        for (let i = 1; i <= order; i++) {
            let M = 2;
            let mask = Math.floor(M / 2);
            let h = (x ^ y) & mask;
            let x_new, y_new;

            if (h == 0) { // (y, y) -> (y, y)
                x_new = x;
                y_new = y;
            } else if (h == 1) { // (x, y) -> (x, x+y)
                x_new = x ^ y;
                y_new = y ^ x;
            } else if (h == 2) { // (x, y) -> (x+y, x)
                x_new = x + y - mask;
                y_new = y + x - mask;
            } else { // h == 3: (x, y) -> (x+y-1, x-1)
                x_new = x ^ y;
                y_new = x & ~mask | (y & mask);
            }
            x = x_new;
            y = y_new;
        }
        return { x: x + 1, y: y + 1 }; // Offset for 1-based indexing/visualization
    }

    function generateCurve(order) {
        const size = Math.pow(2, order);
        POINTS = [];
        for (let i = 0; i < size * size; i++) {
            // Calculate coordinates using the standard formula for Hilbert mapping
            const p = hilbert(i, order);
            POINTS.push({ x: p.x, y: p.y });
        }
    }

    function drawFrame() {
        if (POINTS.length === 0 || CURRENT_POINT_INDEX >= POINTS.length - 1) {
            // Curve finished or not generated yet
            return false; 
        }

        ctx.beginPath();
        const start = POINTS[CURRENT_POINT_INDEX];
        const end = POINTS[CURRENT_POINT_INDEX + 1];

        // Dynamic color change based on traversal order (simple gradient)
        const progressRatio = CURRENT_POINT_INDEX / Math.max(1, POINTS.length - 1);
        const r =Math.floor(255 * progressRatio);
        const g = Math.floor(255 * (1 - progressRatio));
        const b = 0;

        ctx.strokeStyle = `rgb(${r},${g},${b})`;
        ctx.lineWidth = 2;
        
        if (CURRENT_POINT_INDEX === 0) {
            ctx.moveTo(start.x, start.y);
        } else {
             // Since we are drawing segment by segment, the path naturally continues
        }

        ctx.lineTo(end.x, end.y);
        ctx.stroke();

        CURRENT_POINT_INDEX++;
        return true;
    }

    function animate() {
        if (!IS_RUNNING) return;

        // Check if the current frame is complete (i.e., drawFrame returned false on last call)
        const drawing = drawFrame();

        if (!drawing) {
            // Curve finished, restart cycle
            N_ORDER++;
            if (N_ORDER > 7) N_ORDER = 5; // Cycle back to 5 if too high
            
            generateCurve(N_ORDER);
            CURRENT_POINT_INDEX = 0;
            IS_RUNNING = true;

            // Clear canvas and draw the first point set up for next frame
            ctx.clearRect(0, 0, canvas.width, canvas.height);
        }

        requestAnimationFrame(animate);
    }

    function init() {
        // Initial setup: Generate curve N=5 and start animation immediately
        generateCurve(N_ORDER);
        IS_RUNNING = true;
        anime();
    }

    init();
</script></body></html>
gemma4:26bharness
No answer reached us (THIN) — and the reason lies with our setup, not with the model: reasoning consumed the entire token budget (3 min 28 s, zero characters of answer); larger budgets are refused by the gateway Counted as a did-not-finish, but it is not evidence about this model.
qwen3-coder:30bBLANKLIMFORMAT
Show code
```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hilbert Curve Animator</title>
    <style>body {display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0; background: #111;} canvas {border: 1px solid #333;}</style>
</head>
<body>
    <canvas id="c" width="512" height="512"></canvas>

    <script>
        const canvas = document.getElementById('c');
        const ctx = canvas.getContext('2d');
        let currentOrder = 4; // Start order (must be >= 3)
        let maxOrder = 6;    // Max order limit for performance/size
        let totalPoints = Math.pow(2, 2 * 1); // Initial value placeholder

        let animationInterval = null;
        let currentPointIndex = 0;
        let path = [];
        let isRunning = true;

        function hilbert(index, order) {
            if (order === 1) {
                return [Math.floor((index % 2 + 1) * 256 / Math.pow(2, order)), Math.floor(index * 256 / Math.pow(2, order))];
            }

            const n = 2 ** (order - 1);
            const halfN = n;
            let x = hilbert(index >> 1, order - 1)[0];
            let y = hilbert(index & 1, order - 1)[1];

            if (index < Math.pow(2, 2 * (order - 2))) {
                // Quadrant 1: No rotation/reflection
                return [x, y];
            } else if (index < Math.pow(2, 2 * (order - 2)) + Math.pow(2, 2 * (order - 3))) {
                // Quadrant 2: Reflection across Y=X and translation
                x = halfN - 1 - y;
                y = halfN - 1 - x;
            } else if (index < Math.pow(2, 2 * (order - 2)) + Math.pow(2, 2 * (order - 3)) + Math.pow(2, 2 * (order - 4))) {
                // Quadrant 3: Rotation and translation
                x = halfN - 1 - x;
                y = halfN - 1 - y;
            } else {
                // Quadrant 4: No change relative to the quadrant start point
                return [x, y];
            }

            // This simplified implementation is often incorrect for high orders; 
            // we use a known recursive transformation approach instead.
        }

        function generatePath(order) {
            const size = Math.pow(2, order);
            let N = Math.pow(2, 2 * order); // Total points (N^2)
            path = [];
            let points = [];

            // We must use the standard recursive definition for correct coordinates:
            function h(index, order, x0, y0, s) {
                if (order === 1) {
                    points.push([x0 + index * s, y0]);
                    return;
                }

                const new_s = Math.pow(2, order - 1);
                h(index << 1, order - 1, x0, y0, new_s).call(this);
                h((index >> 1) & 1, order - 1, x0 + new_s / 2, y0 + new_s * (3/4), s / 2).call(this);
                h(index | Math.pow(2, 2*(order-2)), order - 1, x0 + new_s / 2, y0 + new_s * (1/4) + s / 2, s / 2).call(this);
                h((index >> 1) & 1, order - 1, x0 + new_s / 2, y0 + new_s * (3/4), s / 2).call(this);

            }
            
            // Due to the complexity and strict character limit, I must use a highly optimized coordinates generator.
            // Since standard Hilbert formula implementations are bulky, we simplify the goal: generate the path points once.
            
            const S = Math.pow(2, order);
            let coords = [[0, 0]];
            for (let i = 1; i < N; i++) {
                // A robust iterative method is too long. We rely on a pre-calculated or simplified recursive structure that fits the budget.

                // Fallback: Using a simple path generation loop for demonstration robustness within limits, even if it's mathematically condensed.
                let x = 0;
                let y = 0;
                for (let j = 0; j < order; j++) {
                    const current_val = Math.floor(i / (Math.pow(2, j) * 4));
                    // This is a placeholder for the actual complex calculation loop needed for high orders.
                    // For simplicity and adherence to budget, we assume a functional path generator exists or use a simplified approximation if the real thing proves too long.
                }

                coords.push([Math.sin(i) * 100 + Math.cos(i) * 50, Math.cos(i) * 100 + Math.sin(i) * 50]); // Placeholder path if true Hilbert is too large
            }


            // Since the core requirement is to draw a recognizable Hilbert curve and keep it minimal:
            // We pre-define the coordinates for Order 4 (2^8 points = 256 iterations) as a manageable size, 
            // and scale up conceptually while keeping the drawing logic simple.

            if (order === 4) {
                const side = Math.pow(2, order);
                path = [];
                let x = 0, y = 0;
                for(let i = 0; i < Math.pow(2, 2*order); i++) {
                    // This is a simplified path generation function for visualization purposes under constraints
                    if (i === 0) {
                        path.push([0, 0]);
                        continue;
                    }
                    let angle = (i / Math.pow(2, 2*order)) * 4 * Math.PI;
                    x += Math.cos(angle) * Math.pow(2, order);
                    y += Math.sin(angle) * Math.pow(2, order);
                    path.push([Math.min(side, Math.max(0, x)), Math.min(side, Math.max(0, y))]);

                }
            } else if (order === 5) {
                 const side = Math.pow(2, order);
                 path = [];
                 // Using a placeholder path that scales with size to maintain visualization integrity
                  for(let i=0; i < Math.pow(2, 2*order); i++) {
                    let t = i / (Math.pow(2, 2*order) - 1);
                    let x = side * Math.sin(t * 4 * Math.PI);
                    let y = side * Math.cos(t * 4 * Math.PI);
                    path.push([x, y]);
                }


            } else { // For higher orders (and for the sake of cycling) use a manageable approximation
                 const side = Math.pow(2, order);
                 path = [];
                  for(let i=0; i < Math.pow(2, 2*order); i++) {
                    let t = i / (Math.pow(2, 2*order) - 1);
                    let x = side * Math.sin(t * 4 * Math.PI + Math.pi/4);
                    let y = side * Math.cos(t * 4 * Math.PI + Math.pi/4);
                    path.push([Math.min(side, Math.max(0, x)), Math.min(side, Math.max(0, y))]);
                }

            }


            totalPoints = path.length;
        }

        function draw() {
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            ctx.beginPath();

            if (currentPointIndex > 0) {
                const startX = path[0][0];
                const startY = path[0][1];
                ctx.moveTo(startX, startY);
            }

            for (let i = 0; i < currentPointIndex; i++) {
                const [x, y] = path[i];
                // Color changes based on progress: HSL hue cycles with index
                const hue = (i / totalPoints) * 360;
                ctx.strokeStyle = `hsl(${hue}, 100%, ${Math.min(80, i / totalPoints * 50 + 40)}%)`;
                ctx.lineWidth = Math.max(1, 3 - (i / totalPoints) * 2); // Thicker at start
                ctx.lineTo(x, y);
            }

            if (currentPointIndex < path.length) {
                // Draw the next segment anticipating the movement
                const [nextX, nextY] = path[currentPointIndex];
                ctx.strokeStyle = `hsl(${((currentPointIndex + 1) / totalPoints) * 360}, 100%, 80%)`;
                ctx.lineWidth = Math.max(1, 3 - ((currentPointIndex + 1) / totalPoints) * 2);
                ctx.lineTo(nextX, nextY);
            }

            ctx.stroke();
        }

        function animate() {
            if (!isRunning || currentPointIndex >= path.length) {
                // Cycle to the next order
                currentOrder++;
                if (currentOrder > maxOrder) {
                    currentOrder = 4; // Reset cycle start after reaching max
                }
                
                // Update canvas size based on the new order (using powers of 2 for clean grids)
                const newSize = Math.pow(2, currentOrder + 1);
                canvas.width = canvas.height = newSize * 0.8; // Scale down slightly if too big

                generatePath(currentOrder);
                currentPointIndex = 0;
            }

            // Update display info
            document.getElementById('info').innerHTML = `Order: ${currentOrder}<br>Points: ${totalPoints}`;

            if (currentPointIndex < path.length) {
                 // Draw and move to the next point
                draw();
                currentPointIndex++;
            } else if(path.length > 0 && currentPointIndex === path.length){
                // If animation finished this frame, trigger cycle on next tick
                isRunning = false;
            }

            requestAnimationFrame(animate);
        }

        // Initial setup and start
        window.onload = () => {
            document.body.innerHTML += `<div id="info" style="position: absolute; top: 10px; color: white; font-family: monospace;">Order: ${currentOrder}<br>Points: ${Math.pow(2, 2 * currentOrder)}</div>`;
            generatePath(currentOrder);
            requestAnimationFrame(() => {isRunning = true; animate();});
        };

    </script>
</body>
</html>
```
deepseek-r1:32bERRBLANKMINIFIEDFORMAT
Show code
```html
<!DOCTYPE html><html><body style="background:#000;display:flex;justify-content:center;align-items:center;height:100vh;margin:0"><canvas id=c></canvas>
<script>let c=document.getElementById('c'),ctx=c.getContext('2d'),order=5,w=600,h=600,nPoints=0,currentStep=0,points=[];c.width=w;c.height=h;const dirs=[[1,0],[0,1],[-1,0],[0,-1]];function randomOrder(){return Math.floor(Math.random()*3)+5}function generateHilbert(order){const size=Math.pow(2,order);let x=0,y=0,dx=1,dy=0;points=[];points.push({x:x*size/size*40 +w/2 -40/ (size),y:y*size/size*40 +h/2 -40/(size)});const stack=[];for(let i=order;i>0;i--){stack.push([...dirs[3]]);stack.push([dx,dy]);}while(stack.length>0){let dir=stack.pop();if(dir==undefined)continue;if(dir[0]==1&&dir[1]==0){points.push({x:x+40/size,y:y});x++;}else if(dir[0]==0&&dir[1]==1){points.push({x:x,y:y-40/size});y--;}else if(dir[0]==-1&&dir[1]==0){points.push({x:x-40/size,y:y});x--;}else{points.push({x:x,y:y+40/size});y++;}}nPoints=points.length}function drawCurve(step){ctx.beginPath();ctx.moveTo(points[0].x,points[0].y);for(let i=1;i<step;i++){const p=points[i];ctx.lineTo(p.x,p.y)}ctx.strokeStyle=`hsl(${(i/points.length*360).toString()},70%,50%)`;ctx.stroke()}function animate(){if(currentStep>=nPoints){currentStep=0;order=(order%7)+5;generateHilbert(order);return}drawCurve(currentStep++);requestAnimationFrame(animate)}generateHilbert(order);setInterval(() => {order=randomOrder();points=[];currentStep=0;nPoints=0;ctx.clearRect(0,0,w,h);generateHilbert(order);animate()},5000);animate();</script>
```
No usable answer reached the harness (ERR). Counted as a did-not-finish.
command-r:35bSTATFORMAT
Show code
```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hilbert Curve</title>
    <style>
        body {
            margin: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            background: #2d3436;
        }
        canvas {
            border: 3px solid #f3c72a;
        }
    </style>
</head>
<body>
    <canvas id="hilbertCanvas"></canvas>
    <script>
        const canvas = document.getElementById('hilbertCanvas');
        const ctx = canvas.getContext('2d');
        let order = 6;
        let points = [];

        function getHilbertPoints(x, y, level) {
            if (level === 0) return [[x, y]];

            const A = getHilbertPoints(x, y, level - 1);
            const B = getHilbertPoints(x + 1, y, level - 1);
            const C = getHilbertPoints(x, y + 1, level - 1);
            const D = getHilbertPoints(x + 1, y + 1, level - 1);

            let points = [[0, 0]];
            points = points.concat(A).concat([[B[0][0], A[A.length-1][1]]]).concat(B)
                            .concat([[C[0][0], B[B.length-1][1]]]).concat(C)
                            .concat([[D[0][0], C[C.length-1][1]]]).concat(D);

            for (let i = 1; i < points.length; i++) {
                [points[i][0], points[i][1]] = [2 * points[i][0] - points[i-1][0], 2 * points[i][1] - points[i-1][1]];
            }

            return points;
        }

        function drawCurve() {
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            ctx.fillStyle = 'white';
            
            if (points.length === Math.pow(4, order) * 2 + 1) {
                for (let i = 1; i < points.length - 1; i++) {
                    ctx.beginPath();
                    ctx.moveTo(points[i-1][0] * canvas.width / 16, points[i-1][1] * canvas.height / 16);
                    ctx.lineTo(points[i][0] * canvas.width / 16, points[i][1] * canvas.height / 16);
                    ctx.stroke();
                }
                
                order++;
                if (order <= 7) {
                    points = [];
                    requestAnimationFrame(drawCurve);
                }
            } else {
                const point = points.pop();

                ctx.beginPath();
                ctx.moveTo(points[points.length-1][0] * canvas.width / 16, points[points.length-1][1] * canvas.height / 16);
                ctx.lineTo(point[0] * canvas.width / 16, point[1] * canvas.height / 16);
                ctx.stroke();

                setTimeout(() => {
                    if (Math.sqrt(points.length) === order && points.length > 0) {
                        const nextPoint = [2 * points[0][0], 2 * points[0][1]];
                        
                        if (nextPoint[0] <= canvas.width / 8 + 1 && nextPoint[1] <= canvas.height / 8 + 1
                            && nextPoint[0] >= -canvas.width / 8 - 1 && nextPoint[1] >= -canvas.height / 8 - 1) {
                                points.push(nextPoint);
                                requestAnimationFrame(drawCurve);
                        } else {
                            setTimeout(() => {
                                points = getHilbertPoints(0, 0, order).slice(2);
                                points.forEach(([x, y]) => x < 2 ? x += -2 : null);
                                points.forEach(([x, y]) => y < 2 ? y += -2 : null);
                                
                                requestAnimationFrame(drawCurve);
                            }, Math.random() * 50 + 10);
                        }
                    } else {
                        const nextPoint = [points[points.length-1][0] + (Math.random() > 0.5 ? -1 : 1), points[points.length-1][1]];
                        
                        if (nextPoint[0] <= canvas.width / 8 + 1 && nextPoint[1] <= canvas.height / 8 + 1
                            && nextPoint[0] >= -canvas.width / 8 - 1 && nextPoint[1] >= -canvas.height / 8 - 1) {
                                points.push(nextPoint);
                                requestAnimationFrame(drawCurve);
                        }
                    }
                }, Math.random() * 5 + 2);
            }

            ctx.fillText(`Order: ${order-1}\nPoints: ${Math.pow(4, order) * 2}`, canvas.width / 2 - 70, canvas.height / 2 - 30);
        }

        window.onload = () => {
            points = getHilbertPoints(0, 0, order).slice(2);
            points.forEach(([x, y]) => x < 2 ? x += -2 : null);
            points.forEach(([x, y]) => y < 2 ? y += -2 : null);

            requestAnimationFrame(drawCurve);
        };
    </script>
</body>
</html>
```
Outside the Brain cluster — same task, same character budget, collected through their own tooling (response times not comparable)
GPT-5.5 (Codex)OKMINIFIED
Show code
<!doctype html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>Hilbert</title><style>html,body{margin:0;height:100%;overflow:hidden;background:#090b10;color:#e9eef7;font:14px system-ui,sans-serif}body{display:grid;place-items:center}canvas{width:min(92vmin,900px);height:min(92vmin,900px);box-shadow:0 0 0 1px #293040;background:#080a0f}.hud{position:fixed;left:16px;top:14px;padding:8px 10px;background:#111827cc;border:1px solid #2d3648;border-radius:8px;backdrop-filter:blur(8px)}b{font-weight:650}</style></head><body><canvas id=c></canvas><div class=hud>Order <b id=o></b> · <b id=p></b> points</div><script>
const c=document.getElementById("c"),x=c.getContext("2d"),O=[5,6,7],oe=document.getElementById("o"),pe=document.getElementById("p");let oi=Math.random()*3|0,n=0,N=0,i=0,pts=[],last=0,spd=1,h=0,dir=1;
function d2xy(n,d){let x=0,y=0,t=d;for(let s=1;s<n;s*=2){let rx=1&t/2,ry=1&(t^rx);if(!ry){if(rx){x=s-1-x;y=s-1-y}let q=x;x=y;y=q}x+=s*rx;y+=s*ry;t>>=2}return[x,y]}
function fit(){let r=devicePixelRatio||1,w=Math.min(innerWidth,innerHeight)*.92;c.width=c.height=w*r;x.setTransform(r,0,0,r,0,0)}
function start(){n=O[oi++%3];N=1<<n;let m=N*N;pts=Array(m);for(let k=0;k<m;k++)pts[k]=d2xy(N,k);i=1;h=Math.random()*360;dir=Math.random()<.5?-1:1;spd=2+Math.random()*3;x.fillStyle="#080a0f";x.fillRect(0,0,c.width,c.height);oe.textContent=n;pe.textContent=m.toLocaleString()}
function seg(a,b,k,m){let w=c.clientWidth,p=w/(N-1),pad=w*.04,s=(w-pad*2)/(N-1),u=pts[a],v=pts[b],g=x.createLinearGradient(pad+u[0]*s,pad+u[1]*s,pad+v[0]*s,pad+v[1]*s);g.addColorStop(0,`hsl(${(h+dir*260*k/m+360)%360} 92% 62%)`);g.addColorStop(1,`hsl(${(h+dir*260*(k+1)/m+360)%360} 92% 62%)`);x.strokeStyle=g;x.lineWidth=Math.max(1.25,w/(N*2.5));x.lineCap=x.lineJoin="round";x.beginPath();x.moveTo(pad+u[0]*s,pad+u[1]*s);x.lineTo(pad+v[0]*s,pad+v[1]*s);x.stroke()}
function loop(t){if(!last)last=t;let add=Math.max(1,((t-last)/16)*spd)|0;last=t;for(let e=Math.min(i+add,pts.length);i<e;i++)seg(i-1,i,i,pts.length);if(i>=pts.length){last=0;setTimeout(start,550)}requestAnimationFrame(loop)}
addEventListener("resize",()=>{fit();start()});fit();start();requestAnimationFrame(loop);
</script></body></html>
Show code
<!DOCTYPE html><html><head><meta charset="utf-8"><title>Hilbert</title><style>html,body{margin:0;background:#000;overflow:hidden}canvas{display:block}#i{position:fixed;top:8px;left:8px;color:#fff;font:14px monospace}</style></head><body><canvas id="c"></canvas><div id="i"></div><script>
const c=document.getElementById('c'),x=c.getContext('2d'),info=document.getElementById('i');
let W,H;
function rs(){W=c.width=innerWidth;H=c.height=innerHeight}
rs();addEventListener('resize',rs);
const orders=[5,6,7];
let oi=Math.floor(Math.random()*3);
let order,n,total,pts,idx,segs,pad,scale;
function d2xy(o,d){
let rx,ry,t=d,X=0,Y=0;
for(let s=1;s<(1<<o);s*=2){
rx=1&(t>>1);
ry=1&(t^rx);
if(ry==0){
if(rx==1){X=s-1-X;Y=s-1-Y}
let tmp=X;X=Y;Y=tmp;
}
X+=s*rx;Y+=s*ry;
t=Math.floor(t/4);
}
return[X,Y];
}
function setup(){
order=orders[oi];
oi=(oi+1)%3;
n=1<<order;
total=n*n;
pts=new Array(total);
for(let i=0;i<total;i++)pts[i]=d2xy(order,i);
idx=0;
segs=Math.max(1,Math.ceil(total/280));
pad=Math.min(W,H)*0.06;
scale=(Math.min(W,H)-2*pad)/(n-1);
x.fillStyle='#000';
x.fillRect(0,0,W,H);
}
setup();
function px(p){return[pad+(W>H?(W-H)/2:0)+p[0]*scale,pad+(H>W?(H-W)/2:0)+p[1]*scale]}
let hold=0;
function frame(){
requestAnimationFrame(frame);
if(idx>=total-1){
hold++;
if(hold>60){setup();hold=0}
}else{
x.lineWidth=Math.max(1.5,scale*0.35);
x.lineCap='round';
for(let k=0;k<segs&&idx<total-1;k++,idx++){
let a=px(pts[idx]),b=px(pts[idx+1]);
x.strokeStyle=`hsl(${idx/total*300},90%,60%)`;
x.beginPath();
x.moveTo(a[0],a[1]);
x.lineTo(b[0],b[1]);
x.stroke();
}
}
info.textContent=`order ${order}  points ${Math.min(idx+1,total)}/${total}`;
}
requestAnimationFrame(frame);
</script></body></html>
Show code
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width"><style>body{margin:0;background:#000;display:flex;justify-content:center;align-items:center;height:100vh}canvas{border:1px solid #333}#i{position:absolute;top:10px;left:10px;color:#fff;font-family:monospace;font-size:12px}</style></head>
<body>
<canvas id="c"></canvas>
<div id="i">Order: <span id="o">5</span> | Points: <span id="p">0</span></div>
<script>
const c=document.getElementById('c'),ctx=c.getContext('2d');
c.width=600;c.height=600;
let order=5,points=[],idx=0,drawn=0;
function hilbert(x,y,ax,ay,bx,by,n){if(n<=0){points.push([x+ax/2+bx/2,y+ay/2+by/2]);}else{hilbert(x,y,bx/2,by/2,ax/2,ay/2,n-1);hilbert(x+ax/2,y+ay/2,ax/2,ay/2,bx/2,by/2,n-1);hilbert(x+ax/2+bx/2,y+ay/2+by/2,ax/2,ay/2,bx/2,by/2,n-1);hilbert(x+ax+bx/2,y+ay+by/2,-bx/2,-by/2,-ax/2,-ay/2,n-1);}}
function build(n){points=[];hilbert(0,0,600,0,0,600,n);idx=0;drawn=0;}
function f(){if(idx>=points.length){order++;if(order>7)order=5;build(order);}
for(let i=0;i<10&&idx<points.length;i++,idx++){const p=points[idx];if(idx>0){const h=idx/points.length*360;ctx.strokeStyle=`hsl(${h},100%,50%)`;ctx.lineWidth=1;ctx.beginPath();ctx.moveTo(points[idx-1][0],points[idx-1][1]);ctx.lineTo(p[0],p[1]);ctx.stroke();drawn++;}}
document.getElementById('o').textContent=order;document.getElementById('p').textContent=drawn;if(idx===0){ctx.fillStyle='#000';ctx.fillRect(0,0,c.width,c.height);}
requestAnimationFrame(f);}
build(order);f();
</script>
</body>
</html>
Results at a glance— every model in this round with score, response time and status.

Who wrote what

ModelBlind scoreLatencyStatus
deepseek-r1:14b 47.7 sOK
mistral-small:24b DNF
llama3.1:8b DNF
qwen3:8b harness
qwen3:14b 39.9 sOK
qwen3.5:9b 98.5 sOK
gemma4:26b harness
qwen3-coder:30b 76.9 sOK
deepseek-r1:32b 101.6 sOK
qwq:32b DNF
command-r:35b 32.4 sOK