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.
At full speed, the top will move immediately while the bottom remains essentially on the marker: I predict the bottom will still be there at 100 ms and at 180 ms, by which time the top should have fallen roughly 0.39 m and the larger upper gaps should have closed. The bottom should begin clearly visible downward motion at about 220 ms, and by 300 ms it should be unmistakably below the marker. Initially the top mass accelerates at approximately (64g), because it feels its own weight plus the tension supporting the other 63 masses; every other mass, including the bottom one, initially has zero net force. Release removes only the support force. The change must then propagate through neighbour-to-neighbour spring forces, so there is no physical reason for the bottom to start falling immediately. After the disturbance reaches the bottom, the whole slinky falls, with its centre of mass accelerating at very nearly (g), apart from the small air drag.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>The falling slinky</title>
<style>
:root {
color-scheme: dark;
--bg: #07101d;
--panel: #101c2c;
--panel-2: #152337;
--line: #2b3c52;
--text: #e8eef7;
--muted: #9cacc0;
--cyan: #67e8f9;
--amber: #fbbf24;
}
* { box-sizing: border-box; }
body {
margin: 0;
min-height: 100vh;
background:
radial-gradient(circle at 20% 0%, #14283e 0, transparent 42rem),
var(--bg);
color: var(--text);
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}
main {
width: min(1180px, 100%);
margin: 0 auto;
padding: 28px 20px 24px;
}
header { margin-bottom: 20px; }
.kicker {
margin: 0 0 6px;
color: var(--cyan);
font-size: 0.75rem;
font-weight: 750;
letter-spacing: 0.16em;
text-transform: uppercase;
}
h1 {
margin: 0;
font-size: clamp(1.8rem, 4vw, 2.8rem);
line-height: 1.05;
letter-spacing: -0.035em;
}
header p:last-child {
margin: 10px 0 0;
color: var(--muted);
font-size: 1rem;
}
.exhibit {
display: grid;
grid-template-columns: minmax(0, 1fr) 292px;
gap: 16px;
align-items: stretch;
}
.stage {
min-width: 0;
overflow: hidden;
border: 1px solid var(--line);
border-radius: 16px;
background: #0b1524;
box-shadow: 0 18px 50px rgba(0, 0, 0, 0.24);
}
canvas {
display: block;
width: 100%;
height: clamp(460px, 69vh, 720px);
}
.stage-note {
padding: 9px 14px;
border-top: 1px solid var(--line);
color: var(--muted);
background: rgba(7, 16, 29, 0.72);
font-size: 0.76rem;
line-height: 1.4;
}
aside {
padding: 18px;
border: 1px solid var(--line);
border-radius: 16px;
background: linear-gradient(180deg, var(--panel-2), var(--panel));
}
.clock-label,
.readout-label {
display: block;
color: var(--muted);
font-size: 0.69rem;
font-weight: 700;
letter-spacing: 0.11em;
text-transform: uppercase;
}
#clock {
display: block;
margin-top: 4px;
color: #f8fbff;
font-family: ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", monospace;
font-size: 2rem;
font-variant-numeric: tabular-nums;
line-height: 1.2;
}
.buttons {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 9px;
margin: 18px 0 20px;
}
button {
min-height: 43px;
border: 1px solid #3a4d64;
border-radius: 9px;
background: #213149;
color: var(--text);
font: inherit;
font-weight: 700;
cursor: pointer;
}
button:hover:not(:disabled) { filter: brightness(1.12); }
button:focus-visible, input:focus-visible, summary:focus-visible {
outline: 3px solid rgba(103, 232, 249, 0.55);
outline-offset: 3px;
}
#release {
border-color: #0891b2;
background: #087d96;
color: white;
}
button:disabled {
opacity: 0.43;
cursor: default;
}
.speed-heading {
display: flex;
justify-content: space-between;
gap: 12px;
margin-bottom: 8px;
font-size: 0.9rem;
font-weight: 650;
}
#speedValue {
color: var(--cyan);
font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
font-variant-numeric: tabular-nums;
}
input[type="range"] {
width: 100%;
margin: 4px 0;
accent-color: #22c3dc;
cursor: pointer;
}
.range-labels {
display: flex;
justify-content: space-between;
color: var(--muted);
font-size: 0.72rem;
}
.readouts {
display: grid;
gap: 13px;
margin: 20px 0;
padding: 15px 0;
border-top: 1px solid var(--line);
border-bottom: 1px solid var(--line);
}
.readout-value {
display: block;
margin-top: 3px;
font-size: 0.9rem;
font-weight: 650;
line-height: 1.35;
}
#offset {
font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
font-variant-numeric: tabular-nums;
}
.hint {
color: var(--muted);
font-size: 0.8rem;
line-height: 1.5;
}
details {
margin-top: 15px;
color: var(--muted);
font-size: 0.78rem;
line-height: 1.5;
}
summary {
color: var(--text);
cursor: pointer;
font-weight: 650;
}
details p { margin-bottom: 0; }
.caption {
margin: 14px 4px 0;
color: var(--muted);
font-size: 0.82rem;
line-height: 1.5;
}
@media (max-width: 820px) {
main { padding: 20px 12px; }
.exhibit { grid-template-columns: 1fr; }
aside { order: -1; }
canvas { height: 470px; }
.readouts { grid-template-columns: 1fr 1fr; }
}
</style>
</head>
<body>
<main>
<header>
<p class="kicker">Mass · springs · gravity</p>
<h1>The falling slinky</h1>
<p>Watch the bottom dot against the amber line when you let go.</p>
</header>
<section class="exhibit" aria-label="Falling slinky simulation">
<div class="stage">
<canvas id="stage" aria-label="A vertical mass-and-spring slinky hanging from a fixed support">
Your browser needs canvas support to display this exhibit.
</canvas>
<div class="stage-note">
Fixed camera. Motion is one-dimensional; the horizontal coil wiggle is only a drawing of the springs.
</div>
</div>
<aside>
<div>
<span class="clock-label">Simulation clock</span>
<output id="clock">0 ms</output>
</div>
<div class="buttons">
<button id="release" type="button">Release</button>
<button id="reset" type="button">Reset</button>
</div>
<label for="speed">
<span class="speed-heading">
<span>Speed</span>
<span id="speedValue">1.00×</span>
</span>
</label>
<input id="speed" type="range" min="0.05" max="1" step="0.01" value="1"
aria-label="Simulation speed, from one twentieth to full speed">
<div class="range-labels"><span>1/20×</span><span>1×</span></div>
<div class="readouts">
<div>
<span class="readout-label">State</span>
<strong class="readout-value" id="state">Held · true equilibrium</strong>
</div>
<div>
<span class="readout-label">Bottom below marker (+ down)</span>
<strong class="readout-value" id="offset">—</strong>
</div>
</div>
<p class="hint">
At 0.05×, 220 ms of simulated motion takes about 4.4 seconds to watch.
The offset is measured from the actual bottom mass, not inferred from a curve.
</p>
<details>
<summary>Model details</summary>
<p>
64 equal masses and 63 linear springs; every spring also has a small dashpot.
The springs act in both tension and compression. There is no coil-contact
model, no release timer, and no pinned mass after Release. Reset restores
the analytic hanging equilibrium. The marker is captured at Release and
is not moved by Reset.
</p>
</details>
</aside>
</section>
<p class="caption">
The amber line marks the bottom position at the instant of release.
The simulation clock measures physical simulation time, so slowing the exhibit
does not change the trajectory or the millisecond value at which an event occurs.
</p>
</main>
<script>
(() => {
"use strict";
// Physics constants (SI units throughout).
const N = 64;
const MASS = 0.002;
const K = 170;
const REST_LENGTH = 0.008;
const G = 9.81;
const SPRING_DAMPING = 0.004;
const AIR_DAMPING = 0.00004;
const DT = 0.0001;
const y = new Float64Array(N);
const v = new Float64Array(N);
const force = new Float64Array(N);
let released = false;
let simulationTime = 0;
let accumulator = 0;
let markerY = null;
let speed = 1;
const canvas = document.getElementById("stage");
const ctx = canvas.getContext("2d");
const clockEl = document.getElementById("clock");
const stateEl = document.getElementById("state");
const offsetEl = document.getElementById("offset");
const releaseButton = document.getElementById("release");
const resetButton = document.getElementById("reset");
const speedSlider = document.getElementById("speed");
const speedValue = document.getElementById("speedValue");
let viewWidth = 1;
let viewHeight = 1;
let pixelRatio = 1;
let lastTime = performance.now();
function setHangingEquilibrium() {
y.fill(0);
v.fill(0);
force.fill(0);
// Spring j carries the weight of masses j+1 through N-1.
// This makes every unsupported mass exactly force-balanced.
y[0] = 0;
for (let j = 0; j < N - 1; j++) {
const tension = (N - 1 - j) * MASS * G;
y[j + 1] = y[j] + REST_LENGTH + tension / K;
}
}
function physicsStep() {
// Gravity and equal, linear air drag on every mass.
for (let i = 0; i < N; i++) {
force[i] = MASS * G - AIR_DAMPING * v[i];
}
// Positive springForce is tension: it pulls the endpoints together.
// Equal and opposite forces are added to the two neighbouring masses.
for (let j = 0; j < N - 1; j++) {
const extension = y[j + 1] - y[j] - REST_LENGTH;
const relativeSpeed = v[j + 1] - v[j];
const springForce = K * extension + SPRING_DAMPING * relativeSpeed;
force[j] += springForce;
force[j + 1] -= springForce;
}
// Semi-implicit Euler. After Release this updates EVERY mass with
// exactly the same rule. There is no support test, clamp, or timer here.
for (let i = 0; i < N; i++) {
v[i] += (force[i] / MASS) * DT;
y[i] += v[i] * DT;
}
simulationTime += DT;
}
function releaseSlinky() {
if (released) return;
markerY = y[N - 1];
simulationTime = 0;
accumulator = 0;
released = true;
releaseButton.disabled = true;
stateEl.textContent = "Released · all 64 masses free";
lastTime = performance.now();
}
function resetSlinky() {
released = false;
simulationTime = 0;
accumulator = 0;
setHangingEquilibrium();
releaseButton.disabled = false;
stateEl.textContent = "Held · true equilibrium";
lastTime = performance.now();
// markerY deliberately survives Reset.
}
function updateSpeed() {
speed = Number(speedSlider.value);
speedValue.textContent = speed.toFixed(2) + "×";
speedSlider.setAttribute(
"aria-valuetext",
speed.toFixed(2) + " times full simulation speed"
);
}
function resizeCanvas() {
const rect = canvas.getBoundingClientRect();
viewWidth = Math.max(1, rect.width);
viewHeight = Math.max(1, rect.height);
pixelRatio = Math.min(2, window.devicePixelRatio || 1);
canvas.width = Math.round(viewWidth * pixelRatio);
canvas.height = Math.round(viewHeight * pixelRatio);
}
function updateReadouts() {
const milliseconds = Math.floor(simulationTime * 1000 + 1e-7);
clockEl.textContent = milliseconds + " ms";
if (markerY === null) {
offsetEl.textContent = "—";
} else {
const millimetres = (y[N - 1] - markerY) * 1000;
offsetEl.textContent =
(millimetres >= 0 ? "+" : "") + millimetres.toFixed(1) + " mm";
}
}
function draw() {
const W = viewWidth;
const H = viewHeight;
const TOP = 56;
const WORLD_VIEW_HEIGHT = 1.45;
const usableHeight = Math.max(100, H - 88);
const pixelsPerMetre = usableHeight / WORLD_VIEW_HEIGHT;
const centreX = W * 0.5;
const coilRadius = Math.max(15, Math.min(30, W * 0.032));
const screenY = worldY => TOP + worldY * pixelsPerMetre;
ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);
ctx.clearRect(0, 0, W, H);
ctx.fillStyle = "#0b1524";
ctx.fillRect(0, 0, W, H);
// Quiet spatial grid.
ctx.lineWidth = 1;
ctx.strokeStyle = "rgba(148, 163, 184, 0.075)";
ctx.setLineDash([]);
for (let metres = 0; metres <= WORLD_VIEW_HEIGHT + 1e-9; metres += 0.25) {
const gy = screenY(metres);
ctx.beginPath();
ctx.moveTo(16, gy);
ctx.lineTo(W - 16, gy);
ctx.stroke();
}
ctx.strokeStyle = "rgba(148, 163, 184, 0.10)";
ctx.setLineDash([2, 8]);
ctx.beginPath();
ctx.moveTo(centreX, TOP - 26);
ctx.lineTo(centreX, H - 30);
ctx.stroke();
ctx.setLineDash([]);
ctx.font = "600 10px system-ui, sans-serif";
ctx.fillStyle = "rgba(196, 211, 228, 0.68)";
ctx.fillText(
released ? "RELEASED · NO PINNED MASSES" : "HELD · TRUE EQUILIBRIUM",
20,
26
);
// The release marker never tracks the bottom after it is created.
if (markerY !== null) {
const my = screenY(markerY);
if (my > -30 && my < H + 30) {
ctx.strokeStyle = "#fbbf24";
ctx.lineWidth = 1.6;
ctx.setLineDash([9, 7]);
ctx.beginPath();
ctx.moveTo(18, my);
ctx.lineTo(W - 18, my);
ctx.stroke();
ctx.setLineDash([]);
const label = "BOTTOM AT RELEASE";
ctx.font = "700 10px system-ui, sans-serif";
const labelWidth = ctx.measureText(label).width;
ctx.fillStyle = "rgba(11, 21, 36, 0.90)";
ctx.fillRect(20, my - 24, labelWidth + 14, 18);
ctx.fillStyle = "#fbbf24";
ctx.fillText(label, 27, my - 11);
}
}
// Fixed support. It remains drawn after release, but exerts no force.
ctx.strokeStyle = "#71839a";
ctx.fillStyle = "#a9b8ca";
ctx.lineWidth = 2;
ctx.beginPath();
ctx.moveTo(centreX - 68, TOP - 14);
ctx.lineTo(centreX + 68, TOP - 14);
ctx.moveTo(centreX, TOP - 14);
ctx.lineTo(centreX, TOP);
ctx.stroke();
ctx.lineWidth = 1;
for (let x = centreX - 62; x <= centreX + 62; x += 13) {
ctx.beginPath();
ctx.moveTo(x, TOP - 14);
ctx.lineTo(x - 8, TOP - 24);
ctx.stroke();
}
ctx.beginPath();
ctx.arc(centreX, TOP, 3.2, 0, Math.PI * 2);
ctx.fill();
if (W > 620) {
ctx.font = "600 10px system-ui, sans-serif";
ctx.fillStyle = "#8fa1b7";
ctx.fillText("FIXED SUPPORT", centreX + 78, TOP - 16);
}
const topScreenY = screenY(y[0]);
const bottomScreenY = screenY(y[N - 1]);
// Draw one projected coil per actual spring. Only y is physical.
if (topScreenY < H + 100 && bottomScreenY > -100) {
ctx.beginPath();
ctx.moveTo(centreX, topScreenY);
const samplesPerSpring = 8;
for (let j = 0; j < N - 1; j++) {
for (let s = 1; s <= samplesPerSpring; s++) {
const t = s / samplesPerSpring;
const worldPosition = y[j] + (y[j + 1] - y[j]) * t;
const phase = (j + t) * Math.PI * 2;
ctx.lineTo(
centreX + coilRadius * Math.sin(phase),
screenY(worldPosition)
);
}
}
ctx.lineJoin = "round";
ctx.lineCap = "round";
ctx.strokeStyle = "rgba(0, 0, 0, 0.48)";
ctx.lineWidth = 4.2;
ctx.stroke();
ctx.strokeStyle = "#67e8f9";
ctx.lineWidth = 1.75;
ctx.stroke();
function drawEndpoint(py, radius, fill, stroke) {
if (py < -20 || py > H + 20) return;
ctx.beginPath();
ctx.arc(centreX, py, radius, 0, Math.PI * 2);
ctx.fillStyle = fill;
ctx.fill();
ctx.lineWidth = 1.5;
ctx.strokeStyle = stroke;
ctx.stroke();
}
drawEndpoint(topScreenY, 4.2, "#e8eef7", "#213149");
drawEndpoint(bottomScreenY, 5.6, "#fbbf24", "#7c4a03");
if (W > 470) {
ctx.font = "750 10px system-ui, sans-serif";
if (topScreenY > -10 && topScreenY < H + 10) {
ctx.fillStyle = "#e8eef7";
ctx.fillText("TOP", centreX + coilRadius + 11, topScreenY + 4);
}
if (bottomScreenY > -10 && bottomScreenY < H + 10) {
ctx.fillStyle = "#fbbf24";
ctx.fillText("BOTTOM", centreX + coilRadius + 11, bottomScreenY + 4);
}
}
} else if (released && topScreenY > H) {
ctx.font = "600 13px system-ui, sans-serif";
ctx.fillStyle = "#9cacc0";
ctx.textAlign = "center";
ctx.fillText("The slinky has fallen below the fixed camera view.", W / 2, H * 0.55);
ctx.fillText("Press Reset to repeat the experiment.", W / 2, H * 0.55 + 23);
ctx.textAlign = "start";
}
}
function frame(now) {
const elapsed = Math.max(0, (now - lastTime) / 1000);
lastTime = now;
if (released) {
// The 50 ms cap avoids an enormous catch-up after a hidden tab.
// It changes neither forces nor the fixed integration timestep.
accumulator += Math.min(elapsed, 0.05) * speed;
while (accumulator >= DT) {
physicsStep();
accumulator -= DT;
}
}
updateReadouts();
draw();
requestAnimationFrame(frame);
}
releaseButton.addEventListener("click", releaseSlinky);
resetButton.addEventListener("click", resetSlinky);
speedSlider.addEventListener("input", updateSpeed);
window.addEventListener("resize", resizeCanvas, { passive: true });
updateSpeed();
resizeCanvas();
resetSlinky();
updateReadouts();
requestAnimationFrame(frame);
})();
</script>
</body>
</html>
The initial force sums and release implementation can be checked directly: every mass below the support starts force-balanced, the first released top acceleration is 627.84 m/s², and the bottom has no timer, pin, or special update rule. The bottom-offset readout is the actual integrated bottom position relative to the stored marker.
I have not executed the rendered HTML in a browser here, so I cannot honestly claim to have observed the bottom departure at 220 ms. The qualitative prediction is supported by the implemented model and its 219.5 ms propagation scale, but the specific visual checks—still on the line at 180 ms, moving by about 220 ms, and clearly below it by 300 ms—remain measurements to make, not results I am going to assert. If those observations disagree, my timing prediction is wrong.
The supplied parameters are numerically comfortable, and speed is the only visitor-adjustable physics-related setting; slowing down should not change the trajectory. This is still a one-dimensional idealisation: the linear springs also compress, and there is no hard coil-to-coil contact model, so detailed coil packing and later bouncing should not be treated as quantitative predictions for a particular real slinky. At long times the slinky simply leaves the fixed camera view; Reset repeats the experiment.