OverviewCode › R136
Code · blind round

R136 · Double pendulum tracing a chaotic path

blind round 7/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 animates a double pendulum on a <canvas>: two rigid rods with masses at their ends, integrated with the real double-pendulum equations of motion (not two independent simple pendulums) starting from a fixed initial angle so the motion runs chaotic and unpredictable, and draw a fading trail behind the outer bob so its tangled path becomes visible over time. Restart from a freshly randomized initial angle once the trail gets too long or too tangled. Show the elapsed time in seconds since the last restart. 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:14bERRSTATFORMAT
Show code
```html
<!DOCTYPE html>
<html><body style="margin:0;background:#000;">
<canvas id=c></canvas>
<div id=t style="position:absolute;top:10px;left:10px;color:white;font-family:Arial;">Time: 0.00s</div>

<script>
const c=document.getElementById('c'), ctx=c.getContext('2d');
const tEl=document.getElementById('t');

let w=c.width=window.innerWidth,h=c.height=window.innerHeight;

let m1=1,m2=2,l1=150,l2=150,x1=l1,y1=0,x2=x1+l1,y2=y1;
let theta1=Math.random()*(Math.PI/2),theta2=randomAngle(),d_theta1=0,d_theta2=0;
let trail=[],trailLen=30,timer=0;

function randomAngle(){return Math.random()*(Math.PI/3)-Math.PI/6}

function RK4(theta1,d_theta1,theta2,d_theta2){
    const k1_theta1=d_theta1,k1_dtheta1=(-g*(m2+m1)*Math.sin(theta1) - m2*g*Math.sin(theta1-Math.PI*2) + (m2*d_theta1**2)*Math.cos(theta1-Math.PI*2))/L;
    const k1_theta2=d_theta2,k1_dtheta2=((m2*g*(Math.sin(theta1)+Math.sin(theta1-Math.PI*2)))+(m2*d_theta2**2*Math.cos(theta1-Math.PI*2 - theta2 + Math.PI*2)))/M;

    const k2_theta1=theta1+0.5*h*k1_theta1,k2_dtheta1= d_theta1+0.5*h*k1_dtheta1;
    const k2_theta2=theta2+0.5*h*k1_theta2,k2_dtheta2=d_theta2+0.5*h*k1_dtheta2;

    const k3_theta1=k2_theta1 + h*k2_theta1/2, k3_dtheta1=k2_dtheta1 +h*k2_dtheta1/2;
    const k3_theta2= k2_theta2 + h*k2_theta2/2, k3_dtheta2=k2_dtheta2 +h*k2_dtheta2/2;

    const k4_theta1=k3_theta1 +h*k3_theta1,k4_dtheta1=k3_dtheta1 +h*k3_dtheta1;
    const k4_theta2= k3_theta2 + h*k3_theta2,k4_dtheta2=k3_dtheta2 +h*k3_dtheta2;

    theta1 += (k1_theta1 + 2*k2_theta1 + 2*k3_theta1 + k4_theta1)/6;
    d_theta1 += (k1_dtheta1 + 2*k2_dtheta1 + 2*k3_dtheta1 + k4_dtheta1)/6;

    theta2 += (k1_theta2 + 2*k2_theta2 + 2*k3_theta2 + k4_theta2)/6;
    d_theta2 += (k1_dtheta2 + 2*k2_dtheta2 + 2*k3_dtheta2 + k4_dtheta2)/6;

    return [theta1,d_theta1,theta2,d_theta2];
}

function update(){
    const h=0.005,g=9.81,M=m1+m2,L=l1+l2;
    
    theta1 +=d_theta1; d_theta1=d_theta1+Math.random()*0.001;
    theta2 +=d_theta2; d_theta2+=d_theta2*0.001;

    if(trail.length>w/2) reset();
}

function draw(){
    ctx.fillStyle='#111';ctx.fillRect(0,0,h,w);
    
    ctx.beginPath();
    const x1=l1*Math.sin(theta1),y1=-l1*Math.cos(theta1);
    const x2=x1+l2*Math.sin(theta2), y2=y1 - l2*Math.cos(theta2);
    
    ctx.strokeStyle='#fff';ctx.lineWidth=2;
    ctx.moveTo(w/2, h/2);ctx.lineTo(w/2 +x1, h/2 +y1);
    ctx.lineTo(w/2 +x2, h/2 +y2);ctx.stroke();

    ctx.beginPath();
    ctx.arc(w/2 +x1, h/2 +y1,l1*0.3,0,Math.PI*2).fill();
    ctx.arc(w/2 +x2, h/2 +y2,l2*0.3,0,Math.PI*2).fill();

    if(trail.length<50) trail.push({x:w/2+x2,y:h/2+y2});
    
    ctx.beginPath();ctx.strokeStyle='rgba(127, 127, 255, 0.5)';
    for(let i=trail.length-1;i>=0;--i){
        if(i>0) ctx.moveTo(trail[i].x, trail[i].y);
        ctx.lineTo(trail[i].x, trail[i].y).stroke();
    }

    tEl.textContent=`Time: ${timer.toFixed(2)}s`;
}

function reset(){
    theta1=randomAngle();d_theta1=0;
    theta2=randomAngle();d_theta2=0;
    trail=[];timer=0;
}

function animate(){update();draw();requestAnimationFrame(animate);}

animate();

window.addEventListener('resize',()=>{
    w=c.width=window.innerWidth,h=c.height=window.innerHeight;
});
</script>
</body></html>
```
mistral-small:24bOKFORMAT
Show code
```html
<!DOCTYPE html>
<html><head><style>body{margin:0}canvas{border:1px solid black}</style></head><body><canvas id="pendulumCanvas"></canvas><script>
const canvas=document.getElementById('pendulumCanvas');
const ctx=canvas.getContext('2d');
const width=800,height=600;
canvas.width=width;canvas.height=height;
let time=0,trail=[],maxTrailLength=5000,restartTime=0,fadeSpeed=10;
function random(min,max){return Math.random()*(max-min)+min}function reset(){time=0;trail=[];
restartTime=Date.now();const theta1=random(-Math.PI*3/4,-Math.PI/4);
const theta2=random(-Math.PI*5/8,Math.PI/8);return[theta1,theta2]}
let [theta1,theta2]=reset();
function animate(){ctx.clearRect(0,0,width,height);}
function drawTrail(){if(trail.length>maxTrailLength){reset();animate();}
for(let i=0;i<trail.length;++i){
const alpha=fadeSpeed*i/trail.length;
ctx.strokeStyle=`rgba(0,0,255,${alpha})`;ctx.beginPath();
ctx.moveTo(...trail[0]);ctx.lineTo(...trail[i]);ctx.stroke();}}
function computeDerivatives(theta1,theta2,dTheta1,dTheta2){
const l1=200,l2=150,m1=10,m2=3,g=9.8;
const num1=-g*(2*m1+m2)*Math.sin(theta1)-m2*g*Math.sin(theta1-2*theta2)-2*Math.sin(theta1-theta2)*m2*((dTheta2**2)*l2+(dTheta1**2)*l1*Math.cos(theta1-theta2));
const num2=2*Math.sin(theta1-theta2)*(m1+m2)*((dTheta1**2)*l1+g*(m1+m2)*Math.cos(theta1)+(dTheta2**2)*l2*m2*Math.cos(theta1-theta2));
const den=l1*(2*m1+m2-m2*Math.cos(2*theta1-2*theta2));
return[num1/den,num2/(l1*(m1+m2))];}
function integrate(timeStep){let[dTheta1,dTheta2]=computeDerivatives(theta1,theta2,0,0);for(let i=0;i<timeStep;++i){
const [dTheta1New,dTheta2New]=computeDerivatives(theta1,theta2,dTheta1,dTheta2);
theta1+=0.5*(dTheta1+dTheta1New)*timeStep;
theta2+=0.5*(dTheta2+dTheta2New)*timeStep;dTheta1=dTheta1New;dTheta2=dTheta2New;}
return[theta1,theta2];}
function drawPendulum(theta1,theta2){const l1=200,l2=150;
let x1=width/2+l1*Math.sin(theta1),y1=height/4+l1*Math.cos(theta1);
let x2=x1+l2*Math.sin(theta2),y2=y1+l2*Math.cos(theta2);trail.push([x2,y2]);
ctx.beginPath();ctx.moveTo(width/2,height/4);ctx.lineTo(x1,y1);ctx.stroke();
ctx.beginPath();ctx.moveTo(x1,y1);ctx.lineTo(x2,y2);ctx.stroke();ctx.fillRect(x2-5,y2-5,10,10);}
function loop(){animate();drawTrail();const[theta1New,theta2New]=integrate(10);
theta1=theta1New;theta2=theta2New;
drawPendulum(theta1,theta2);ctx.fillText(`Time: ${(Date.now()-restartTime)/1000} s`, 10, 20);
requestAnimationFrame(loop);}
requestAnimationFrame(loop);
</script></body></html>
```
qwen3:8bharness
No answer reached us (ERR) — 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:14bERRSTATFORMAT
Show code
```html
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Double Pendulum</title></head><style>body{margin:0;overflow:hidden;background:#111}canvas{display:block}</style><script>
const canvas = document.createElement('canvas');
document.body.appendChild(canvas);
const ctx = canvas.getContext('2d');

let L1 = 120, L2 = 120, M1 = 3, M2 = 3;
let x = [Math.PI/4, Math.PI/2]; // Initial angles (radians)
let v = [0, 0]; // Angular velocities
let timeElapsed = 0;

// Trail storage: [{x, y, alpha}]
let trail = [];
const MAX_TRAIL = 1500;

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

// Simple Euler integration for the double pendulum system
function updatePhysics(dt) {
    let c1 = Math.cos(x[0]);
    let s1 = Math.sin(x[0]);
    let c2 = Math.cos(x[1]);
    let s2 = Math.sin(x[1]);

    // Derived equations for angular accelerations (alpha_1, alpha_2)
    let num1 = M2 * (L1 * s1 * (s1 - 2 * c2 * c2)) + M2 * g * Math.sin(x[1]) * L2;
    let num2 = -M2 * L2 * s2 * Math.cos(x[1]);

    let den = L1 * (M1 + M2 * Math.sin(Math.pow(s1 - 2 * c2 * c2), 2) / (L2/L1)); // Simplified denominator structure
    
    // Highly compressed and derived equations for angular acceleration
    let a1_num = M2 * L2 * s2 * (s2 - Math.cos(x[0] - x[1]));
    a1_num += M2 * g * Math.sin(x[1]);
    a1_num *= 2;
    a1_num -= (M1 + M2) * g * Math.sin(x[0]);
    let a1_den = L2 * (L1 - L2 * c2 * c2);

    let a2_num = -(M2 / M1) * (Math.sin(x[0] - x[1]) * (a1_num + g));
    let a2_den = L2;


    // Simplified, stable set of equations for Euler integration:
    let delta = x[0] - x[1];
    let d = Math.cos(delta);

    let acc1 = (M2/M1) * (Math.sin(x[0]-x[1]) * (V[1]*v[1])/L2 + g*Math.sin(x[0]));
    acc1 = (-(g * Math.sin(x[0])) - M2/(M1+M2)*l2*(V[1]**2)/L2 * Math.sin(x[0]-x[1]) + M2/L2*Math.cos(x[0]-x[1])*((V[1]/L2)**2 * l2*Math.sin(x[0]-x[1])) ) / (l1);
    acc1 = ((g*(M1+M2)*Math.sin(x[0])) + M2*l2/l1*Math.sin(x[0]-x[1])*(V[1]**2)/L2) - g*Math.sin(x[0])) / l1;

    let acc2 = (-(g*Math.sin(x[1])/l2)* (M1+M2) + M2/l1 * Math.sin(x[0]-x[1])*(V[0]**2)/L1 ) / l2;
    acc2 = ((g*Math.sin(x[1])) - (M2/M1)*l1/(l2)*Math.sin(x[0]-x[1])*(V[0]/l1)**2) / l2;

    // Use simplified, robust set of equations derived from common physics simulations
    let delta_angle = x[0] - x[1];
    let d_cos = Math.cos(delta_angle);
    let d_sin = Math.sin(delta_angle);

    let a1 = (Math.g * (Math.sin(x[0]) * (M1 + M2) + M2 * Math.cos(d_cos) * V[1]**2 / L2 * d_sin) - M2 * g * Math.sin(x[1]) * d_cos) / (L1 * (L1 + L2 * d_cos * d_cos));
    let a2 = ((M2/M1) * (Math.sin(d_sin) * (V[0]**2 / L1 - g/L1 * Math.sin(x[0])) ) - g*Math.sin(x[1]) * d_cos) / (L2 * (L1 + L2 * d_cos * d_cos));
    
    // Final, simplified set of equations for better stability and length control:
    let t1 = x[0], t2 = x[1];
    let dt1 = v[0], dt2 = v[1];

    let num1 = -g * (M1 + M2) * Math.sin(t1) + M2 * g * Math.sin(t1 - 2*t2) + M2 * Math.sin(Math.pow(t1 - t2, 2)) * (L2 * dt2**2);
    let num2 = 2 * L1 * (M1 + M2) * Math.cos(t1 - t2) * (dt1*dt1)/L1 + Math.sin(t1 - t2) * M2 * L2 * (dt2*dt2)/L2;
    let den = L1 * (L1 + L2 * Math.cos(t1-t2)*Math.cos(t1-t2));

    // Using a known stable formulation:
    let d_x = x[0] - x[1];
    let c_d = Math.cos(d_x);

    let acc1 = (M2/M1) * (Math.sin(d_x) * (v[1]*v[1])/L2 + g*Math.cos(c_d)) - g*Math.cos(x[0]);
    acc1 /= L1;

    let acc2 = (-g/L2 * Math.sin(x[1]) + (M2/(M1+M2))*Math.sin(d_x)*((v[0]**2)/L1 - g/L1*Math.cos(c_d))) / L2;
    acc2 = acc2 / 1;

    let newV0 = v[0] + (acc1 * dt);
    let newV1 = v[1] + (acc2 * dt);

    x[0] += newV0 * dt;
    v[0] = newV0;

    x[1] += newV1 * dt;
    v[1] = newV1;
}


function draw() {
    // Fade the background slightly instead of clearing completely for trail effect
    ctx.fillStyle = 'rgba(17, 17, 17, 0.2)'; // Dark fade factor
    ctx.fillRect(0, 0, canvas.width, canvas.height);

    const t1x = L1 * Math.sin(x[0]);
    const t1y = -L1 * Math.cos(x[0]);
    const t2x = t1x + L2 * Math.sin(x[1]);
    const t2y = t1y - L2 * Math.cos(x[1]);

    // Draw Rods (Minimalistic)
    ctx.strokeStyle = '#aaa';
    ctx.lineWidth = 3;
    ctx.beginPath();
    ctx.moveTo(0, 0);
    ctx.lineTo(t1x, t1y);
    ctx.stroke();

    ctx.beginPath();
    ctx.moveTo(t1x, t1y);
    ctx.lineTo(t2x, t2y);
    ctx.stroke();

    // Draw Bobs
    const r = 8;
    ctx.fillStyle = '#ff6666';
    ctx.beginPath();
    ctx.arc(0, 0, r*Math.sqrt(M1), 0, Math.PI * 2); // Pivot
    ctx.fill();

    ctx.fillStyle = '#44ccff';
    ctx.beginPath();
    ctx.arc(t1x, t1y, r*Math.sqrt(M1), 0, Math.PI * 2); // Bob 1
    ctx.fill();

    ctx.fillStyle = '#66ccff';
    ctx.beginPath();
    ctx.arc(t2x, t2y, r*Math.sqrt(M2), 0, Math.PI * 2); // Bob 2 (Outer)
    ctx.fill();

    // Trail Drawing
    for (let i = 0; i < trail.length; i++) {
        const p = trail[i];
        ctx.fillStyle = `rgba(100, 204, 255, ${p.alpha})`;
        ctx.beginPath();
        ctx.arc(p.x, p.y, 3 * (1 - i / MAX_TRAIL), 0, Math.PI * 2);
        ctx.fill();
    }

    // Update Trail and Time Display
    trail.unshift({ x: t2x, y: t2y, alpha: 1.0 });
    if (trail.length > MAX_TRAIL) {
        trail.pop();
    }

    timeElapsed += 0.016;

    document.getElementById('timer')?.remove();
    const timer = document.createElement('div');
    timer.id = 'timer';
    timer.style.position = 'absolute';
    timer.style.bottom = '20px';
    timer.style.left = '50%';
    timer.style.transform = 'translateX(-50%)';
    timer.style.color = '#ccc';
    timer.style.fontFamily = 'monospace';
    timer.innerText = `Time: ${timeElapsed.toFixed(2)}s`;
    document.body.appendChild(timer);

}

// Restart logic
function resetSimulation() {
    x[0] = Math.PI * Math.random();
    x[1] = Math.PI * Math.random();
    v[0] = (Math.random() - 0.5) * 2;
    v[1] = (Math.random() - 0.5) * 2;
    timeElapsed = 0;
}

// Main loop setup
let lastTime = performance.now();
function loop(currentTime) {
    const dt = (currentTime - lastTime) / 1000; // Time step in seconds
    lastTime = currentTime;

    if (trail.length >= MAX_TRAIL * 0.8 || timeElapsed > 30) {
        resetSimulation();
        // Clear trail explicitly on restart to prevent massive accumulation
        trail = []; 
    }
    
    updatePhysics(dt);
    draw();

    requestAnimationFrame(loop);
}

// Initial setup and start
resetSimulation(); // Set initial random state
requestAnimationFrame(loop);

</script>
<div id="timer" style="position:absolute;bottom:20px;left:50%;transform:translateX(-50%);color:#ccc;font-family:monospace;">Time: 0.00s</div>
</body></html>
```
qwen3.5:9bERRBLANKFORMAT
Show code
```html
<!DOCTYPE html>
<html><head><title>Chaotic Double Pendulum</title></head><body style="margin:0;overflow:hidden"><canvas id="c"></canvas><script>const c=document.getElementById('c');const ctx=c.getContext('2d');c.width=800;c.height=600;let t=0,t_max=15;let x={};function init(){x.ang1=Math.random()*Math.PI*2;x.ang2=Math.random()*Math.PI*2;x.cos1=Math.cos(x.ang1);x.sin1=Math.sin(x.ang1);x.cos2=Math.cos(x.ang2);x.sin2=Math.sin(x.ang2);}}init();function update(){let L1=W=L2;let m1=M=m2=0.5;let d=c.width/4;let delta_a=x.ang1-x.ang2;let cA=Math.cos(delta_a);let sA=Math.sin(delta_a);let a1_dot,a2_dot,a1_ddot,a2_ddot;let d1=L1*m1;let d2=L1+L2;let w1=Math.cos(x.ang1)*d1;let w2=Math.sin(x.ang1)*d1;let x_p={};for(let i=0;i<3000;i++){if(t>t_max){init();t=0;}const L1=W=L2;const m1=M=m2=0.5;const d=c.width/4;let a1=x.ang1,a2=x.ang2;let cA=Math.cos(a1-a2);let sA=Math.sin(a1-a2);let delta_t=0.016;let v1=Math.sin(a1)*Math.cos(a1*L1/W)/d*m1+(Math.cos(a1)*Math.sin(a1*L1/W)/d)*(m1+M)*sA/(m1+M);let a_dot1=(m1*(w2*Math.cos(alpha)+...)
/* Physics equations are too long to type out efficiently in the limited space, opting for known stable approximations or heavily compressed structure */
// Recalculating with optimized representation:

function update(){
    const L1 = W = L2;
    const m1 = M = m2 = 0.5;
    let a1 = x.ang1, a2 = x.ang2;
    let cA = Math.cos(a1 - a2);
    let sA = Math.sin(a1 - a2);

    // Simplified Euler integration step for demonstration brevity (assuming small delta_t)
    const dt = 0.016; // Approx frame time
    
    // Calculate angular accelerations based on the full physics equations:
    let d_a1 = (m1 * L1 * Math.sin(a1 - a2) * ((L2 / L1) * (Math.cos(a1-a2) * 0) + Math.sin(a1-a2)));
    let d_a2 = (-m2 * L2 * Math.sin(a1 - a2) * ((L1 / L2) * (Math.cos(a1-a2) * 0) + Math.sin(a1-a2))) / m2;

    // Simplified update:
    let new_ang1 = a1 + dt * (d_a1/m1);
    let new_ang2 = a2 + dt * (d_a2/m2);

    x.ang1 = new_ang1;
    x.ang2 = new_ang2;
}

function draw(){ctx.clearRect(0, 0, c.width, c.height);}
function drawTrail(){/* Trail drawing logic */let trail={};if(!trail.points)trail.points=[];trail.points.push({x:p1.x,y:p1.y});if(trail.points.length>300){trail.points.shift();}ctx.strokeStyle="#88aadd";ctx.lineWidth=2;ctx.beginPath();for(let i=0;i<trail.points.length;i++){let p=trail.points[i];if(i===0)ctx.moveTo(p.x,p.y);else ctx.lineTo(p.x,p.y);}ctx.stroke();}
function loop(){t+=1/60;update();const dx1=Math.cos(x.ang1)*L1*d+c.width/2;const dy1=Math.sin(x.ang1)*L1*d+c.height/2;const dx2=(Math.cos(x.ang2)*L2*d+c.width/2);const dy2=(Math.sin(x.ang2)*L2*d+c.height/2);
let p1={x:dx1,y:dy1};
let p2={x:(Math.cos(x.ang2)*L2 + Math.cos(x.ang1)*L1) * d/W + c.width/2, y:(Math.sin(x.ang2)*L2 + Math.sin(x.ang1)*L1) * d/W + c.height/2};
let trail={};if(!trail.points)trail.points=[];trail.points.push({x:p2.x,y:p2.y});if(trail.points.length>300){trail.points.shift();}

ctx.save();
ctx.strokeStyle="#555";ctx.lineWidth=1;ctx.beginPath();for(let i=0;i<trail.points.length;i++){const p=trail.points[i];if(i===0)ctx.moveTo(p.x,p.y);else ctx.lineTo(p.x,p.y);}
ctx.globalAlpha = 0.1;ctx.stroke();
ctx.restore();

// Draw rods and masses (simplified drawing for character count)
ctx.strokeStyle="#333";ctx.lineWidth=2;ctx.beginPath();ctx.moveTo(c.width/2,c.height/2);ctx.lineTo(p1.x,p1.y);ctx.stroke();
ctx.strokeStyle="#333";ctx.lineWidth=2;ctx.beginPath();ctx.moveTo(p1.x,p1.y);ctx.lineTo(p2.x,p2.y);ctx.stroke();

// Update time counter (using a simple div for display)
let timerElement=document.createElement('div');timerElement.style.position='absolute';timerElement.style.bottom='10px';timerElement.style.left='10px';timerElement.style.color='#aaa';timerElement.innerHTML=`Time: 0.0s`;document.body.appendChild(timerElement);
timerElement.innerHTML=`Time: ${t.toFixed(2)}s`;

requestAnimationFrame(loop);
}
// Initial draw and start loop (using placeholder variables to meet constraints)
let L1=W=L2=10;let m1=M=m2=0.5;let d=c.width/4;
(function(){setInterval(()=>{t=0;init();document.querySelector('div').innerHTML=`Time: 0.0s`;if(!window.__running){window.__running=true}requestAnimationFrame(loop);},1000*t_max+500)}());

</script></body></html>
```
llama3.1:8bERRBLANKFORMAT
Show code
```html
<!DOCTYPE html>
<html>
<head>
<title>Double Pendulum</title>
<style>
body {
  margin: 0;
  background-color: #f2f2ff;
}
canvas {
  border: 1px solid black;
}
</style>
</head>
<body>
<script>
function doublePendulum() {
  var canvas = document.createElement('canvas');
  document.body.appendChild(canvas);
  canvas.width = canvas.height = 600;
  var ctx = canvas.getContext('2d');
  
  var m1Mass = 10, m2Mass = 5, m1AngleInitial = Math.random()*Math.PI*2, m2AngleInitial = Math.random()*Math.PI*2;
  var m1Length = 100, m2Length = 150;
  var theta1 = m1AngleInitial, theta2 = m2AngleInitial;
  
  function update() {
    if (m1Trail.length > 500) {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      m1Trail.shift();
      m2Trail.splice(m1Trail.length-20, 20);
      m1AngleInitial = Math.random()*Math.PI*2;
      m2AngleInitial = Math.random()*Math.PI*2;
    }
    
    m1AngleOld = theta1; m2AngleOld = theta2;
    var g = 9.81;
    var alpha1 = (m2Mass * m2Length * m2AngleOld * m2AngleOld * Math.sin(theta2 - theta1) + 
                 m2Mass * m2Length * g * Math.cos(theta1)) / (m1Mass * m1Length * (Math.pow(Math.cos(theta1 - theta2), 2)));
    var alpha2 = (-m1Mass * m1Length * m1AngleOld * m1AngleOld * Math.sin(theta1) + 
                 2 * (m1Mass + m2Mass) * m1Length * g * Math.cos(theta1)) / (m1Mass * m1Length * (Math.pow(Math.cos(theta1 - theta2), 2)));
    var theta1New = alpha1;
    var theta2New = alpha2;
    
    if (theta1New > Math.PI/4) {
      m2AngleInitial = Math.random()*Math.PI*2;
      update();
    }
    
    var x1New = m1Length * Math.sin(theta1);
    var y1New = -m1Length * Math.cos(theta1);
    var x2New = (x1New + m2Length * Math.sin(theta2)) / (1);
    var y2New = (y1New - m2Length * Math.cos(theta2)) / (1);
    
    ctx.beginPath();
    ctx.moveTo(m1Trail[m1Trail.length-1][0], m1Trail[m1Trail.length-1][1]);
    for (var i=0; i<m1Trail.length; i++) {
      ctx.lineTo(m1Trail[i][0], m1Trail[i][1]);
    }
    ctx.globalAlpha = 1-(m1Trail.length/500);
    ctx.strokeStyle = 'rgba(255, 0, 0, 0.5)';
    ctx.stroke();
    
    ctx.beginPath();
    ctx.arc(x2New, y2New, 5, 0, 2*Math.PI);
    ctx.fillStyle = 'blue';
    ctx.fill();
    m1Trail.push([x1New, y1New]);
    m2Trail.push([x2New, y2New]);
    
    theta1 += theta1New;
    theta2 += theta2New;
    
    var timer = 0;
    document.body.innerHTML = 'Elapsed time: '+ (timer += 100/60)+'s';
    
    setTimeout(function(){requestAnimationFrame(update);}, 1000 / 60);
  };
  
  var m1Trail = [], m2Trail = [];
  for (var i=0; i<10; i++) {
    m1Trail.push([Math.random()*canvas.width, Math.random()*canvas.height]);
    m2Trail.push([Math.random()*canvas.width, Math.random()*canvas.height]);
  }
  
  update();
}
doublePendulum();
</script>
</body>
</html>
```
qwen3-coder:30bERRBLANKMINIFIED
Show code
<!DOCTYPE html>
<html><head><title>Chaotic Double Pendulum</title></head><style>body{margin:0;overflow:hidden;background:#111}canvas{display:block}</style></head><body><canvas id="c"></canvas><script>const c=document.getElementById('c');const ctx=c.getContext('2d');ctx.lineWidth=2;let W=window.innerWidth,H=window.innerHeight;c.width=W;c.height=H;let t=0;let trail=[];let max_trail_len=500;let startAngle1=Math.PI/2;let startAngle2=Math.PI/2;function init(){t=0;trail=[];let g=9.8;let L1=W*0.3;let L2=W*0.3;let M1=1;let M2=1;let x1=L1,x2=L2;/* Initial velocities are zero */let theta1=startAngle1;let theta2=startAngle2;let w1=0;let w2=0;let dt=0.016;while(true){let d=L1*M1+L2*M2;if(trail.length>max_trail_len||Math.random()<0.95){theta1=Math.PI*(Math.random()*2-1);theta2=Math.PI*(Math.random()*2-1);w1=w2=0;t=0;}break}}function update(dt){let g=9.8,L1=W*0.3,L2=W*0.3,M1=1,M2=1;let t1=theta1,t2=theta2,w1=Math.cos(t1)*w1+Math.sin(t1)*w2,w2_prime=Math.sin(t1-t2);/* Euler integration for angular acceleration */let dw1_dt=(-(M2*g/L2)*Math.sin(t2) - (M2/L1)*(Math.cos(t1-t2)*w2*w2 + Math.sin(t1-t2)*w1*w1))/(M1+M2);let dw2_dt=(((M1-M2)/L2)*Math.cos(t1-t2)*w1*w1 + (M2/L2)*g*Math.sin(t1-t2))*(-0.5) - (M1/(L2*L1))*Math.sin(t1-t2)*(w1*w1+w2*w2));let dw1_dt_actual=-(g/L1)*Math.sin(t1)+((M2/L1)*(Math.sin(t1-t2)*Math.cos(t1-t2))*(w2*w2*(1-Math.cos(t1-t2)))+(w1*w1*Math.cos(t1-t2))*Math.sin(t1-t2))/(L1*(M1+M2))-(g/L1)*Math.sin(t1)+((M2*L2/(L1*(M1+M2))) * Math.sin(t1-t2) * (w2*w2*(1-Math.cos(t1-t2))) + ...) ; /* Simplified ODEs for brevity and speed */ let delta=t1-t2;let num1=-(g/L1)*Math.sin(t1)+((M2/L1)*(Math.sin(delta)*Math.cos(delta))*(w2*w2*(1-Math.cos(delta)))+(w1*w1*Math.cos(delta)*Math.sin(delta))/(L1*(M1+M2)));let num2=(-g/L2)*Math.sin(t2)+((M2/(L2*L1))*Math.sin(delta)*(w1*w1*Math.cos(delta)+(w1*w1+w2*w2-M1)/(M2))+(...)); /* Reverting to a standard, accepted ODE formulation */ let D=g*(M1+M2)/L2;let E=(M2/L1)*Math.sin(delta)*(w2*w2*(1-Math.cos(delta))) + (w1*w1*Math.cos(delta)*Math.sin(delta))/(L1*(M1+M2)); let F=-(g/L2)*Math.sin(t2) - ((M1/(L2*L1))*Math.sin(delta)*(w1*w1*Math.cos(delta)+(w1*w1+w2*w2-M1)/(M2))) ; /* Simplified and corrected ODEs */ let dtheta1=w1;let dw1_dt=(-g/L1)*Math.sin(t1)+((M2/L1)*(Math.sin(delta)*Math.cos(delta))*(w2*w2*(1-Math.cos(delta)))+(w1*w1*Math.cos(delta)*Math.sin(delta))/(L1*(M1+M2)));let dtheta2=w2;let dw2_dt=(-g/L2)*Math.sin(t2)+((M1/(L2*L1))*Math.sin(delta)*(w1*w1*Math.cos(delta)+(w1*w1+w2*w2-M1)/(M2))-(...)); /* Final simplified, proven version */ let dth1=w1;let dwth1_dt=(-g/L1)*Math.sin(t1)+((m2/l1)*(Math.sin(delta)*Math.cos(delta))*(w2*w2*(1-Math.cos(delta)))+(w1*w1*Math.cos(delta)*Math.sin(delta))/(l1*(m1+m2)));let dth2=w2;let dwth2_dt=(-g/l2)*Math.sin(t2)+((m1/(l2*l1))*Math.sin(delta)*(w1*w1*Math.cos(delta)+(w1*w1+w2*w2-m1)/(m2))).toFixed(5); /* Must ensure variable names are short and consistent */ let g=9.8,L1=W*0.3,L2=W*0.3,M1=1,M2=1;let s=Math.sin(t1-t2),c=Math.cos(t1-t2);let dtheta1_dt=w1;let dw1_dt=(-g/L1)*Math.sin(t1)+((M2/L1)*(s*c)*(w2*w2*(1-c))+(w1*w1*c*s)/(L1*(M1+M2)));let dtheta2_dt=w2;let dw2_dt=(-g/L2)*Math.sin(t2)+((M1/(L2*L1))*s*(w1*w1*c+(w1*w1+w2*w2-M1)/(M2)));/* Euler Step */ t1+=dtheta1_dt*dt;t2+=dtheta2_dt*dt;w1+=dw1_dt*dt;w2+=dw2_dt*dt;}function draw(){let x0=W/2;let y0=H/2;let px1=x0+L1*Math.cos(t1);let py1=y0+L1*Math.sin(t1);let px2=px1+L2*Math.cos(t2);let py2=py1+L2*Math.sin(t2);/* Draw Trail */ctx.globalAlpha=0.7;for(let i=0;i<trail.length;i++){let p=trail[i];ctx.fillStyle=`rgba(255,255,255,${(i/trail.length)*0.8})`;ctx.beginPath();ctx.arc(p[0],p[1],1+(i/trail.length)*1.5,0,Math.PI*2);ctx.fill()}/* Draw Rods */ctx.strokeStyle=`rgba(255, 255, 255, 0.8)`;ctx.beginPath();ctx.moveTo(x0,y0);ctx.lineTo(px1,py1);ctx.stroke();ctx.beginPath();ctx.moveTo(px1,py1);ctx.lineTo(px2,py2);ctx.stroke();/* Draw Bobs */ctx.fillStyle=`rgb(255, 100, 0)`;ctx.fillRect(px1-5,py1-5,10,10);ctx.fillStyle=`rgb(0, 150, 255)`;ctx.fillRect(px2-5,py2-5,10,10);/* Record position */trail.push([px2, py2]);if(trail.length>max_trail_len)trail.shift();}function loop(){update(0.016);draw();requestAnimationFrame(loop);}init();loop();</script></body></html>
gemma4:26bharness
No answer reached us (ERR) — 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.
deepseek-r1:32bOKFORMAT
Show code
```html
<!DOCTYPE html><html><head><title>Double Pendulum</title><style>canvas{border:1px solid black}#timer{position:absolute;left:20px;top:20px;color:white;font-family:sans-serif}</style></head><body>
<canvas id="c"></canvas><div id="timer">Time: 0s</div>
<script>
const canvas = document.getElementById('c');
const ctx = canvas.getContext('2d');
const timerDisplay = document.getElementById('timer');

canvas.width = 800;
canvas.height = 600;

let m1 = 10, m2 = 10;
let l1 = 150, l2 = 150;
let dampening = 0.995;
let gravity = 0.1;

let x1, y1, x2, y2;
let angle1, angle2, angVel1, angVel2, angAcc1, angAcc2;

let trailPoints = [];
const maxTrailLength = 50;

let startTime = Date.now();
let elapsed = 0;

function initPendulum() {
    angle1 = Math.random() * Math.PI * 2;
    angle2 = Math.random() * Math.PI * 2;
    angVel1 = 0;
    angVel2 = 0;
    angAcc1 = 0;
    angAcc2 = 0;
    x1 = canvas.width/2 + l1 * Math.sin(angle1);
    y1 = canvas.height/4 + l1 * Math.cos(angle1);
    x2 = x1 + l2 * Math.sin(angle2);
    y2 = y1 + l2 * Math.cos(angle2);
    trailPoints = [];
    startTime = Date.now();
}

function updatePendulum() {
    let num1 = -gravity*(2*m1 + m2)*Math.sin(angle1) - m2*gravity*Math.sin(angle1-2*angle2) - 2*Math.sin(angle1-angle2)*m2*angVel2*angVel2;
    num1 /= l1*(2*m1 + m2);
    
    let den2 = (l2/l1)*(Math.cos(angle1-angle2));
    angAcc1 = num1 - den2 * angAcc2;

    let num2 = (2*Math.sin(angle1-angle2))*angVel1*angVel1*l1;
    num2 += gravity*(2*m1 + m2)*Math.cos(angle1) + m2*gravity*Math.cos(angle1-2*angle2);
    num2 /= l2*(2*m1 + m2);
    
    angAcc2 = num2 / Math.sin(angle1 - angle2);

    angVel1 += angAcc1;
    angVel2 += angAcc2;

    angVel1 *= dampening;
    angVel2 *= dampening;

    if (Math.abs(angVel1) < 0.005 && Math.abs(angVel2) < 0.005) {
        initPendulum();
        return;
    }

    angle1 += angVel1 + angAcc1/2;
    angle2 += angVel2 + angAcc2/2;

    x1 = canvas.width/2 + l1 * Math.sin(angle1);
    y1 = canvas.height/4 + l1 * Math.cos(angle1);
    x2 = x1 + l2 * Math.sin(angle2);
    y2 = y1 + l2 * Math.cos(angle2);

    trailPoints.unshift({x: x2, y: y2});
    if (trailPoints.length > maxTrailLength) {
        trailPoints.pop();
    }
}

function draw() {
    elapsed = (Date.now() - startTime)/1000;
    timerDisplay.textContent = `Time: ${elapsed.toFixed(1)}s`;

    ctx.fillStyle = 'rgba(0, 0, 0, 0.1)';
    ctx.fillRect(0, 0, canvas.width, canvas.height);

    // Draw trail
    ctx.beginPath();
    ctx.strokeStyle = 'rgba(255, 255, 255, 0.5)';
    for (let i = 0; i < trailPoints.length; i++) {
        let point = trailPoints[i];
        if (i === 0) {
            ctx.moveTo(point.x, point.y);
        } else {
            ctx.lineTo(point.x, point.y);
        }
        // Fade older points
        ctx.strokeStyle = `rgba(255, 255, 255, ${1 - i/maxTrailLength})`;
    }
    ctx.lineWidth = 2;
    ctx.stroke();

    // Draw pendulum
    ctx.beginPath();
    ctx.strokeStyle = 'white';
    ctx.lineWidth = 4;

    // Ceiling to first mass
    ctx.moveTo(canvas.width/2, canvas.height/4);
    ctx.lineTo(x1, y1);

    // First to second mass
    ctx.moveTo(x1, y1);
    ctx.lineTo(x2, y2);

    ctx.stroke();

    // Draw masses
    ctx.fillStyle = 'white';
    ctx.beginPath();
    ctx.arc(x1, y1, Math.sqrt(m1)*4, 0, 2*Math.PI);
    ctx.arc(x2, y2, Math.sqrt(m2)*4, 0, 2*Math.PI);
    ctx.fill();

    requestAnimationFrame(draw);
}

initPendulum();
draw();
</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.
Outside the Brain cluster — same task, same character budget, collected through their own tooling (response times not comparable)
Claude Opus 5frontier referenceOK
Show code
<!doctype html>
<html lang="en">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Chaotic Double Pendulum</title>
<style>
html,body{margin:0;height:100%;background:#06080f;overflow:hidden}
canvas{display:block}
#hud{position:fixed;top:16px;left:18px;font:600 20px/1.2 ui-monospace,SFMono-Regular,Menlo,monospace;color:#a9dcff;text-shadow:0 0 14px rgba(40,140,220,.7);pointer-events:none}
#hud b{display:block;font:600 10px/1.6 ui-monospace,monospace;color:#5d7796;letter-spacing:.24em;text-transform:uppercase}
</style>
<canvas id=c></canvas>
<div id=hud><b>elapsed</b><span id=s>0.00 s</span></div>
<script>
const c=document.getElementById('c'),x=c.getContext('2d'),S=document.getElementById('s');
let W,H;
function fit(){const d=Math.min(2,devicePixelRatio||1);W=innerWidth;H=innerHeight;c.width=W*d;c.height=H*d;c.style.width=W+'px';c.style.height=H+'px';x.setTransform(d,0,0,d,0,0)}
addEventListener('resize',fit);fit();
const G=9.81;
let a1,a2,w1,w2,L1,L2,m1,m2,tr,t0,hue,len;
function reset(f){
 a1=f?2.2:(1.0+Math.random()*1.9)*(Math.random()<.5?-1:1);
 a2=f?1.8:(1.0+Math.random()*2.0)*(Math.random()<.5?-1:1);
 w1=w2=0;L1=1;L2=.85+Math.random()*.3;m1=1+Math.random();m2=.8+Math.random();
 tr=[];t0=0;len=0;hue=Math.random()*360;
}
reset(1);
function der(s){
 const A=s[0],B=s[1],U=s[2],V=s[3],d=A-B,sd=Math.sin(d),cd=Math.cos(d),
 D=2*m1+m2-m2*Math.cos(2*d);
 return[U,V,
 (-G*(2*m1+m2)*Math.sin(A)-m2*G*Math.sin(A-2*B)-2*sd*m2*(V*V*L2+U*U*L1*cd))/(L1*D),
 (2*sd*(U*U*L1*(m1+m2)+G*(m1+m2)*Math.cos(A)+V*V*L2*m2*cd))/(L2*D)];
}
function step(h){
 const s=[a1,a2,w1,w2],k1=der(s),
 k2=der(s.map((v,i)=>v+h/2*k1[i])),
 k3=der(s.map((v,i)=>v+h/2*k2[i])),
 k4=der(s.map((v,i)=>v+h*k3[i])),
 o=s.map((v,i)=>v+h/6*(k1[i]+2*k2[i]+2*k3[i]+k4[i]));
 a1=o[0];a2=o[1];w1=o[2];w2=o[3];
}
function bob(px,py,r,h){
 const g=x.createRadialGradient(px-r*.35,py-r*.35,r*.15,px,py,r);
 g.addColorStop(0,'#fff');g.addColorStop(.4,'hsl('+h+',95%,68%)');g.addColorStop(1,'hsl('+h+',85%,32%)');
 x.fillStyle=g;x.beginPath();x.arc(px,py,r,0,7);x.fill();
}
let last=0;
function frame(now){
 requestAnimationFrame(frame);
 if(!last)last=now;
 let dt=Math.min(.04,(now-last)/1000);last=now;t0+=dt;
 const R=Math.min(W,H)*.2,cx=W/2,cy=H*.36,N=10,h=dt/N;
 for(let i=0;i<N;i++){
  step(h);
  const px=cx+R*L1*Math.sin(a1)+R*L2*Math.sin(a2),
        py=cy+R*L1*Math.cos(a1)+R*L2*Math.cos(a2),
        p=tr[tr.length-1];
  if(p)len+=Math.hypot(px-p[0],py-p[1]);
  tr.push([px,py]);
 }
 while(tr.length>2200)tr.shift();
 x.fillStyle='#06080f';x.fillRect(0,0,W,H);
 x.lineJoin=x.lineCap='round';
 const n=tr.length,CH=24;
 for(let i=0;i<n-1;i+=CH){
  const e=Math.min(n-1,i+CH),a=i/n;
  x.beginPath();x.moveTo(tr[i][0],tr[i][1]);
  for(let j=i+1;j<=e;j++)x.lineTo(tr[j][0],tr[j][1]);
  x.strokeStyle='hsla('+((hue+a*90)%360)+',96%,'+(42+a*26)+'%,'+(a*a*.8+.03)+')';
  x.lineWidth=.6+a*2.1;x.stroke();
 }
 const x1=cx+R*L1*Math.sin(a1),y1=cy+R*L1*Math.cos(a1),
       x2=x1+R*L2*Math.sin(a2),y2=y1+R*L2*Math.cos(a2);
 x.strokeStyle='rgba(190,220,255,.28)';x.lineWidth=7;
 x.beginPath();x.moveTo(cx,cy);x.lineTo(x1,y1);x.lineTo(x2,y2);x.stroke();
 x.strokeStyle='rgba(225,240,255,.92)';x.lineWidth=2.2;
 x.beginPath();x.moveTo(cx,cy);x.lineTo(x1,y1);x.lineTo(x2,y2);x.stroke();
 x.fillStyle='#7f95b4';x.beginPath();x.arc(cx,cy,5,0,7);x.fill();
 bob(x1,y1,6+m1*3,(hue+20)%360);
 bob(x2,y2,6+m2*4,(hue+95)%360);
 S.textContent=t0.toFixed(2)+' s';
 if(len>R*46||t0>26)reset(0);
}
requestAnimationFrame(frame);
</script>
</html>
GPT-5.5 (Codex)frontier referenceOK
Show code
<!doctype html><html><head><meta charset=utf-8><title>Double Pendulum</title><style>html,body{margin:0;height:100%;overflow:hidden;background:#08090d;color:#e8edf2;font:16px system-ui}canvas{display:block}#t{position:fixed;left:16px;top:12px;padding:6px 10px;background:#0008;border:1px solid #fff2;border-radius:6px}</style></head><body><canvas id=c></canvas><div id=t>0.0 s</div><script>
let c=document.getElementById("c"),x=c.getContext("2d"),T=document.getElementById("t"),W,H,S,trail=[];
function size(){W=c.width=innerWidth;H=c.height=innerHeight;S=Math.min(W,H)/5}
onresize=size;size();
let st,last=0,born=0;
function reset(now){
 let r=Math.random;
 st={a1:1.95+r()*.5,a2:2.55+r()*.45,v1:0,v2:0,m1:1,m2:1,l1:S,l2:S,g:980};
 trail=[];born=now
}
function step(dt){
 let p=st,m1=p.m1,m2=p.m2,l1=p.l1,l2=p.l2,a1=p.a1,a2=p.a2,v1=p.v1,v2=p.v2,g=p.g;
 let f=s=>{
  let a1=s[0],a2=s[1],v1=s[2],v2=s[3],d=a1-a2,den=2*m1+m2-m2*Math.cos(2*d);
  let n1=-g*(2*m1+m2)*Math.sin(a1)-m2*g*Math.sin(a1-2*a2)-2*Math.sin(d)*m2*(v2*v2*l2+v1*v1*l1*Math.cos(d));
  let n2=2*Math.sin(d)*(v1*v1*l1*(m1+m2)+g*(m1+m2)*Math.cos(a1)+v2*v2*l2*m2*Math.cos(d));
  return [v1,v2,n1/(l1*den),n2/(l2*den)]
 },y=[a1,a2,v1,v2],k1=f(y),k2=f(y.map((q,i)=>q+k1[i]*dt/2)),k3=f(y.map((q,i)=>q+k2[i]*dt/2)),k4=f(y.map((q,i)=>q+k3[i]*dt));
 [p.a1,p.a2,p.v1,p.v2]=y.map((q,i)=>q+dt*(k1[i]+2*k2[i]+2*k3[i]+k4[i])/6)
}
function pos(){
 let ox=W/2,oy=H*.28,x1=ox+st.l1*Math.sin(st.a1),y1=oy+st.l1*Math.cos(st.a1),x2=x1+st.l2*Math.sin(st.a2),y2=y1+st.l2*Math.cos(st.a2);
 return [ox,oy,x1,y1,x2,y2]
}
function loop(now){
 if(!last)reset(now),last=now;
 let dt=Math.min((now-last)/1000,.03);last=now;
 for(let i=0;i<3;i++)step(dt/3);
 let p=pos();trail.push([p[4],p[5]]);
 if(trail.length>1800){
  let n=80,cross=0;
  for(let i=trail.length-n;i<trail.length-3;i++)for(let j=i+2;j<trail.length-1;j++){
   let a=trail[i],b=trail[i+1],d=trail[j],e=trail[j+1],u=(e[0]-d[0])*(a[1]-d[1])-(e[1]-d[1])*(a[0]-d[0]),v=(e[0]-d[0])*(b[1]-d[1])-(e[1]-d[1])*(b[0]-d[0]),r=(b[0]-a[0])*(d[1]-a[1])-(b[1]-a[1])*(d[0]-a[0]),s=(b[0]-a[0])*(e[1]-a[1])-(b[1]-a[1])*(e[0]-a[0]);
   if(u*v<0&&r*s<0)cross++
  }
  if(trail.length>2400||cross>180)reset(now)
 }
 x.fillStyle="#08090d";x.fillRect(0,0,W,H);
 x.lineWidth=1.4;
 for(let i=1;i<trail.length;i++){let a=i/trail.length;x.strokeStyle="rgba(48,220,180,"+(a*.5)+")";x.beginPath();x.moveTo(trail[i-1][0],trail[i-1][1]);x.lineTo(trail[i][0],trail[i][1]);x.stroke()}
 x.lineCap="round";x.strokeStyle="#d9dee7";x.lineWidth=3;x.beginPath();x.moveTo(p[0],p[1]);x.lineTo(p[2],p[3]);x.lineTo(p[4],p[5]);x.stroke();
 x.fillStyle="#f1c44f";x.beginPath();x.arc(p[2],p[3],13,0,7);x.fill();
 x.fillStyle="#f15f5f";x.beginPath();x.arc(p[4],p[5],15,0,7);x.fill();
 x.fillStyle="#b8c0cc";x.beginPath();x.arc(p[0],p[1],5,0,7);x.fill();
 T.textContent=((now-born)/1000).toFixed(1)+" s";
 requestAnimationFrame(loop)
}
requestAnimationFrame(loop)
</script></body></html>
Claude Sonnet 5frontier referenceOK
Show code
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Double Pendulum</title>
<style>
html,body{margin:0;background:#000;overflow:hidden;height:100%}
canvas{display:block}
#t{position:fixed;top:10px;left:12px;color:#7fffa0;font:15px monospace;text-shadow:0 0 4px #000}
</style></head>
<body>
<canvas id="c"></canvas><div id="t"></div>
<script>
const c=document.getElementById('c'),ctx=c.getContext('2d'),td=document.getElementById('t');
function rs(){c.width=innerWidth;c.height=innerHeight;ctx.fillStyle='#000';ctx.fillRect(0,0,c.width,c.height);}
addEventListener('resize',rs);

const m1=12,m2=12,l1=Math.min(innerWidth,innerHeight)*0.16,l2=l1,g=1400;
let a1,a2,w1,w2,t0,px,py,hue,maxT,steps;

function reset(){
  a1=Math.random()*Math.PI*2-Math.PI;
  a2=Math.random()*Math.PI*2-Math.PI;
  w1=0;w2=0;
  t0=performance.now();
  hue=Math.random()*360;
  maxT=18+Math.random()*10;
  steps=0;
  px=null;py=null;
  rs();
}
reset();

function deriv(a1,a2,w1,w2){
  const d=2*m1+m2-m2*Math.cos(2*a1-2*a2);
  const n1=-g*(2*m1+m2)*Math.sin(a1)-m2*g*Math.sin(a1-2*a2)-2*Math.sin(a1-a2)*m2*(w2*w2*l2+w1*w1*l1*Math.cos(a1-a2));
  const n2=2*Math.sin(a1-a2)*(w1*w1*l1*(m1+m2)+g*(m1+m2)*Math.cos(a1)+w2*w2*l2*m2*Math.cos(a1-a2));
  return [w1,w2,n1/(l1*d),n2/(l2*d)];
}

function rk4(dt){
  const k1=deriv(a1,a2,w1,w2);
  const k2=deriv(a1+k1[0]*dt/2,a2+k1[1]*dt/2,w1+k1[2]*dt/2,w2+k1[3]*dt/2);
  const k3=deriv(a1+k2[0]*dt/2,a2+k2[1]*dt/2,w1+k2[2]*dt/2,w2+k2[3]*dt/2);
  const k4=deriv(a1+k3[0]*dt,a2+k3[1]*dt,w1+k3[2]*dt,w2+k3[3]*dt);
  a1+=dt/6*(k1[0]+2*k2[0]+2*k3[0]+k4[0]);
  a2+=dt/6*(k1[1]+2*k2[1]+2*k3[1]+k4[1]);
  w1+=dt/6*(k1[2]+2*k2[2]+2*k3[2]+k4[2]);
  w2+=dt/6*(k1[3]+2*k2[3]+2*k3[3]+k4[3]);
}

function frame(){
  requestAnimationFrame(frame);
  const cx=c.width/2, cy=c.height*0.38;
  const dt=0.006;
  for(let i=0;i<5;i++)rk4(dt);
  steps++;

  const x1=cx+l1*Math.sin(a1), y1=cy+l1*Math.cos(a1);
  const x2=x1+l2*Math.sin(a2), y2=y1+l2*Math.cos(a2);

  if(!isFinite(x2)||!isFinite(y2)){reset();return;}

  ctx.fillStyle='rgba(0,0,0,0.045)';
  ctx.fillRect(0,0,c.width,c.height);

  if(px!==null){
    hue+=0.15;
    ctx.strokeStyle='hsla('+(hue%360)+',90%,60%,0.85)';
    ctx.lineWidth=1.6;
    ctx.beginPath();
    ctx.moveTo(px,py);
    ctx.lineTo(x2,y2);
    ctx.stroke();
  }
  px=x2;py=y2;

  ctx.strokeStyle='rgba(220,220,230,0.9)';
  ctx.lineWidth=2;
  ctx.beginPath();
  ctx.moveTo(cx,cy);ctx.lineTo(x1,y1);ctx.lineTo(x2,y2);
  ctx.stroke();

  ctx.fillStyle='#fff';
  ctx.beginPath();ctx.arc(cx,cy,3,0,7);ctx.fill();
  ctx.beginPath();ctx.arc(x1,y1,m1*0.7,0,7);ctx.fill();
  ctx.beginPath();ctx.arc(x2,y2,m2*0.7,0,7);ctx.fill();

  const el=(performance.now()-t0)/1000;
  td.textContent='t = '+el.toFixed(1)+'s';

  if(el>maxT||steps>6000)reset();
}
requestAnimationFrame(frame);
</script>
</body></html>
Claude Fable 5frontier referenceOK
Show code
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Double Pendulum</title>
<style>
html,body{margin:0;height:100%;background:#0b0e14;overflow:hidden}
canvas{display:block;width:100vw;height:100vh}
#hud{position:fixed;top:12px;left:14px;color:#9fd8ff;font:14px/1.4 monospace;
background:rgba(10,15,25,.55);padding:8px 12px;border-radius:8px;pointer-events:none}
</style>
</head>
<body>
<canvas id="c"></canvas>
<div id="hud">t = 0.0 s</div>
<script>
(function(){
"use strict";
var cv=document.getElementById("c"),ctx=cv.getContext("2d"),hud=document.getElementById("hud");
var W,H,CX,CY,SC;
function resize(){
  var d=Math.min(2,window.devicePixelRatio||1);
  W=window.innerWidth;H=window.innerHeight;
  cv.width=W*d;cv.height=H*d;
  ctx.setTransform(d,0,0,d,0,0);
  CX=W/2;CY=H*0.34;
  SC=Math.min(W,H)*0.42;
}
window.addEventListener("resize",resize);
resize();

var g=9.81,m1=1.2,m2=1.0,L1=1.0,L2=1.0;
var a1,a2,w1,w2,startTime,trail,pathLen,turnSum,prevAng,haveAng;

function reset(first){
  a1=(first?2.4:Math.PI*0.55+Math.random()*Math.PI*0.9)*(Math.random()<0.5&&!first?-1:1);
  a2=first?2.9:(Math.random()*2-1)*Math.PI;
  w1=0;w2=0;
  trail=[];pathLen=0;turnSum=0;haveAng=false;
  startTime=performance.now();
}
reset(true);

function deriv(s){
  var t1=s[0],t2=s[1],o1=s[2],o2=s[3];
  var d=t1-t2,cd=Math.cos(d),sd=Math.sin(d);
  var M=m1+m2;
  var den=L1*(M-m2*cd*cd);
  var A1=(-g*M*Math.sin(t1)-m2*g*Math.sin(t1-2*t2)
    -2*sd*m2*(o2*o2*L2+o1*o1*L1*cd))/(2*den);
  var den2=L2*(M-m2*cd*cd);
  var A2=(2*sd*(o1*o1*L1*M+g*M*Math.cos(t1)
    +o2*o2*L2*m2*cd))/(2*den2);
  return [o1,o2,A1,A2];
}
function rk4(h){
  var s=[a1,a2,w1,w2];
  var k1=deriv(s);
  var s2=[s[0]+h/2*k1[0],s[1]+h/2*k1[1],s[2]+h/2*k1[2],s[3]+h/2*k1[3]];
  var k2=deriv(s2);
  var s3=[s[0]+h/2*k2[0],s[1]+h/2*k2[1],s[2]+h/2*k2[2],s[3]+h/2*k2[3]];
  var k3=deriv(s3);
  var s4=[s[0]+h*k3[0],s[1]+h*k3[1],s[2]+h*k3[2],s[3]+h*k3[3]];
  var k4=deriv(s4);
  a1+=h/6*(k1[0]+2*k2[0]+2*k3[0]+k4[0]);
  a2+=h/6*(k1[1]+2*k2[1]+2*k3[1]+k4[1]);
  w1+=h/6*(k1[2]+2*k2[2]+2*k3[2]+k4[2]);
  w2+=h/6*(k1[3]+2*k2[3]+2*k3[3]+k4[3]);
}

var MAXTRAIL=900;
var last=performance.now(),acc=0,DT=1/240;

function frame(now){
  var el=Math.min(0.05,(now-last)/1000);
  last=now;
  acc+=el;
  while(acc>DT){rk4(DT);acc-=DT;}

  var r1=L1*SC/(L1+L2),r2=L2*SC/(L1+L2);
  var x1=CX+r1*Math.sin(a1),y1=CY+r1*Math.cos(a1);
  var x2=x1+r2*Math.sin(a2),y2=y1+r2*Math.cos(a2);

  var n=trail.length;
  if(n>0){
    var p=trail[n-1],dx=x2-p[0],dy=y2-p[1];
    var seg=Math.hypot(dx,dy);
    if(seg>1.5){
      pathLen+=seg;
      var ang=Math.atan2(dy,dx);
      if(haveAng){
        var da=ang-prevAng;
        while(da>Math.PI)da-=2*Math.PI;
        while(da<-Math.PI)da+=2*Math.PI;
        turnSum+=Math.abs(da);
      }
      prevAng=ang;haveAng=true;
      trail.push([x2,y2]);
    }
  }else trail.push([x2,y2]);
  if(trail.length>MAXTRAIL)trail.shift();

  if(pathLen>SC*40||turnSum>140)reset(false);

  ctx.fillStyle="#0b0e14";
  ctx.fillRect(0,0,W,H);

  n=trail.length;
  ctx.lineCap="round";ctx.lineJoin="round";
  for(var i=1;i<n;i++){
    var f=i/n;
    ctx.strokeStyle="rgba("+Math.round(80+175*f)+","+Math.round(180*f+40)+",255,"+(f*f*0.85).toFixed(3)+")";
    ctx.lineWidth=0.6+2*f;
    ctx.beginPath();
    ctx.moveTo(trail[i-1][0],trail[i-1][1]);
    ctx.lineTo(trail[i][0],trail[i][1]);
    ctx.stroke();
  }

  ctx.strokeStyle="#d7e3f4";
  ctx.lineWidth=3;
  ctx.beginPath();
  ctx.moveTo(CX,CY);ctx.lineTo(x1,y1);ctx.lineTo(x2,y2);
  ctx.stroke();

  ctx.fillStyle="#5a6b85";
  ctx.beginPath();ctx.arc(CX,CY,5,0,7);ctx.fill();
  ctx.fillStyle="#ffd166";
  ctx.beginPath();ctx.arc(x1,y1,9,0,7);ctx.fill();
  ctx.fillStyle="#7fd8ff";
  ctx.shadowColor="#7fd8ff";ctx.shadowBlur=14;
  ctx.beginPath();ctx.arc(x2,y2,8,0,7);ctx.fill();
  ctx.shadowBlur=0;

  hud.textContent="t = "+((now-startTime)/1000).toFixed(1)+" s";
  requestAnimationFrame(frame);
}
requestAnimationFrame(frame);
})();
</script>
</body>
</html>
Claude Haiku 4.5frontier referenceERRBLANKMINIFIED
Show code
<!DOCTYPE html><html><head><meta charset="utf-8"><style>body{margin:0;background:#000}#t{position:absolute;top:10px;left:10px;color:#0f0;font:18px monospace}</style></head><body><div id="t">0s</div><canvas id="c"></canvas><script>const c=document.getElementById('c'),x=c.getContext('2d');c.width=innerWidth;c.height=innerHeight;let trail=[],tm=0;const L=150,g=9.81;let s=[0,0,0,0];function init(){s=[(Math.random()-.5)*3.14,0,(Math.random()-.5)*3.14,0];trail=[];tm=0}function f(s){let[a,w,b,v]=s,D=b-a,sd=Math.sin(D),cd=Math.cos(D);let den=(3-Math.cos(2*D))*L;let dw=(-3*g*Math.sin(a)-g*Math.sin(b-2*a)-2*sd*(v*v*L+w*w*L*cd))/(2*den);let dv=(2*sd*(w*w*2*L+2*g*Math.cos(a)+v*v*L*cd))/(2*L*den);return[w,dw,v,dv]}function rk4(s,dt){let k1=f(s),s1=s.map((v,i)=>v+k1[i]*dt/2),k2=f(s1),s2=s.map((v,i)=>v+k2[i]*dt/2),k3=f(s2),s3=s.map((v,i)=>v+k3[i]*dt),k4=f(s3);return s.map((v,i)=>v+(k1[i]+2*k2[i]+2*k3[i]+k4[i])*dt/6)}function p(){let[a,,b]=s,cx=c.width/2,cy=c.height/2,x1=cx+L*Math.sin(a),y1=cy+L*Math.cos(a);return{x1,y1,x2:x1+L*Math.sin(b),y2:y1+L*Math.cos(b)}}function anim(){s=rk4(s,.02);let{x2,y2}=p();trail.push([x2,y2]);if(trail.length>5000)trail.shift();tm+=.02;x.fillStyle='#000';x.fillRect(0,0,c.width,c.height);for(let i=0;i<trail.length;i++){x.fillStyle=`rgba(0,255,0,${i/trail.length*.5})`;x.fillRect(trail[i][0]-1,trail[i][1]-1,2,2)}let{x1,y1,x2,y2}=p(),cx=c.width/2,cy=c.height/2;x.strokeStyle='#0f0';x.lineWidth=2;x.beginPath();x.moveTo(cx,cy);x.lineTo(x1,y1);x.lineTo(x2,y2);x.stroke();x.fillStyle='#0f0';x.beginPath();x.arc(x1,y1,5,0,6.28);x.fill();x.arc(x2,y2,5,0,6.28);x.fill();document.getElementById('t').textContent=tm.toFixed(1)+'s';if(trail.length>4500)init();requestAnimationFrame(anim)}init();anim();</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 220.4 sOK
mistral-small:24b 29.9 sOK
qwen3:8b harness
qwen3:14b 60.5 sOK
qwen3.5:9b 66.2 sOK
llama3.1:8b 18.6 sOK
qwen3-coder:30b 31.3 sOK
gemma4:26b harness
deepseek-r1:32b 245.7 sOK
command-r:35b DNF
qwq:32b DNF