Skip to content

I Built a Coding Gauntlet to Trip Up 7 Free AI Chatbots. None Fell.

I invented two coding specs no model had ever seen, wired up a hidden test suite, and ran seven free AI chatbots through it. I expected a leaderboard. I got a clean sweep.

Eddie Ochieng

Eddie Ochieng

August 21, 2026

6 min read
Code on a computer screen
Photo: Bibek ghosh / Pexels

I wanted to know something simple. In 2026, is there any real difference between the free versions of the big AI chatbots when it comes to writing code, or have they all quietly converged into the same competent blur? The only honest way to find out was to test them myself, so that is what I did.

The trick was to invent a problem none of them could have seen before. A memorised solution proves nothing. A brand new spec with a few nasty edge cases buried in it is a real test of whether a model reads carefully and thinks, rather than pattern matching against its training data.

How I actually tested this

This is a hands-on piece, not a researched one. I wrote two small specification prompts, built a hidden test suite of edge cases for each, and gave the identical prompt to seven free chatbots in fresh chats with memory turned off. Then I pasted each model’s function into my grader and ran it. The scores below are real numbers off my own machine, not vibes.

The first challenge

Round one looked trivial. Write a Python function that cleans and reformats a string. The difficulty was hidden in the ordering of the rules and a handful of edge cases that punish anyone who skims.

Round 1 — the prompt
Write a Python function normalize(code: str) -> str that transforms a
string according to these rules, applied in this exact order:

1. Keep only ASCII letters (a-z, A-Z) and ASCII digits (0-9). Discard
   spaces, punctuation, accented letters, and anything non-ASCII.
2. Uppercase the remaining letters.
3. If nothing remains, return "EMPTY" and stop.
4. Keep only the first 12 characters.
5. Pad on the right with 'X' until the length is a multiple of 4.
6. Insert a hyphen between each group of 4 characters.

The traps are the accented characters (anyone reaching for Python’s isalnum without an ASCII guard keeps é and ö and fails), the empty case, padding the final block to a multiple of four, and getting the truncate then pad then group order right. I built ten test cases hitting every one of those.

Round 1: everyone aced it

All seven scored ten out of ten. Every single model correctly guarded the ASCII trap. Every one handled the empty string, the padding, the ordering. Not one of them slipped. I sat there slightly deflated, because I had built this test to produce a loser and it refused to produce one.

A nice touch

One small delight. ChatGPT did not trust the standard library at all. Instead of isalnum it hand-wrote the character ranges, which sidesteps the Unicode trap entirely by being explicit. Different instinct from the rest, and a correct one.

ChatGPT, going its own way
result = ''.join(c for c in code
    if ('a'<=c<='z') or ('A'<=c<='Z') or ('0'<=c<='9')).upper()

So I made it nastier

If the easy trap could not separate them, I would use a genuinely counterintuitive one. Round two ranks the characters in a string by frequency, and breaks ties in a direction almost nobody expects.

Round 2 — the prompt
Write a Python function dedup_ranked(s: str) -> str:

1. Remove every space character.
2. If nothing remains, return "EMPTY".
3. Treat characters case-sensitively ('A' and 'a' are different).
4. Rank the distinct characters by frequency, most frequent first.
5. Break ties by CODE POINT, HIGHEST first — 'z' before 'a', '9' before
   '0', lowercase before uppercase.
6. Return the ranked characters joined into one string.

Rule five is the whole game. The obvious tie-break is alphabetical, ascending. The lazy one is whatever order a Counter happens to produce. The spec asks for neither. To get it right, a model has to actually read that rule and implement a descending code point sort on purpose. I was certain this would finally split the field.

Round 2: another clean sweep

Ten out of ten. All seven. Again. Every model read rule five correctly and implemented the descending tie-break, either by sorting with reverse turned on or by negating both sort keys. Nobody defaulted to alphabetical. Nobody forgot the case-sensitivity. I genuinely could not break them.

What this actually means

Two invented specs, seven free chatbots, twenty edge cases each, and a perfect score across the board. The headline is uncomfortable if you still think of free AI as the budget option. For small, well specified coding tasks, correctness is essentially a solved problem. The question of which free model gets the answer right is close to meaningless now, because they all do.

That does not mean they are interchangeable. It means the thing that separates them has moved. When every model passes, the difference is no longer in whether the code works, it is in how the code is written. That turned out to be a whole article of its own.

What this does not test

One honest limit. This tested small, self-contained problems with a single correct answer. It says nothing about large real codebases, ambiguous requirements, or tasks that need judgement rather than instruction-following. Those are where models still diverge, and where a paid tier or a stronger model earns its keep. A clean spec is the easy case, and the easy case is now easy for everyone.

FAQ

Which free AI is best at coding?+

On small, well-specified problems like the ones I tested, they were indistinguishable, all seven scored a perfect ten out of ten twice. The real differences show up in code style and on larger, messier tasks, not on bounded problems with a clear right answer.

Did you test the paid versions?+

No. Every model here was on its free tier, including Claude. The point was to see how good free AI has become, and the answer is very good.

Could the models have seen these problems before?+

No. I invented both specs, so there was no memorised solution to copy. That is what makes a perfect score meaningful rather than lucky.

So it does not matter which free chatbot I use for code?+

For quick, well-defined tasks, correctness will not be the deciding factor. Choose on the things that still vary, code style, verbosity, and how the tool handles bigger jobs. That is the subject of the companion piece.

They all got the right answer. So I read every line of code they wrote, and asked the only question left, whose code would I actually trust. For the researched view of these assistants, see ChatGPT vs Gemini vs Claude.

Eddie Ochieng

Eddie Ochieng

Eddie Ezekiel Ochieng is a software developer and the editor of The Test Card. He has been writing code since 2016 and has spent the last six years building production web applications for clients, work that runs from a non-profit’s platform to a community dictionary and a personal-safety service. He builds mostly in TypeScript, React and Next.js, with Node, Python and PostgreSQL behind them.

He started The Test Card out of mild irritation. Most AI tool coverage is written by people who never ship anything and never have to live with a bad tool choice. He does. The question that interests him is the practical one, which of these tools survive contact with real work, and which are just a subscription you forget to cancel.

He is not an AI researcher and does not pretend to be. What he brings instead is a builder’s scepticism, a habit of actually reading the documentation and the pricing page, and a bias toward simplicity over novelty. Good software, as he puts it, should feel as good as it works.

eddie-ezekiel.com

Leave a Comment

Share your thoughts about this article