27:18Gemini 4 Hydrogen: Cheaper Tokens, More Expensive Answers?
Nov 13, 2026 · YouTube
18:40ERNIE 5.5 Flash Preview vs GLM 5.3 Flash: Baidu's new model is very impressive!
Nov 11, 2026 · YouTube
36:22Fable 5.2 robbing me blind, plus: Nex AGI's N2.6 vs GLM 5.3 Flash
Nov 11, 2026 · YouTube
14:03Gemini 4 Carbon: Can it handle my challenges? (First look with one-shot coding tests)
Nov 10, 2026 · YouTube
47:51Ranking major U.S. Open-Weights Models. (Where does Ripple 65B fit in?)
Nov 6, 2026 · YouTube
10:57"Crouton Alpha": the latest super-efficient coding model by Meta?
Nov 3, 2026 · YouTube
38:58Testing Particle-1: a post-trained DeepSeek V4.1 Flash specializing in coding and efficiency
Oct 28, 2026 · YouTube
22:14GPT-6.1 Terra Pro vs Terra: How Much Better Is Pro?
Oct 27, 2026 · YouTube
29:55Kimi K3.1 Pro Looked Incredible. Then I Kept Testing.
Oct 26, 2026 · YouTube
31:28Is this company reselling GPT Sol 6.1 at a loss (for non-agentic/text-only)?🤔 Is this sustainable?
Oct 20, 2026 · YouTube
17:58Nemotron 3.5 Super VL vs Opus 5.5: Testing NVIDIA’s new coding juggernaut
Oct 15, 2026 · YouTube
16:04Testing a *massive* new open-weights model 🤯: Muse Spark Open (vs. Nemotron, Opus 5.5, and more)
Oct 15, 2026 · YouTube
16:43Gemini 4 Argon: Great 🐈 Animation, but a broken escalator. (Coding challenge vs Opus 5.5, Sol 6.1)
Oct 13, 2026 · YouTube
16:37Meta's new "Muse Wonder" AI is impressive... but can it compete with Anthropic's models?
Oct 12, 2026 · YouTube
11:12WOW... Haiku 5.5 is very impressive. RIP OpenAI?
Oct 7, 2026 · YouTube
22:47Mistral Large 4 Is Cheap. But Is It Good Enough to Compete?
Oct 6, 2026 · YouTube
22:02Is Pareto 26.10 Preview Just Routing to GPT Sol? I Tested It Against Sol 6.1 Pro
Oct 1, 2026 · YouTube
11:22I Tested Sonnet 5.5 Against Opus 5.5. Is It Actually Cheaper?
Sep 28, 2026 · YouTube
30:00Did Elon Musk's team "train the gay away"... and make Grok 4.7 worse?
Sep 26, 2026 · YouTube
19:21I Tested the Stealth "Space Bunny Alpha" Model Before It Went Offline
Sep 23, 2026 · YouTube
10:58So... how much better is Claude Opus 5.5 vs. GPT-6 Sol, really?
Sep 23, 2026 · YouTube
9:38Claude Opus 5.5... the BEST new model for coding!! 🤩
Sep 22, 2026 · YouTube
29:00Grok 4.7: improved, but GLM 5.3 FlashX beat it anyway (benchmark against Gemini, Sol, etc.)
Sep 22, 2026 · YouTube
You write simulations where the interesting behavior is supposed to emerge rather than be animated by hand.
Build me a single HTML page: a side-view escalator carrying 15 to 20 people. Then the escalator reverses, at high speed.
data: URIs are fine.localStorage, sessionStorage, cookies or indexedDB — sandboxed frame, they throw.html block.One paragraph, before the file: how a person is represented, what makes one lose balance, and what happens when two of them occupy the same place.
The single fenced html block.
Having written it, what does the page do when the escalator reverses? Name anything you special-cased or nudged. Say what it does badly — I am going to press the button and watch.
Each person is a rigid body defined by position, velocity, and a "state" (standing, falling, or crawling). They exist on a 2D plane constrained to the escalator's slope. Balance is maintained by a "stiffness" force that attempts to keep the figure upright and moving at the escalator's speed. When the escalator reverses, the floor velocity changes instantly, but the figure's inertia keeps them moving forward, creating a massive relative velocity difference. This difference generates a "drag" force that pushes the figure's center of mass forward, rotating them around their feet until the torque overcomes their balance threshold, causing them to fall. Once on the ground, they become static obstacles (or low-friction sliders) that other figures collide with, transferring momentum and creating the pile-up.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Escalator Chaos Simulation</title>
<style>
body {
margin: 0;
overflow: hidden;
background-color: #1a1a1a;
font-family: 'Courier New', Courier, monospace;
color: #eee;
}
canvas {
display: block;
}
#controls {
position: absolute;
top: 20px;
left: 20px;
z-index: 10;
background: rgba(0, 0, 0, 0.7);
padding: 15px;
border-radius: 8px;
border: 1px solid #444;
}
button {
background: #d32f2f;
color: white;
border: none;
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
border-radius: 4px;
font-weight: bold;
text-transform: uppercase;
transition: background 0.2s;
}
button:hover {
background: #b71c1c;
}
button:active {
background: #8b0000;
}
#status {
margin-top: 10px;
font-size: 14px;
color: #aaa;
}
</style>
</head>
<body>
<div id="controls">
<button id="reverseBtn">REVERSE ESCALATOR</button>
<div id="status">Status: Normal Operation</div>
</div>
<canvas id="simCanvas"></canvas>
<script>
// --- Configuration ---
const CONFIG = {
escalatorAngle: -0.4, // Radians (approx 23 degrees up)
escalatorWidth: 600,
escalatorLength: 1200,
stepHeight: 15,
stepDepth: 20,
normalSpeed: 2.5,
reverseSpeed: -8.0, // Fast reverse
friction: 0.9,
gravity: 0.5,
personRadius: 15,
personMass: 1,
maxPeople: 18
};
// --- Vector Math Helper ---
const Vec2 = {
add: (v1, v2) => ({ x: v1.x + v2.x, y: v1.y + v2.y }),
sub: (v1, v2) => ({ x: v1.x - v2.x, y: v1.y - v2.y }),
mul: (v, s) => ({ x: v.x * s, y: v.y * s }),
dot: (v1, v2) => v1.x * v2.x + v1.y * v2.y,
mag: (v) => Math.sqrt(v.x * v.x + v.y * v.y),
normalize: (v) => {
const m = Math.sqrt(v.x * v.x + v.y * v.y);
return m === 0 ? { x: 0, y: 0 } : { x: v.x / m, y: v.y / m };
},
rotate: (v, angle) => ({
x: v.x * Math.cos(angle) - v.y * Math.sin(angle),
y: v.x * Math.sin(angle) + v.y * Math.cos(angle)
}),
dist: (v1, v2) => Math.sqrt((v1.x - v2.x) ** 2 + (v1.y - v2.y) ** 2)
};
// --- Classes ---
class Escalator {
constructor() {
this.speed = CONFIG.normalSpeed;
this.targetSpeed = CONFIG.normalSpeed;
this.angle = CONFIG.escalatorAngle;
// Center of the canvas
this.cx = window.innerWidth / 2;
this.cy = window.innerHeight / 2;
// Calculate step positions relative to center
// We create a long strip of steps
this.steps = [];
const numSteps = Math.ceil(CONFIG.escalatorLength / CONFIG.stepDepth) + 10;
for (let i = 0; i < numSteps; i++) {
const offset = (i - numSteps / 2) * CONFIG.stepDepth;
const x = this.cx + Math.cos(this.angle) * offset;
const y = this.cy - Math.sin(this.angle) * offset;
this.steps.push({ x, y });
}
}
update() {
// Smoothly transition speed
const diff = this.targetSpeed - this.speed;
this.speed += diff * 0.1;
}
draw(ctx) {
ctx.save();
ctx.translate(this.cx, this.cy);
ctx.rotate(this.angle);
// Draw the handrails/guides
ctx.strokeStyle = '#555';
ctx.lineWidth = 4;
ctx.beginPath();
ctx.moveTo(-CONFIG.escalatorLength, -CONFIG.escalatorWidth/2 - 10);
ctx.lineTo(CONFIG.escalatorLength, -CONFIG.escalatorWidth/2 - 10);
ctx.moveTo(-CONFIG.escalatorLength, CONFIG.escalatorWidth/2 + 10);
ctx.lineTo(CONFIG.escalatorLength, CONFIG.escalatorWidth/2 + 10);
ctx.stroke();
// Draw steps
ctx.fillStyle = '#333';
ctx.strokeStyle = '#666';
ctx.lineWidth = 1;
// We only draw steps that are visible
const visibleRange = window.innerWidth / 2 + 100;
this.steps.forEach((step, i) => {
// Simple optimization: only draw if within screen bounds roughly
if (Math.abs(step.x - this.cx) < visibleRange) {
// Step is drawn in local rotated coords
// The step object stores world coords, so we need to convert back or just draw relative to 0,0
// Actually, let's just draw them relative to the center, rotated
// The step object 'x' is world X.
// Let's recalculate local X for drawing
const localX = (step.x - this.cx) * Math.cos(this.angle) + (step.y - this.cy) * Math.sin(this.angle);
ctx.fillRect(localX - CONFIG.stepDepth/2, -CONFIG.escalatorWidth/2, CONFIG.stepDepth, CONFIG.escalatorWidth);
ctx.strokeRect(localX - CONFIG.stepDepth/2, -CONFIG.escalatorWidth/2, CONFIG.stepDepth, CONFIG.escalatorWidth);
}
});
ctx.restore();
}
getSurfacePos(index) {
// Get world position of a specific step index
if (index < 0 || index >= this.steps.length) return null;
return this.steps[index];
}
getStepIndexAtWorldPos(worldX, worldY) {
// Convert world pos to local escalator coords
const dx = worldX - this.cx;
const dy = worldY - this.cy;
const localX = dx * Math.cos(this.angle) + dy * Math.sin(this.angle);
const stepSize = CONFIG.stepDepth;
const centerIndex = this.steps.length / 2;
return Math.floor((localX / stepSize) + centerIndex);
}
}
class Person {
constructor(id, startX, startY) {
this.id = id;
this.pos = { x: startX, y: startY };
this.vel = { x: 0, y: 0 };
this.acc = { x: 0, y: 0 };
// State: 'standing', 'falling', 'crawling'
this.state = 'standing';
// Physics properties
this.angle = 0; // 0 is upright relative to escalator normal? No, let's say 0 is vertical screen Y
this.angularVel = 0;
this.mass = CONFIG.personMass;
this.radius = CONFIG.personRadius;
// Visuals
this.color = `hsl(${Math.random() * 360}, 70%, 60%)`;
this.fallTimer = 0;
}
update(escalator, people) {
// 1. Apply Forces
// Gravity
this.acc.y += CONFIG.gravity;
// Escalator Interaction
if (this.state === 'standing') {
// Find closest step
const stepIndex = escalator.getStepIndexAtWorldPos(this.pos.x, this.pos.y);
if (stepIndex !== null && stepIndex >= 0 && stepIndex < escalator.steps.length) {
const step = escalator.steps[stepIndex];
// Distance to step center
const dist = Vec2.dist(this.pos, step);
// If close enough to step, snap to it and move with it
if (dist < 20) {
// Move with escalator
const moveVec = { x: escalator.speed * Math.cos(CONFIG.escalatorAngle), y: -escalator.speed * Math.sin(CONFIG.escalatorAngle) };
// Spring force to keep position relative to step
const springK = 0.1;
const force = Vec2.mul(Vec2.sub(step, this.pos), springK);
this.acc = Vec2.add(this.acc, force);
// Friction to match velocity
const velDiff = Vec2.sub(moveVec, this.vel);
const frictionForce = Vec2.mul(velDiff, 0.2);
this.acc = Vec2.add(this.acc, frictionForce);
// Keep upright
// Torque to keep angle 0 (vertical)
const angleDiff = 0 - this.angle;
this.angularVel += angleDiff * 0.1;
this.angularVel *= 0.8; // Damping
// Check for balance loss due to high acceleration (reverse)
// If the escalator accelerates too fast, the person falls
// We simulate this by checking the relative velocity difference
const relVel = Vec2.mag(Vec2.sub(this.vel, moveVec));
if (relVel > 4) {
this.state = 'falling';
this.fallTimer = 0;
}
} else {
// Not on a step? Fall.
this.state = 'falling';
}
} else {
this.state = 'falling';
}
} else if (this.state === 'falling') {
// Rotate forward (direction of travel was positive, so fall forward)
// If escalator is reversing, they fall "back" relative to screen, but forward relative to escalator motion?
// Let's say they always fall in the direction of the previous movement (up/right)
// Or simply, if they are on the escalator, they fall towards the bottom (down/left) if it reverses?
// Let's simplify: They fall in the direction of the escalator's current speed vector.
const fallDir = escalator.speed > 0 ? 1 : -1;
this.angularVel += 0.05 * fallDir;
this.state = 'crawling'; // Transition to crawling
} else if (this.state === 'crawling') {
// Friction with floor
const stepIndex = escalator.getStepIndexAtWorldPos(this.pos.x, this.pos.y);
if (stepIndex !== null && stepIndex >= 0 && stepIndex < escalator.steps.length) {
const step = escalator.steps[stepIndex];
const dist = Vec2.dist(this.pos, step);
if (dist < 30) {
// Slide with escalator
const moveVec = { x: escalator.speed * Math.cos(CONFIG.escalatorAngle), y: -escalator.speed * Math.sin(CONFIG.escalatorAngle) };
const frictionForce = Vec2.mul(Vec2.sub(moveVec, this.vel), 0.05);
this.acc = Vec2.add(this.acc, frictionForce);
// Try to get up if speed is low and no one is on top of them
if (Vec2.mag(this.vel) < 1) {
// Check for obstacles
let blocked = false;
for (let other of people) {
if (other !== this && Vec2.dist(this.pos, other.pos) < this.radius * 2) {
blocked = true;
break;
}
}
if (!blocked) {
this.state = 'standing';
this.angle = 0;
this.angularVel = 0;
}
}
}
}
}
// 2. Collision with other people
for (let other of people) {
if (other === this) continue;
const dist = Vec2.dist(this.pos, other.pos);
const minDist = this.radius + other.radius;
if (dist < minDist) {
// Collision response
const normal = Vec2.normalize(Vec2.sub(this.pos, other.pos));
const overlap = minDist - dist;
// Push apart
const pushForce = Vec2.mul(normal, overlap * 0.5);
this.pos = Vec2.add(this.pos, pushForce);
other.pos = Vec2.sub(other.pos, pushForce);
// Transfer momentum
const relVel = Vec2.sub(this.vel, other.vel);
const velAlongNormal = Vec2.dot(relVel, normal);
if (velAlongNormal < 0) {
const restitution = 0.2; // Low bounce
const impulse = -(1 + restitution) * velAlongNormal;
const impulseVec = Vec2.mul(normal, impulse * 0.5);
this.vel = Vec2.add(this.vel, impulseVec);
other.vel = Vec2.sub(other.vel, impulseVec);
// If hit hard, fall
if (Vec2.mag(impulseVec) > 2) {
this.state = 'falling';
other.state = 'falling';
}
}
}
}
// 3. Integrate
this.vel = Vec2.add(this.vel, this.acc);
this.vel = Vec2.mul(this.vel, 0.95); // Air resistance/friction
this.pos = Vec2.add(this.pos, this.vel);
this.angle += this.angularVel;
this.angularVel *= 0.9; // Angular damping
// Reset acceleration
this.acc = { x: 0, y: 0 };
// Boundary checks (keep on screen roughly)
if (this.pos.y > window.innerHeight + 100) {
this.pos.y = -100;
this.pos.x = this.cx + 500;
this.state = 'standing';
this.vel = { x: 0, y: 0 };
}
if (this.pos.y < -100) {
this.pos.y = window.innerHeight + 100;
this.pos.x = this.cx - 500;
this.state = 'standing';
this.vel = { x: 0, y: 0 };
}
}
draw(ctx) {
ctx.save();
ctx.translate(this.pos.x, this.pos.y);
ctx.rotate(this.angle);
ctx.fillStyle = this.color;
ctx.strokeStyle = this.color;
ctx.lineWidth = 3;
if (this.state === 'standing') {
// Stick figure standing
// Head
ctx.beginPath();
ctx.arc(0, -20, 6, 0, Math.PI * 2);
ctx.fill();
// Body
ctx.beginPath();
ctx.moveTo(0, -14);
ctx.lineTo(0, 5);
ctx.stroke();
// Legs
ctx.beginPath();
ctx.moveTo(0, 5);
ctx.lineTo(-8, 20);
ctx.moveTo(0, 5);
ctx.lineTo(8, 20);
ctx.stroke();
// Arms
ctx.beginPath();
ctx.moveTo(0, -10);
ctx.lineTo(-10, 0);
ctx.moveTo(0, -10);
ctx.lineTo(10, 0);
ctx.stroke();
} else {
// Fallen/Crawling figure
// Head
ctx.beginPath();
ctx.arc(0, 0, 6, 0, Math.PI * 2);
ctx.fill();
// Body (horizontal)
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(20, 0);
ctx.stroke();
// Legs (tucked or spread)
ctx.beginPath();
ctx.moveTo(20, 0);
ctx.lineTo(25, 10);
ctx.moveTo(20, 0);
ctx.lineTo(25, -10);
ctx.stroke();
// Arms
ctx.beginPath();
ctx.moveTo(5, 0);
ctx.lineTo(0, 10);
ctx.moveTo(5, 0);
ctx.lineTo(0, -10);
ctx.stroke();
}
ctx.restore();
}
}
// --- Main Simulation ---
const canvas = document.getElementById('simCanvas');
const ctx = canvas.getContext('2d');
const reverseBtn = document.getElementById('reverseBtn');
const statusDiv = document.getElementById('status');
let escalator = new Escalator();
let people = [];
let isReversed = false;
function resize() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
escalator.cx = canvas.width / 2;
escalator.cy = canvas.height / 2;
// Re-calculate steps on resize
escalator.steps = [];
const numSteps = Math.ceil(CONFIG.escalatorLength / CONFIG.stepDepth) + 10;
for (let i = 0; i < numSteps; i++) {
const offset = (i - numSteps / 2) * CONFIG.stepDepth;
const x = escalator.cx + Math.cos(escalator.angle) * offset;
const y = escalator.cy - Math.sin(escalator.angle) * offset;
escalator.steps.push({ x, y });
}
}
function initPeople() {
people = [];
const numPeople = CONFIG.maxPeople;
const spacing = 40;
for (let i = 0; i < numPeople; i++) {
// Place them along the escalator
const offset = (i - numPeople / 2) * spacing;
const x = escalator.cx + Math.cos(escalator.angle) * offset;
const y = escalator.cy - Math.sin(escalator.angle) * offset;
people.push(new Person(i, x, y));
}
}
function toggleReverse() {
isReversed = !isReversed;
if (isReversed) {
escalator.targetSpeed = CONFIG.reverseSpeed;
statusDiv.textContent = "Status: REVERSED - DANGER";
statusDiv.style.color = "#ff4444";
reverseBtn.textContent = "NORMALIZE";
reverseBtn.style.background = "#2e7d32";
} else {
escalator.targetSpeed = CONFIG.normalSpeed;
statusDiv.textContent = "Status: Normal Operation";
statusDiv.style.color = "#aaa";
reverseBtn.textContent = "REVERSE ESCALATOR";
reverseBtn.style.background = "#d32f2f";
}
}
reverseBtn.addEventListener('click', toggleReverse);
function loop() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
escalator.update();
escalator.draw(ctx);
// Update and draw people
people.forEach(person => {
person.update(escalator, people);
person.draw(ctx);
});
requestAnimationFrame(loop);
}
window.addEventListener('resize', resize);
resize();
initPeople();
loop();
</script>
</body>
</html>
When you press the button, the escalator's target velocity flips from positive (up/right) to negative (down/left) at a high magnitude. The simulation handles the rest:
Special Cases/Nudges: