The judge grows up, trees get drawn, and every statement gets rewritten
- changelog
The judge runs current languages
Judge0 ships language runtimes frozen in 2019, and we had been living with them. Four of them moved this week:
- Java 13 → Java 25 (Temurin)
- Node 12 → Node 24
- Rust 1.40 → Rust 1.98, on edition 2024
Together with the Python 3.14 and Swift 6.2 runtimes already in place, that means records, Stream.toList(), modern generics, let/const ergonomics, and six years of standard-library additions now compile on the judge instead of failing with syntax errors. The version each language actually runs is written in the editor's language dropdown, so there is no guessing.
Go (1.13), C++ (GCC 9.2) and C# (Mono 6.6) are still on the stock 2019 runtimes and are next.
Bumping a runtime is not just a version string. The JVM inside the sandbox sizes its heap off the host's 30 GB rather than the submission's own cap, so it grew past the memory limit before collecting; that is fixed with explicit JVM flags. Go was going to be here too — its 1.27 toolchain needs more processes and more compile time than the sandbox allows, so it stays on 1.13 for now and gets its own update once the judge image carries a prebuilt build cache.
Trees you can see
Problems that take or return a binary tree used to show you a flat level-order array like [3,9,20,null,null,15,7] and leave the shape to your imagination. Those examples are now drawn as diagrams in the Examples panel — inputs labeled by parameter name, outputs beside the returned tree — on the practice page, in collab rooms, and in study groups.
This is driven strictly by the problem's declared signature, so a tree-shaped array that isn't actually a tree never gets diagrammed. The tree problems also dropped the duplicate text copy of their examples; the explanation now sits under the diagram.
Every statement, rewritten
The house style for problem statements — plain wording, no bold emphasis for drama, an explicit "Return ..." sentence, no em dashes — was only being applied to new imports. All 291 existing standard problems have now been rewritten to match, in fifteen batches, each one gated on a mechanical audit script and reviewed for meaning-preservation.
Separately, sixteen descriptions were quietly coaching you: naming the technique, telling you sliding window doesn't apply, comparing naive and intended complexity, tacking on follow-up challenges. Descriptions now define the task and nothing else. Where a problem is pointless without a complexity bound, the bound is stated plainly as a requirement rather than as a hint.
The Learn section explains itself
The Learn header's tagline said nothing useful. It now carries a short intro and a "How to use this section" guide: pace, how far to take a category before moving on, reviewing solutions in Activity, practising cold, coverage versus interview scope, the global chat, and streaming your practice. It is a grid of icon cards, open by default so a first-time visitor actually sees it, and collapsing it is remembered.
The warning you get for jumping to a category out of order also lost its "Uncharted depth" heading and now leads with the recommendation itself.
Smaller things
The notification bell in the header no longer just navigates — it opens a dropdown of your recent notifications with a link to the full inbox, and opening it marks exactly the rows it showed.
Global chat draws a date separator between messages whenever the calendar day changes, labeled Today, Yesterday, or the full date, so backlog you page into is no longer undated.
The Format button worked in JavaScript and nowhere else, because Monaco only ships a formatter for one of our eight languages. The other seven now have an indentation-only formatter — it reindents, and touches nothing else, leaving multi-line strings byte-for-byte intact.
And two judging bugs: printing a set or dictionary while debugging could be mistaken for the harness's own output, reporting "Malformed harness output" or shifting every verdict over by one and failing a correct solution; and a submission whose process ended before all cases ran could still be accepted. Both are fixed. Results also come back as soon as the judge finishes now, instead of on the next poll.