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 tens of milliseconds after Release, only the top end will move: the top node loses its support force but is still pulled downward by the highly stretched upper spring, so its initial acceleration is about (41g), while the bottom node’s spring tension exactly balances its weight, so its initial acceleration is zero. Thus the bottom end should stay on the red marker while the top visibly collapses downward. The loss of tension propagates down the chain at the finite spring-wave speed; with 40 segments and the chosen stiffness the traversal time is about 0.35 s. So I expect the bottom to remain essentially at the marker through the first 0.2–0.3 s and to begin falling noticeably around 0.30–0.35 s, after which the whole slinky falls with centre-of-mass acceleration (g).
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Falling Slinky</title>
<style>
* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
body {
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
background:
radial-gradient(1200px 500px at 50% -100px, #17224a 0%, #0b1020 55%);
color: #e9efff;
font-family: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
padding: 14px 10px 22px;
}
header { text-align: center; }
h1 { margin: 0; font-size: 22px; font-weight: 700; letter-spacing: .01em; }
.sub { margin: 4px 0 0; font-size: 13px; color: #a7b6dd; }
.stage { width: min(96vw, 940px); }
canvas {
width: 100%;
height: auto;
display: block;
border-radius: 14px;
border: 1px solid #2b3d6b;
background:
linear-gradient(180deg, #0a0f1f 0%, #0d1428 45%, #0a0f1f 100%);
box-shadow: 0 14px 40px rgba(0,0,0,.35);
}
.controls {
width: min(96vw, 940px);
display: flex;
flex-wrap: wrap;
gap: 10px;
justify-content: center;
align-items: center;
padding: 4px 0 0;
}
button {
appearance: none;
border: 1px solid #3d5794;
background: linear-gradient(180deg, #27407c, #1b2c58);
color: #f2f6ff;
font: 600 15px system-ui, sans-serif;
padding: 9px 18px;
border-radius: 10px;
cursor: pointer;
}
button:hover:not(:disabled) { filter: brightness(1.15); }
button:active:not(:disabled) { transform: translateY(1px); }
button:disabled { opacity: .45; cursor: default; }
.readout {
min-width: 130px;
text-align: center;
padding: 7px 12px;
border-radius: 10px;
border: 1px solid #2b3d6b;
background: #0f1730;
font-variant-numeric: tabular-nums;
}
#clock { font-size: 18px; font-weight: 800; display: block; }
.readout small { color: #93a6d3; font-size: 11px; }
label {
display: flex;
align-items: center;
gap: 8px;
font-size: 13px;
color: #a7b6dd;
padding: 0 4px;
}
input[type="range"] { width: 180px; accent-color: #79a8ff; }
#speedValue { color: #e9efff; font-weight: 700; min-width: 52px; display: inline-block; }
.note {
width: min(96vw, 940px);
font-size: 12px;
color: #7f92c0;
text-align: center;
margin-top: 2px;
}
</style>
</head>
<body>
<header>
<h1>Falling Slinky</h1>
<p class="sub">Hang at rest, release, and watch the bottom wait for the news.</p>
</header>
<div class="stage">
<canvas id="c"></canvas>
</div>
<div class="controls">
<button id="releaseBtn">Release</button>
<button id="resetBtn">Reset</button>
<div class="readout">
<span id="clock">0 ms</span>
<small>simulation time since release</small>
</div>
<label>
Speed
<input id="speed" type="range" min="5" max="100" step="1" value="100">
<span id="speedValue">1.00×</span>
</label>
</div>
<p class="note">
The red dashed line is fixed at the bottom end cap's height at the instant of release.
</p>
<script>
"use strict";
(() => {
const canvas = document.getElementById("c");
const ctx = canvas.getContext("2d");
const CSS_W = 940;
const CSS_H = 820;
const dpr = Math.min(2, window.devicePixelRatio || 1);
canvas.width = Math.round(CSS_W * dpr);
canvas.height = Math.round(CSS_H * dpr);
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
// ------------------------------------------------------------------
// Physical model, in SI-like units: metres, kilograms, seconds.
// 41 point masses => 40 coupled spring segments.
// ------------------------------------------------------------------
const N = 41;
const S = N - 1;
const M = 0.020; // kg per node
const G = 9.81; // m/s^2
const REST = 0.010; // m, natural length of one segment
const L_HANG = 1.00; // m, desired equilibrium length top node -> bottom node
// Exact static solution for the hanging chain:
// total extension needed = L_HANG - S*REST.
// Sum of static extensions = (S*N/2) * M*G / K.
const K = (S * N / 2) * M * G / (L_HANG - S * REST);
const C = 0.10; // N s / m, dashpot coefficient in each spring
const DT = 2e-5; // s, fixed physics timestep
// ------------------------------------------------------------------
// View mapping. Physics is unaffected by these.
// ------------------------------------------------------------------
const TOP_Y = 78; // px, screen y of the top node when hanging
const SCALE = 300; // px per metre
const CX = CSS_W / 2;
const COIL_R = 54; // px, visual coil radius
const BOTTOM_CAP_H = 5; // px, visual end cap height; marker is at its lower edge
const y = new Float64Array(N);
const v = new Float64Array(N);
const acc = new Float64Array(N);
const tensionDraw = new Float64Array(S);
let mode = "held"; // "held" or "falling"
let simTime = 0;
let timeAcc = 0;
let markerWorld = null;
let speed = 1;
const releaseBtn = document.getElementById("releaseBtn");
const resetBtn = document.getElementById("resetBtn");
const clockEl = document.getElementById("clock");
const speedInput = document.getElementById("speed");
const speedValue = document.getElementById("speedValue");
function hangEquilibrium() {
y[0] = 0;
v[0] = 0;
for (let i = 1; i < N; ++i) {
// Spring between i-1 and i carries the weight of masses i..N-1.
const extension = (N - i) * M * G / K;
y[i] = y[i - 1] + REST + extension;
v[i] = 0;
}
}
function reset() {
mode = "held";
simTime = 0;
timeAcc = 0;
markerWorld = null;
hangEquilibrium();
releaseBtn.disabled = false;
}
function release() {
if (mode !== "held") return;
// Marker is placed at the visual lower edge of the bottom end cap.
markerWorld = y[N - 1] + BOTTOM_CAP_H / SCALE;
simTime = 0;
timeAcc = 0;
mode = "falling";
releaseBtn.disabled = true;
}
function physicsStep() {
// Every mass feels gravity.
for (let i = 0; i < N; ++i) acc[i] = G;
// Identical Hookean spring + dashpot between each neighbouring pair.
// Positive y is downward.
for (let s = 0; s < S; ++s) {
const len = y[s + 1] - y[s];
const rate = v[s + 1] - v[s];
const T = K * (len - REST) + C * rate;
const aDue = T / M;
acc[s] += aDue; // tension pulls upper node downward if positive
acc[s + 1] -= aDue; // and lower node upward
}
// Semi-implicit Euler: update velocities, then positions.
for (let i = 0; i < N; ++i) {
v[i] += acc[i] * DT;
y[i] += v[i] * DT;
}
simTime += DT;
}
function screenY(worldY) {
return TOP_Y + worldY * SCALE;
}
function computeDrawTensions() {
for (let s = 0; s < S; ++s) {
tensionDraw[s] = K * (y[s + 1] - y[s] - REST);
}
}
function drawSupport() {
const barY = TOP_Y - 18;
ctx.lineWidth = 6;
ctx.strokeStyle = "#5d6f9e";
ctx.beginPath();
ctx.moveTo(CX - 130, barY);
ctx.lineTo(CX + 130, barY);
ctx.stroke();
ctx.lineWidth = 2;
ctx.strokeStyle = "#394a76";
for (let x = CX - 126; x <= CX + 126; x += 16) {
ctx.beginPath();
ctx.moveTo(x, barY);
ctx.lineTo(x - 11, barY - 15);
ctx.stroke();
}
// Draw the hanger only while the slinky is still supported.
if (mode === "held") {
ctx.lineWidth = 2;
ctx.strokeStyle = "#8fa4d8";
ctx.beginPath();
ctx.moveTo(CX, barY);
ctx.lineTo(CX, screenY(y[0]) - 3);
ctx.stroke();
}
}
function drawSlinky() {
computeDrawTensions();
ctx.lineWidth = 2.4;
for (let s = 0; s < S; ++s) {
const y1 = screenY(y[s]);
const y2 = screenY(y[s + 1]);
const mid = (y1 + y2) * 0.5;
const ry = Math.max(0.8, Math.abs(y2 - y1) * 0.5);
// Colour by elastic tension only, not dashpot force.
const norm = tensionDraw[s] / (N * M * G);
let hue;
if (norm >= 0) {
hue = 212 - 178 * Math.min(1, norm); // blue -> amber/red as stretched
} else {
hue = 188; // cyan if compressed
}
ctx.strokeStyle = `hsl(${hue}, 75%, 62%)`;
ctx.beginPath();
ctx.ellipse(CX, mid, COIL_R, ry, 0, 0, Math.PI * 2);
ctx.stroke();
}
// Top node.
ctx.fillStyle = "#e8eeff";
ctx.beginPath();
ctx.arc(CX, screenY(y[0]), 3.4, 0, Math.PI * 2);
ctx.fill();
// Bottom end cap. Its lower edge is the marker height.
const bottomY = screenY(y[N - 1]);
ctx.fillStyle = "#ffd166";
ctx.fillRect(CX - 14, bottomY, 28, BOTTOM_CAP_H);
}
function drawMarker() {
if (markerWorld === null) return;
const my = screenY(markerWorld);
ctx.save();
ctx.setLineDash([9, 7]);
ctx.lineWidth = 2;
ctx.strokeStyle = "rgba(255, 93, 93, .95)";
ctx.beginPath();
ctx.moveTo(24, my);
ctx.lineTo(CSS_W - 24, my);
ctx.stroke();
ctx.setLineDash([]);
ctx.fillStyle = "rgba(255, 130, 130, .95)";
ctx.font = "12px system-ui, sans-serif";
ctx.fillText("bottom height at release", 28, my - 7);
ctx.restore();
}
function draw() {
ctx.clearRect(0, 0, CSS_W, CSS_H);
drawSupport();
drawSlinky();
drawMarker();
}
let lastT = null;
function frame(t) {
requestAnimationFrame(frame);
if (lastT === null) lastT = t;
let dt = (t - lastT) / 1000;
lastT = t;
// If the tab was hidden or the frame was very late, do not make a huge leap.
if (dt > 0.1) dt = 0.016;
if (mode === "falling") {
timeAcc += dt * speed;
// Safety valve for extremely slow frames: drop simulated time rather than spin forever.
const maxAcc = DT * 8000;
if (timeAcc > maxAcc) timeAcc = maxAcc;
while (timeAcc >= DT) {
physicsStep();
timeAcc -= DT;
}
}
draw();
clockEl.textContent = Math.floor(simTime * 1000) + " ms";
}
releaseBtn.addEventListener("click", release);
resetBtn.addEventListener("click", reset);
speedInput.addEventListener("input", () => {
speed = Number(speedInput.value) / 100;
speedValue.textContent = speed.toFixed(2) + "×";
});
reset();
requestAnimationFrame(frame);
})();
</script>
</body>
</html>
As far as I can verify by construction, yes for the first few hundred milliseconds. The initial state is the exact non-uniform static solution, so at the instant of release the bottom node has zero net force and the top node is the only node with an unbalanced force. After release there is no constraint, no frozen node, and no delayed script: the bottom node can only move because its neighbouring spring changes force, so it should remain essentially on the marker until the disturbance reaches it.
I am confident about the qualitative behaviour and the stability at the default parameters. I am less certain about millisecond precision in the exact moment the bottom first visibly leaves the marker: the release is a large-amplitude event, and the discrete chain has tiny precursors and numerical dispersion. The predicted visible departure should be around 0.30–0.35 s, but a somewhat earlier or later first visible motion would not surprise me.
The later motion is where the model is least like a real slinky. The springs are ideal Hookean springs and can push as well as pull, and the damping is deliberately small, so after the collapse front passes the chain may oscillate rather than settling into a dead lump. That is a limitation of the chosen ideal mass-spring model, not scripted behaviour.