Invariant
The theory is not the hard part.
Doing it is.
Problems in mathematics and computer science, each one marked, each one told why — and each one pointed at the chapter that fixes what you got wrong.
- Mathematics
- C++, Rust, Python
- Systems and architecture
- Algorithms
No account, no install, nothing to pay for. Your progress is kept in this browser and you can export it whenever you like.
Questions
Multiple choice, predict the output, order the steps, and written mathematics checked as mathematics rather than as text.
Coding exercises
Write a program, run it on the samples, submit it against the hidden cases. C++ and Python compile in this tab with nothing installed.
Systems
Caches, pipelines, memory ordering, the operating system underneath, and the hardware questions that come with an FPGA attached.
Learn
Every track drawn as the tree of what it rests on, so a thing you cannot do yet comes with the order to learn it in.
How it goes
-
1
Pick something
Filter by topic, difficulty or what you have not finished — or open the track you are on and take the next node in it.
-
2
Answer it properly
An expression is parsed and compared as mathematics, not matched as a string. A program is compiled and run against real cases, and the sanitizer has to be quiet when the problem says so.
-
3
Find out why
Wrong answers come with the reason, the case that broke it, and the reading that covers it. The solution unlocks when you have earned it or decided to look.
What you get for it
It runs in the tab
C++ compiles in the browser, on a real Clang built to WebAssembly, and Python runs on a real CPython built the same way. So does Rust — a real rustc, with the real borrow checker. Anything graded by a sanitizer needs a runner you start yourself, or a small proxy you deploy, and the bar under the editor always names which one answered.
Marking that can be argued with
Bad syntax is told apart from a wrong answer. A failing case shows the input, what was expected and what came out. Nothing is certified correct because it looked right at a few sampled points.
A record you own
Solves, drafts, submissions, XP and a year of activity, all in this browser. Export it as JSON to carry it somewhere else, or to hand it to the Learning Tree tracker.
Start with one problem.
That is the whole method.
Problems
Learn
Looking for something specific rather than a route through it? Every concept, by topic.
Drag or scroll to move, Shift+scroll sideways, Ctrl+scroll to zoom. Arrow keys walk the tree; Enter opens a node. Over an open panel, scroll reads the panel.
Review
Online Assessments
Tracks
Reading
Every concept the problems rest on, with where to actually read it. Tick a reading when you have read it — it is your own record, and twenty of them unlocks something.
Anonymous
Activity
Per topic
Titles
Earned, never bought. Wearing one is a claim the record supports.
Achievements
Shop
Cosmetics only. Spending coins never costs you XP or a rank, so there is nothing here to regret buying.
Settings
Profile
Editor
Keywords, the standard-library names these problems use with the header each comes from, and whatever you have already written in the file. Ctrl+Space asks for them even when this is off.
Code execution
How to run C++ and Rust → — what the three modes are, which of them work for you right now, and a step-by-step setup for Windows.
npm run runner
One command, from the repository folder. It checks the toolchain, prints what is
missing, and then listens on 127.0.0.1 only.
Hosted execution
A small proxy you deploy yourself, which holds the execution credential server-side
and applies its own rate limits — proxy/ in the repository, with a
Cloudflare Worker entry and a Node one. Leave it empty to run nothing but JavaScript
unless a local runner is up. Nothing is ever sent to a local address unless the
toolbar says Local.
Advanced setup
Use the address 127.0.0.1 rather than the name localhost:
browsers exempt loopback addresses from mixed-content blocking so this page
can reach them over plain HTTP, but Firefox does not extend that to the name.
The runner writes a fresh token on every start and the page picks it up from the repository folder. Paste it here only when the site is served from somewhere that file is not — the published page, for instance.
Under Docker instead, if you would rather not use WSL:
docker compose -f judge/compose.yml up -d
A default hosted address can be baked into data/config.json so the
published site has one without anybody typing it in. The address above overrides it
for this browser.
Your data
Everything lives in this browser. Export it to carry it to another
machine, or to commit it as data/progress.json.
One file: progress, drafts, the programs you submitted and your assessment
attempts. A file exported by an older version still imports.
Solves export separately, in the shape the tracker's
Data ▸ Import solved problems already accepts, under the
source systems.
Storage
Checking…
Danger
Clears every solve, all XP and coins, and everything you own. Export first if you want it back.
Where your code runs
Almost always: here, in this tab, with nothing installed and nothing paid for. C++, Python, Rust, JavaScript and SystemVerilog all have a real compiler or interpreter built for WebAssembly, fetched the first time you press Run. This page says what is working right now, and — for the handful of exercises that cannot run in a browser and say so — what the alternatives are. Those are optional, and this page is the only place they are mentioned.
Check what works right now
This compiles and runs a real program on each backend that claims to be available. Nothing here reports success until a program has actually come back with the right answer.