I gave GPT-6, DeepSeek V4.1 Flash 1017 and Gemini 4 Argon the same little task: one amber ball bouncing inside a rotating cyan hexagon. π§ͺ
Same starting position. Same gravity. Same controls. I kept each model's HTML untouched and replayed the results side by side.
Demo outputs, replayed at the same simulation times.
Argon draws a plain outline and trail. DeepSeek adds a bright halo and shaded ball. GPT fills the hexagon and uses a shorter, subtler trail. The differences are visible immediately.
But I also wanted to know whether the controls and collisions worked.
A small task with something to check
The brief fixed the canvas at 600 Γ 400 pixels, the ball radius at 10 pixels, gravity at 300 pixels/sΒ², and the physics step at 1/120 second. The wall rotated at 0.35 radians/s. Each demo needed Pause, Reset and a speed slider.
The model also had to expose a small replay function, renderAt(seconds). That let me compare the same point in simulated time instead of three unrelated screen recordings.
The routes differed:
- Argon: Google AI Studio, Medium thinking, first response.
- GPT-6: ChatGPT, Instant mode, first response. This is the displayed ChatGPT model label, not a pinned API checkpoint.
- DeepSeek Flash 1017: Hugging Face through Novita. The first request exhausted its 8,192-token output allowance on reasoning. A larger buffered request timed out. The displayed demo came from a third request using streaming, low reasoning effort and a 16,384-token ceiling.
I kept the generated HTML unchanged. These are three selected outputs from different hosted setups, with the failed DeepSeek attempts retained. Treat this as a small workflow comparison, not a model leaderboard.
The buttons all worked β
Pause, resume, reset and changing the rotation speed passed in all three demos.
Then I checked whether the ball stayed inside its hexagon at 13 sampled times: 0, 1, β¦, 12 seconds. The checker calculated distance to each wall independently from the saved ball position and hexagon angle, allowing one pixel of tolerance.
| Generated demo | Control checks | Containment samples passed | Median replay call |
|---|---|---|---|
| Gemini 4 Argon | 4/4 | 12/13 | 0.4 ms |
| DeepSeek Flash 1017 | 4/4 | 13/13 | 1.9 ms |
| GPT-6, ChatGPT Instant | 4/4 | 13/13 | 0.7 ms |
At the 12-second sample, Argon's ball was outside. The GIF shows it leaving the visible scene. Passing the other samples does not establish continuous containment between them.
Actual canvas outputs at 12 seconds. The position checker, rather than the missing dot alone, establishes that Argon's ball has escaped.
The replay timings include advancing 720 physics steps from the start and drawing one frame. I used five warm-up calls, then twenty timed calls per demo in one browser session. A shared animation-clock wrapper made the control tests repeatable; the generated source stayed unchanged.
Browser-local replay work, including Canvas calls. These values measure neither model generation latency nor normal-animation frame rate. GPU completion is not separately timed.
The useful test: stop the wall
A rotating wall can give energy to a ball. So a faster bounce, by itself, doesn't prove a bug.
I set the wall speed to zero and recorded the demos' normal fixed-step animation. At the first collision, I split velocity into two parts:
- Into the wall: the normal component, which should reverse on a bounce.
- Along the wall: the tangential component, which friction should oppose in this point-mass demo.
The sideways speed changed by:
- Argon: +27.3%.
- DeepSeek: β10.0%.
- GPT: β12.0%.
Apparently friction had other plans.
Measured from saved before/after states, including the gravity update before impact. Each value describes that demo's own first collision. GPT starts its hexagon at a different orientation, so the contact geometry differs. The two reductions reflect different friction choices; neither is a quality score.
Here's the suspicious part of Argon's generated code:
const jn = -(1 + E) * vn;
const jtMax = MU * jn;
const jt = Math.max(-jtMax, Math.min(jtMax, -vt));
In that branch, vn is positive, so jn is negative. Multiplying by MU leaves jtMax negative too. The clamp's supposed lower bound becomes larger than its upper bound.
For the recorded first contact, that adds to the positive tangential velocity instead of resisting it. The measured speed increase agrees with the sign error. π‘
That check came after inspecting the source. It is an exploratory diagnostic, not a test I had frozen before generation. I haven't isolated how much this bug contributes to the later escape; the collision handling deserves its own checks too.
What the GIF tells meβand what it misses
The functional differences take a little more work. All the buttons passed. All three reproduced the same numerical state when replaying the same time. Yet the stationary-wall check exposed a friction error, and the later position check caught an escape.
Even the tiny instruction to stay within 160 lines was missed: Argon returned 180 lines, DeepSeek 185 and GPT 173, counting the extracted HTML file's lines.
For this kind of AI coding post, I'd show the animation first, then put one small physical check beside it. A glowing ball gets attention. Its velocity tells me whether the code did what I asked. π
More on DeepSeek
This comparison follows two earlier posts: checking the model alias, harness and checkpoint and reading Flash 1017βs prompts with its Python encoder. The first explains what model is being served; the second walks through its prompt format.
References and credits
- Rafa's four-model rocket comparison inspired the comparison format. These scenes and measurements are separate; no media from that post is reused.
- DeepSeek V4.1 Flash 1017 model card.
- Hugging Face inference-provider documentation.
- Google AI Studio and official OpenAI model documentation describe the interfaces used. Actual model labels and settings were recorded during the runs.
Visual credits: browser renders of the generated demo code, original comparison layout and plots calculated from saved measurements. No external image assets were used.
AI disclosure
AI was used to draft the article.




Top comments (0)