Under construction. Want updates when new features land?

FAQ

How the solver works, and why I trust its answers.

How many letters can the solver take?

Anywhere from 3 to 16. Twelve letters is a real Q-Less roll; with more than 12, words may run up to 15 letters, the longest the dictionaries go.

What does the solver show?

Every anagram of your letters: each dictionary word of 3 or more letters you can build from them. Then the first crossword it finds that uses every letter, or proof that none exists. Hard inputs get 5 seconds before it gives up, and Another Solution searches in a different order for a different layout.

What does “Common words only” do?

It limits the solution to the 30,000 most frequent words on the web, from Peter Norvig’s word counts over Google’s trillion-word corpus. That leaves about 21,312 words of the NASPA Word List. Words that are almost always written capitalized are left out, since on the web they are usually names. The limit covers every word on the board, including ones formed where two words cross.

If no common-words solution turns up, because none exists or the search ran out of time, the solver switches to all words automatically and tells you.

Which dictionary does it use?

The NASPA Word List 2023, the dictionary Q-Less uses, unless you pick Collins Scrabble Words in the header. The stored results for every roll are NASPA only.

What counts as a solution?

A roll is 12 letter dice. A solution puts all 12 into one connected grid where every across and down run is a valid 3-to-12-letter word. I answer, for any roll: can it be solved, and in how many ways?

How does the solver find anagrams?

Every word in a solution has to be buildable from the roll's letters. I give each dictionary word a 26-bit letter mask, so one bitwise check rules out most of the 196,000 words; the rest get an exact letter-count check. A roll keeps 50 to 900 anagrams.

How does it build crosswords?

I place one anagram, then attach more words through shared letters, trying every legal placement and undoing each after. A placement is legal if overlaps match, its new letters are still on the dice, and every run it makes is a word or the start of one. When all 12 dice are down, I check the whole board once more.

Two details keep it complete. A solution's words always connect through shared cells, so building from every starting word reaches every solution. And a layout and its transpose count as one, compared after shifting to a common origin, so nothing is counted twice.

How do you know a roll is unsolvable?

To call a roll unsolvable, I have to try everything first. Three things keep that cheap: I remember each board state so I never re-explore it, I run on PyPy (about 10x faster here), and 10 worker processes each take a roll at a time.

Do you have every solution for every roll?

Finding every solution of every roll costs hours per roll, so for now I stop at the first: solvable rolls settle in under a second, unsolvable ones in seconds. Full enumeration is available on demand per roll.

Why trust the answers?

I cross-checked the solver against a separate brute-force one that shares no code: no pruning, a different board layout, checks only at the end. On test rolls both found the exact same solutions. The word list is the NASPA Word List 2023, and every result stores the roll's anagram count, placements tried, and search time.