Playground
An empty editor with the runner attached. The starters load the scaffolding you would otherwise rewrite every time — list and tree builders, a graph, a heap, union-find — plus two harnesses for checking your own work.
Output
Starters
How it runs. Your code executes in this page, inside a function scope with a shadowed console, so it cannot reach the real console or disturb anything on the site. console.log prints; a bare expression on the last line prints as a returned value; top-level await works.
Always strict mode. Every panel on this site runs with "use strict", which is what modules and class bodies do anyway. Two places you may notice: an unowned function call gives this === undefined rather than the global object, and writing to a frozen property throws a TypeError instead of being silently ignored.
Runaway loops. Loop conditions are rewritten before running so a while (true) throws after two million iterations rather than freezing the tab. This matters here more than elsewhere: an unbounded while is exactly what a wrong binary search produces. A for...of over an endless generator has no condition to rewrite, so that one can still hang — reload if it does.
Deep recursion. A recursive flood fill over a very large grid will throw RangeError: Maximum call stack size exceeded, exactly as it would in a real submission. That is a genuine constraint, not a limitation of this page, and it is why lesson 23 recommends an explicit stack for large inputs.
What is kept. The editor contents are saved to this browser's localStorage under the dsa. prefix, so a reload does not lose your work. Reset restores the original starter. Nothing is sent anywhere, because there is nowhere for it to be sent.