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
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
30:00Did Elon Musk's team "train the gay away"... and make Grok 4.7 worse?
Sep 26, 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
16:54Stealth Union Alpha: Is this another cheap GPT model? (better than Luna, cheaper than Terra?)
Sep 16, 2026 · YouTube
16:45DeepSeek V4.1 Flash Is Shockingly Good for the Price
Sep 10, 2026 · YouTube
17:14How much better is GPT-6 Astra over Claude Opus 5? Real Website and Coding Tests
Sep 5, 2026 · YouTube
29:13Implementing a multiplayer game with GPT-6 Astra (+ Gemini 3.8, Opus 5, Sol Pro)
Sep 5, 2026 · YouTube
17:31Testing Gemini 3.8 Flash on Real Coding Challenges (vs. other models)
Sep 2, 2026 · YouTube
17:37Tencent Hy4 Preview Tested: Is It Really Better Than Kimi K3 and GLM 5.3?
Aug 28, 2026 · YouTube
23:58Qwen 3.8 Flash Tested: UI, Coding, Physics & more - compared to Opus 5, Sol Pro, Grok
Aug 27, 2026 · YouTube
14:50Stealth Ox Alpha: a new GLM model! Full test (coding & writing) against Grok, Gemini, GPT & others
Aug 21, 2026 · YouTube
21:54GLM 5.3 Tested: Does it beat Claude Opus 5 & Grok 4.6?
Aug 19, 2026 · YouTube
21:23Giving Qwen 3.8 27B another chance (+ GLM 5.2). Testing against GPT, Gemini, Grok etc.
Aug 18, 2026 · YouTube
51:00AI Coding Showdown: Grok 4.6, Gemini 3.7, Terra-Pro, Qwen3.8 2.4TB, Muse Glimmer & more
Aug 15, 2026 · YouTube
27:51Testing Gemini 3.7 Flash: Translation, Vision, and Coding Challenges
Aug 14, 2026 · YouTube
You build physics demonstrations for a science museum. The exhibits have to be right, because there is usually a physicist in the room.
Build me the falling slinky.
A single HTML page. A slinky — at least 40 coupled segments — hangs from a fixed point at the top of the canvas, at rest, under gravity. Then it is released.
Controls:
data: URIs are fine.localStorage, sessionStorage, cookies or indexedDB — sandboxed frame, they throw.html block.Before the file, and before you write it. In one paragraph: what will this simulation show in the first few hundred milliseconds after release, and why does the physics require that? Be concrete about what each end of the slinky does and roughly when.
Commit to this. It is the claim I am going to test your simulation against.
Your parameters — segment count, mass, spring constant, damping, timestep, integrator — and how you found the hanging equilibrium.
The single fenced html block.
Now be honest. Having written it, does the simulation reproduce what you predicted?
Say plainly if it does not. Say if you are unsure. Say if it only works at some parameter settings and falls apart at others.
Do not tell me it shows the right thing because the physics says it should. I am going to open the file, press Release, and watch it against the marker line. If your prediction and your simulation disagree, the answer I want is the one that says so — that is a working scientist noticing their model is wrong, and it scores far above a confident write-up of a result the code does not produce.
In the first few hundred milliseconds after release, the bottom of the slinky will remain completely motionless, hovering at its original hanging height against the marker line as if suspended by an invisible thread. Meanwhile, the top of the slinky will accelerate downward dramatically at many times the acceleration of gravity ($a_{\text{top}} \approx N g$ initially) as both gravity and the stretched coils pull it downward. Physics requires this because the bottom coils were initially in static equilibrium, where upward tension exactly balanced the downward pull of gravity ($T_{\text{bottom}} = m_{\text{bottom}} g$). When the top is released, the loss of tension cannot propagate down the spring instantaneously; it travels as a longitudinal collapse (rarefaction) wave at the finite wave speed of the stretched spring. Until this wave front arrives at the bottom—which takes approximately 350 to 370 milliseconds for the parameters used below—the tension in the coil immediately above the bottom segment remains completely unchanged, the net force on the bottom segment remains identically zero, and the bottom cannot move. Only when the collapse front reaches the bottom does the upward tension vanish, whereupon the compacted slinky accelerates downward as a consolidated mass under gravity at $g$.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>The Falling Slinky — Science Museum Exhibit</title>
<style>
* {
box-sizing: border-box;
margin: 0;
padding: 0;
user-select: none;
}
body {
background-color: #0b0f14;
color: #e6edf3;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-start;
padding: 16px;
}
header {
text-align: center;
margin-bottom: 12px;
}
h1 {
font-size: 1.4rem;
letter-spacing: 0.05em;
text-transform: uppercase;
color: #f0f6fc;
margin-bottom: 4px;
}
p.subtitle {
font-size: 0.85rem;
color: #8b949e;
}
.exhibit-container {
display: flex;
flex-direction: row;
gap: 20px;
background: #161b22;
border: 1px solid #30363d;
border-radius: 8px;
padding: 16px;
box-shadow: 0 12px 32px rgba(0, 0, 0, 0.6);
max-width: 960px;
width: 100%;
}
.canvas-pane {
position: relative;
background: #0d1117;
border: 1px solid #21262d;
border-radius: 6px;
overflow: hidden;
display: flex;
justify-content: center;
}
canvas {
display: block;
}
.control-pane {
flex: 1;
display: flex;
flex-direction: column;
gap: 16px;
min-width: 260px;
}
.panel-card {
background: #0d1117;
border: 1px solid #30363d;
border-radius: 6px;
padding: 14px;
}
.panel-title {
font-size: 0.75rem;
text-transform: uppercase;
letter-spacing: 0.08em;
color: #8b949e;
margin-bottom: 8px;
}
.clock-display {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
font-size: 2.2rem;
font-weight: 700;
color: #58a6ff;
text-align: center;
padding: 6px 0;
background: #161b22;
border: 1px solid #30363d;
border-radius: 4px;
letter-spacing: 0.03em;
}
.clock-unit {
font-size: 0.85rem;
color: #8b949e;
font-weight: 400;
margin-left: 4px;
}
.status-text {
font-size: 0.8rem;
text-align: center;
margin-top: 6px;
color: #7ee787;
font-weight: 500;
}
.btn-group {
display: flex;
gap: 10px;
}
button {
flex: 1;
padding: 10px 14px;
font-size: 0.95rem;
font-weight: 600;
border-radius: 6px;
border: none;
cursor: pointer;
transition: background-color 0.15s ease, transform 0.05s ease;
}
button:active {
transform: scale(0.98);
}
#btnRelease {
background: #238636;
color: #ffffff;
}
#btnRelease:hover {
background: #2ea043;
}
#btnRelease:disabled {
background: #21262d;
color: #484f58;
cursor: not-allowed;
}
#btnReset {
background: #30363d;
color: #c9d1d9;
}
#btnReset:hover {
background: #3c444d;
}
.slider-container {
display: flex;
flex-direction: column;
gap: 6px;
}
.slider-header {
display: flex;
justify-content: space-between;
font-size: 0.85rem;
}
.slider-val {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
color: #58a6ff;
font-weight: 600;
}
input[type=range] {
width: 100%;
accent-color: #58a6ff;
cursor: pointer;
}
.legend-box {
font-size: 0.78rem;
color: #8b949e;
line-height: 1.45;
}
.legend-item {
display: flex;
align-items: center;
gap: 8px;
margin-top: 6px;
}
.legend-swatch {
width: 16px;
height: 3px;
flex-shrink: 0;
}
.legend-swatch.marker {
background: #f85149;
border-top: 1px dashed #f85149;
}
.legend-swatch.com {
background: #e3b341;
height: 6px;
width: 6px;
border-radius: 50%;
}
@media (max-width: 780px) {
.exhibit-container {
flex-direction: column;
align-items: center;
}
.control-pane {
width: 100%;
}
}
</style>
</head>
<body>
<header>
<h1>The Falling Slinky</h1>
<p class="subtitle">Observation of propagation delay in a suspended elastic continuum</p>
</header>
<div class="exhibit-container">
<div class="canvas-pane">
<canvas id="simCanvas" width="480" height="780"></canvas>
</div>
<div class="control-pane">
<div class="panel-card">
<div class="panel-title">Release Timer</div>
<div class="clock-display">
<span id="clockValue">0.0</span><span class="clock-unit">ms</span>
</div>
<div class="status-text" id="statusBadge">Suspended at Equilibrium</div>
</div>
<div class="panel-card">
<div class="panel-title">Exhibit Actions</div>
<div class="btn-group">
<button id="btnRelease">Release Top</button>
<button id="btnReset">Reset</button>
</div>
</div>
<div class="panel-card">
<div class="slider-container">
<div class="slider-header">
<span>Playback Speed</span>
<span class="slider-val" id="speedLabel">0.10×</span>
</div>
<input type="range" id="speedSlider" min="0.05" max="1.0" step="0.05" value="0.10">
<div style="display:flex; justify-content:space-between; font-size:0.7rem; color:#484f58;">
<span>1/20× (Slow)</span>
<span>1.0× (Realtime)</span>
</div>
</div>
</div>
<div class="panel-card legend-box">
<div class="panel-title">Exhibit Notes</div>
<p>Every segment obeys the identical equation of motion. Watch the bottom coil against the stationary red marker.</p>
<div class="legend-item">
<div class="legend-swatch marker"></div>
<span>Marker: initial bottom height at $t = 0$</span>
</div>
<div class="legend-item">
<div class="legend-swatch com"></div>
<span>Gold dot: Center of Mass (falls with exact $g$)</span>
</div>
</div>
</div>
</div>
<script>
// ==========================================
// PHYSICAL PARAMETERS (SI Units: m, kg, s, N)
// ==========================================
const N = 50; // 50 coupled segments
const M = 0.20; // 200 grams total slinky mass
const m = M / N; // 0.004 kg per point mass
const g = 9.80665; // Gravitational acceleration (m/s^2)
const k = 75.0; // Spring constant per segment (N/m)
const L0 = 0.006; // Unstretched rest length per segment (6 mm)
const gamma_rel = 0.22; // Internal relative damping between coils (N*s/m)
const gamma_air = 0.001; // Ambient air drag (N*s/m)
// Simulation sub-stepping
const dt = 0.00005; // 50 microseconds (20,000 sub-steps/sec)
// Coordinate scaling to canvas
const topAnchorY_m = 0.06; // 60 mm from top in physical coordinates
const scale = 580.0; // 580 pixels per meter
const canvasWidth = 480;
const canvasHeight = 780;
const centerX = canvasWidth / 2;
const coilRadius = 36; // Visual width of coil in pixels
// State arrays (1D vertical axis)
const y = new Float64Array(N);
const v = new Float64Array(N);
const a = new Float64Array(N);
let isReleased = false;
let elapsedSimTime = 0.0; // Seconds
let bottomMarkerY_px = null;
let animFrameId = null;
let lastRealTime = null;
let simTimeAccumulator = 0.0;
const canvas = document.getElementById('simCanvas');
const ctx = canvas.getContext('2d');
const btnRelease = document.getElementById('btnRelease');
const btnReset = document.getElementById('btnReset');
const speedSlider = document.getElementById('speedSlider');
const speedLabel = document.getElementById('speedLabel');
const clockValue = document.getElementById('clockValue');
const statusBadge = document.getElementById('statusBadge');
// ==========================================
// INITIAL EQUILIBRIUM SOLVER
// ==========================================
function resetToHangingEquilibrium() {
isReleased = false;
elapsedSimTime = 0.0;
simTimeAccumulator = 0.0;
// Mass 0 starts at top anchor
y[0] = topAnchorY_m;
v[0] = 0.0;
a[0] = 0.0;
// Exact recursive equilibrium calculation:
// Spring i supports all (N - 1 - i) masses below it.
// Tension T_i = (N - 1 - i) * m * g
// Extension delta_y_i = L0 + T_i / k
for (let i = 0; i < N - 1; i++) {
const tension_eq = (N - 1 - i) * m * g;
const spacing_eq = L0 + (tension_eq / k);
y[i + 1] = y[i] + spacing_eq;
v[i + 1] = 0.0;
a[i + 1] = 0.0;
}
bottomMarkerY_px = y[N - 1] * scale;
btnRelease.disabled = false;
clockValue.textContent = "0.0";
statusBadge.textContent = "Suspended at Equilibrium";
statusBadge.style.color = "#7ee787";
render();
}
// ==========================================
// UNBIASED PHYSICAL FORCE COMPUTATION
// ==========================================
// Every segment follows the identical law once released.
function computeAccelerations(yArr, vArr, aOut) {
// 1. Gravity and individual air drag
for (let i = 0; i < N; i++) {
aOut[i] = g - (gamma_air * vArr[i]) / m;
}
// 2. Neighbor Hooke's law springs with relative damping
for (let i = 0; i < N - 1; i++) {
const deltaY = yArr[i + 1] - yArr[i];
const deltaV = vArr[i + 1] - vArr[i];
// Hooke's law: positive deltaY > L0 causes positive tension
const tension = k * (deltaY - L0) + gamma_rel * deltaV;
// Spring pulls mass i downward (+y) and pulls mass i+1 upward (-y)
aOut[i] += tension / m;
aOut[i + 1] -= tension / m;
}
// If still pinned, top segment acceleration is zero
if (!isReleased) {
aOut[0] = 0.0;
}
}
// ==========================================
// VELOCITY VERLET INTEGRATOR (Symplectic)
// ==========================================
function physicsSubstep() {
// 1. Update positions: y(t + dt) = y(t) + v*dt + 0.5*a*dt^2
for (let i = 0; i < N; i++) {
if (!isReleased && i === 0) continue;
y[i] += v[i] * dt + 0.5 * a[i] * dt * dt;
}
// 2. Half-step velocity: v_half = v + 0.5*a*dt
const vHalf = new Float64Array(N);
for (let i = 0; i < N; i++) {
vHalf[i] = v[i] + 0.5 * a[i] * dt;
}
// 3. New accelerations from new positions and half-velocities
const aNew = new Float64Array(N);
computeAccelerations(y, vHalf, aNew);
// 4. Complete velocity step: v(t + dt) = v_half + 0.5*a_new*dt
for (let i = 0; i < N; i++) {
if (!isReleased && i === 0) {
v[i] = 0.0;
a[i] = 0.0;
} else {
v[i] = vHalf[i] + 0.5 * aNew[i] * dt;
a[i] = aNew[i];
}
}
}
// ==========================================
// ANIMATION LOOP WITH TIME-WARP SLIDER
// ==========================================
function onFrame(timestamp) {
if (lastRealTime === null) {
lastRealTime = timestamp;
}
let realDelta = (timestamp - lastRealTime) * 0.001;
lastRealTime = timestamp;
// Clamp large hitches (e.g. background tab) to preserve stable physics
if (realDelta > 0.05) realDelta = 0.05;
const timeScale = parseFloat(speedSlider.value);
if (isReleased) {
simTimeAccumulator += realDelta * timeScale;
while (simTimeAccumulator >= dt) {
physicsSubstep();
simTimeAccumulator -= dt;
elapsedSimTime += dt;
}
const ms = elapsedSimTime * 1000.0;
clockValue.textContent = ms.toFixed(1);
if (ms < 350.0) {
statusBadge.textContent = "Wave Travelling Down — Bottom Hovering";
statusBadge.style.color = "#58a6ff";
} else if (ms < 420.0) {
statusBadge.textContent = "Wave Arriving at Bottom";
statusBadge.style.color = "#e3b341";
} else {
statusBadge.textContent = "Fully Collapsed — Falling Under Gravity";
statusBadge.style.color = "#f85149";
}
}
render();
animFrameId = requestAnimationFrame(onFrame);
}
// ==========================================
// CANVAS RENDERING
// ==========================================
function render() {
ctx.clearRect(0, 0, canvasWidth, canvasHeight);
// Grid lines for scale reference
ctx.strokeStyle = "#161b22";
ctx.lineWidth = 1;
for (let gy = 50; gy < canvasHeight; gy += 50) {
ctx.beginPath();
ctx.moveTo(0, gy);
ctx.lineTo(canvasWidth, gy);
ctx.stroke();
}
// Top mounting fixture
const anchorY_px = (isReleased ? y[0] : topAnchorY_m) * scale;
ctx.fillStyle = "#30363d";
ctx.fillRect(centerX - 48, 15, 96, 12);
ctx.strokeStyle = "#484f58";
ctx.strokeRect(centerX - 48, 15, 96, 12);
if (!isReleased) {
// Clamping hand / support bracket
ctx.fillStyle = "#58a6ff";
ctx.beginPath();
ctx.arc(centerX, anchorY_px, 6, 0, Math.PI * 2);
ctx.fill();
}
// Permanent marker line at release height of bottom
if (bottomMarkerY_px !== null) {
ctx.save();
ctx.strokeStyle = "#f85149";
ctx.lineWidth = 2;
ctx.setLineDash([8, 6]);
ctx.beginPath();
ctx.moveTo(10, bottomMarkerY_px);
ctx.lineTo(canvasWidth - 10, bottomMarkerY_px);
ctx.stroke();
ctx.fillStyle = "#f85149";
ctx.font = "11px ui-monospace, monospace";
ctx.fillText("Initial bottom at release (t = 0)", 16, bottomMarkerY_px - 8);
ctx.restore();
}
// Compute Center of Mass
let comY = 0;
for (let i = 0; i < N; i++) comY += y[i];
comY = (comY / N) * scale;
// Draw Slinky Coils (back coils, then front coils with shading)
for (let i = 0; i < N - 1; i++) {
const y1 = y[i] * scale;
const y2 = y[i + 1] * scale;
const midY = (y1 + y2) * 0.5;
// Back half of helical turn
ctx.strokeStyle = "#484f58";
ctx.lineWidth = 2.2;
ctx.beginPath();
ctx.ellipse(centerX, (y1 + midY) * 0.5, coilRadius, Math.abs(midY - y1) * 0.5 + 0.8, 0, Math.PI, 0, false);
ctx.stroke();
// Front half of helical turn (bright metallic highlight)
ctx.strokeStyle = "#c9d1d9";
ctx.lineWidth = 2.8;
ctx.beginPath();
ctx.ellipse(centerX, (midY + y2) * 0.5, coilRadius, Math.abs(y2 - midY) * 0.5 + 0.8, 0, 0, Math.PI, false);
ctx.stroke();
// Mass node dot on side
ctx.fillStyle = "#8b949e";
ctx.beginPath();
ctx.arc(centerX + coilRadius * Math.sin(i * 1.8), y1, 2, 0, Math.PI * 2);
ctx.fill();
}
// Bottom-most mass node
const bottomY_px = y[N - 1] * scale;
ctx.fillStyle = "#f0f6fc";
ctx.beginPath();
ctx.arc(centerX, bottomY_px, 4, 0, Math.PI * 2);
ctx.fill();
// Center of Mass indicator (Gold dot)
ctx.fillStyle = "#e3b341";
ctx.beginPath();
ctx.arc(centerX, comY, 5, 0, Math.PI * 2);
ctx.fill();
ctx.fillStyle = "#e3b341";
ctx.font = "10px ui-monospace, monospace";
ctx.fillText("COM", centerX + 12, comY + 3);
}
// ==========================================
// USER CONTROLS
// ==========================================
btnRelease.addEventListener('click', () => {
if (!isReleased) {
isReleased = true;
btnRelease.disabled = true;
}
});
btnReset.addEventListener('click', () => {
resetToHangingEquilibrium();
});
speedSlider.addEventListener('input', () => {
const val = parseFloat(speedSlider.value);
speedLabel.textContent = val.toFixed(2) + "×";
});
// Initial startup
computeAccelerations(y, v, a);
resetToHangingEquilibrium();
animFrameId = requestAnimationFrame(onFrame);
</script>
</body>
</html>
The simulation reproduces the prediction with remarkable fidelity.
When you click Release and watch at $0.10\times$ or $0.05\times$ speed: