About the daily
How Words of Hanoi is made.
It is not the Tower of Hanoi. The name is a joke about tubes. Here is the rule, the generator, the proof that every board can be finished, and what par does and does not mean.
The rule
Twelve letter tiles sit in five test tubes, four tiles high. A move takes the top tile of one tube and drops it on any tube with room. Any letter may sit on any letter. You win when every tube is either empty or a full four letter word.
Any word from the list counts, not only the three the setter started from. Finishing with words nobody intended is the point.
How the daily is made
The Crux app schedules one Words of Hanoi puzzle for each UTC day. This page asks the app for that day's puzzle id and seed, and nothing else. The board itself is never sent. It is generated in your browser from the string puzzleId:seed, with the same engine the app runs, so the web board and the app board for a date are the same board.
The generator hashes that string with FNV-1a to seed a small pseudo random number generator, draws the day's words from a fixed list by index, stacks them into tubes as a solved board, and then walks away from the solution one legal move at a time. On the medium tier, which is what the daily plays, that walk is twenty eight moves, never stepping straight back the way it came.
function seededRandom(text) {
let seed = 2166136261;
for (let i = 0; i < text.length; i += 1) {
seed = Math.imul(seed ^ text.charCodeAt(i), 16777619);
}
return () => {
seed = (seed + 0x6D2B79F5) | 0;
let value = Math.imul(seed ^ (seed >>> 15), seed | 1);
value ^= value + Math.imul(value ^ (value >>> 7), value | 61);
return ((value ^ (value >>> 14)) >>> 0) / 4294967296;
};
}
The whole engine is a plain browser module at /hanoi-engine.js and the word list is at /hanoi-words.js. Neither is minified. A set of forty golden seeds pins the web port to the app's engine, so if the two ever drift, the build fails before a player sees a wrong board.
Why every board is solvable
Every legal move can be reversed by another legal move: the tile that just landed is now on top, and the tube it left has room for it. The generator starts from a solved board and takes a run of legal moves. Reversing that run, last move first, walks the scrambled board back to the solved one. So a route to a win exists for every board the generator can produce, by construction.
The same fact means you can never be stuck. Any board you reach from the start can be walked back to the start, and from the start the setter's route still applies. The page checks this at load: if the setter's route fails to solve the board it was given, the page refuses that board, logs a parity failure, and plays a labelled backup edition instead. A test runs a full year of dailies through that check, and none of them trips it.
How many boards are there? Twelve distinct tiles in five tubes of height four can be arranged in 320 different tube shapes, and within a shape the tiles can be ordered 12! ways, which is about 153 billion positions. Repeated letters collapse some of those. Breadth first search over that space is cheap for a shallow scramble and gets expensive on the expert tier, which is why par is what it is.
What par is, and is not
Par is the setter's route: the scramble walk played backwards, with any pair of moves that immediately cancel each other removed. It is a route that is known to work. It is not the shortest route, and the page never claims it is.
Beating par is the brag, and it is often possible, because the scramble wanders. If you write a solver and find a shorter route, post it. Once you have solved the day's board, the seed and a snippet that rebuilds it appear at the bottom of this page, so a route you post can be checked by anyone.
The word list
Nine hundred and two common four letter words. Both COSY and COZY are in it. So are FITS, SUMS and JOBS, because plurals and verb forms are words too. The list is the file linked above, and any word in it counts as a finish. If a word you would happily use is missing, say so wherever you found this puzzle. The list grows by request, and every addition changes future boards only, never a past one.
The clock
The puzzle changes at midnight UTC, because that is when the app changes it, and the two should agree. The stats panel on the play page shows that moment in your own time zone. A board you are halfway through survives the rollover: it stays on the page until you finish it or reset.
Nothing about your play leaves your browser except the share strip you choose to copy. Streaks and counts live in local storage. There is no login and no tracking.
Today's seed
The seed for today's board appears here once you have solved it on this browser. Before that it would be a spoiler: the generator turns a seed into the solved words in a few lines of code.
The engine was fed . Paste this into a browser console on crux.quest and it rebuilds the board you just solved, the setter's finish and par. Swap the import for a local copy of the engine and it runs in Node 20 or newer.