Heteromino
Cut every white cell of the board into trominoes — pieces of three cells, so either a straight bar or an L. Two pieces of the same shape may not share an edge, and shape means shape as drawn: turn an L a quarter turn and it counts as a different piece, so there are six of them. Drag across three cells to lay a piece down; tap a piece to take it off. There are no numbers anywhere. The black cells are the entire clue.
the board
The clue is a hole, and the hole is also a wall
Heteromino has no numbers. No arrows, no regions, no circles. A setter hands you a grid with some cells blacked out, and that is the entire message — every board in this puzzle is a subset of cells and nothing else. Which makes the clue language unusually easy to describe and unusually awkward to use, because one black cell does two jobs at once. It takes a cell out of the tiling, which is the obvious job. And it stands between pieces, so that two pieces of the same shape which would have been illegal neighbours are legal after all. You cannot spend one job without spending the other.
The second job is not a curiosity. Of the 72 boards shipped here, 65 (90.3%) contain at least one pair of same-shaped pieces sitting on opposite sides of a single black cell — 263 such pairs across 1,968 pieces, a median of 3 per board and 11 at the most. Take that one cell away and those two pieces are touching twins.
The blank board
Before any clue at all: how many ways does an empty grid fall into
heterominoes? The cell count has to divide by three, so most
rectangles are disqualified before we start (marked ·).
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1×n | · | · | 1 | · | · | 0 | · | · | 0 | · | · | 0 |
| 2×n | · | · | 2 | · | · | 4 | · | · | 8 | · | · | 16 |
| 3×n | 1 | 2 | 8 | 14 | 28 | 70 | 144 | 304 | 688 | 1,476 | 3,168 | 6,956 |
| 4×n | · | · | 14 | · | · | 130 | · | · | 1,414 | · | · | 14,894 |
| 5×n | · | · | 28 | · | · | 686 | · | · | 20,077 | · | · | 584,442 |
| 6×n | 0 | 4 | 70 | 130 | 686 | 4,552 | 15,218 | 70,654 | 372,124 | 1,525,273 | 6,893,222 | 10,887,414* |
| 7×n | · | · | 144 | · | · | 15,218 | · | · | 2,001,412 | · | · | 5,375,356* |
* a lower bound — the count was still running when it hit its node budget. Every other figure is exact, and the small ones are re-derived from scratch on each test run.
The first row is the whole rule in miniature. A 1×n strip has no tiling at all for any n except 3. In a single row the only piece that fits is the horizontal bar, and two horizontal bars in one row always share an edge — so a strip can hold one piece and never two. That also makes the blank 1×3 the only board in this puzzle that is a legal puzzle with no clues whatsoever: one answer, nothing printed.
Two rows, and the answer is a power of two
The second row is not a mess either:
| strip | 2×3 | 2×6 | 2×9 | 2×12 | 2×15 | 2×18 |
|---|---|---|---|---|---|---|
| tilings | 2 | 4 | 8 | 16 | 32 | 64 |
| 2m | 2 | 4 | 8 | 16 | 32 | 64 |
| bars used | 0 | 0 | 0 | 0 | 0 | 0 |
| pieces crossing a block | 0 | 0 | 0 | 0 | 0 | 0 |
tilings of a blank 2 × 3m strip = 2m
Exactly, at every width measured. The count is the boring part; the structure behind it is checked directly and says more than the arithmetic does. Across every one of those tilings, no bar is ever used and no piece ever crosses a three-column boundary. The strip is not really a strip — it is a row of independent 2×3 blocks, each cuttable by two L's in two ways, and 2m is just the product. The argument is short enough to check by hand: put a bar in the top row of the leftmost three columns and the cell underneath it still needs a piece; every L that could take that cell wants a top-row cell that is already gone; the only thing left is the bar directly underneath, which is the same shape, touching. So no bar can start at the left edge — and the same trap then propagates rightwards.
It is the rule doing this and not the shape set: switch the same-shape rule off and a blank 2×6 has more than four tilings again, bars included. That check is in the test suite.
Clue space is thin, and thinnest where it matters
Because a clue set is nothing but a subset of cells, "how good is this as a clue language" is a question you can answer by brute force: walk every black-cell set of every legal size on a small board and count the answers each one admits.
| board | black cells | clue sets | no answer | many answers | exactly one |
|---|---|---|---|---|---|
| 3×4 | 0 | 1 | 0.0% | 100.0% | 0.0% |
| 3×4 | 3 | 220 | 37.3% | 20.0% | 42.7% |
| 3×4 | 6 | 924 | 79.7% | 1.6% | 18.7% |
| 3×5 | 0 | 1 | 0.0% | 100.0% | 0.0% |
| 3×5 | 3 | 455 | 34.3% | 42.9% | 22.9% |
| 3×5 | 6 | 5,005 | 78.5% | 4.1% | 17.4% |
| 4×4 | 1 | 16 | 0.0% | 100.0% | 0.0% |
| 4×4 | 4 | 1,820 | 54.6% | 21.2% | 24.2% |
| 4×4 | 7 | 11,440 | 84.3% | 2.3% | 13.3% |
| 3×6 | 0 | 1 | 0.0% | 100.0% | 0.0% |
| 3×6 | 3 | 816 | 28.2% | 54.2% | 17.6% |
| 3×6 | 6 | 18,564 | 76.3% | 7.7% | 16.0% |
| 3×6 | 9 | 48,620 | 91.8% | 1.1% | 7.1% |
| 4×5 | 2 | 190 | 2.1% | 90.5% | 7.4% |
| 4×5 | 5 | 15,504 | 57.9% | 20.0% | 22.1% |
| 4×5 | 8 | 125,970 | 87.1% | 3.0% | 9.8% |
| 4×6 | 0 | 1 | 0.0% | 100.0% | 0.0% |
| 4×6 | 3 | 2,024 | 15.6% | 71.1% | 13.2% |
| 4×6 | 6 | 134,596 | 65.6% | 18.8% | 15.6% |
| 4×6 | 9 | 1,307,504 | 89.5% | 3.3% | 7.2% |
| 5×5 | 1 | 25 | 0.0% | 100.0% | 0.0% |
| 5×5 | 4 | 12,650 | 24.9% | 64.6% | 10.5% |
| 5×5 | 7 | 480,700 | 72.2% | 14.3% | 13.5% |
| 5×6 | 0 | 1 | 0.0% | 100.0% | 0.0% |
| 5×6 | 3 | 4,060 | 4.6% | 93.5% | 1.9% |
| 5×6 | 6 | 593,775 | 48.2% | 40.1% | 11.7% |
| 6×6 | 0 | 1 | 0.0% | 100.0% | 0.0% |
| 6×6 | 3 | 7,140 | 2.6% | 97.0% | 0.3% |
| 6×6 | 6 | 1,947,792 | 33.7% | 58.7% | 7.6% |
Two things fall out. Unique boards are rare everywhere — the best cell in that table is 3×4 at 3 clues, and even there only 42.7% of clue sets work. And the failure mode flips as clues are added: at low clue counts the boards that fail have too many answers, at high clue counts they have none, because the black cells have chopped the grid into regions whose sizes are not multiples of three. Uniqueness lives in a narrow band between "hasn't said enough" and "has said something impossible", and the band narrows as the board grows.
That also fixes how sparse a board can be. The census is exhaustive, so these are exact minima rather than search results:
| board | cells | sparsest clue set that pins an answer | density |
|---|---|---|---|
| 3×4 | 12 | 3 | 25.0% |
| 3×5 | 15 | 3 | 20.0% |
| 4×4 | 16 | 4 | 25.0% |
| 3×6 | 18 | 3 | 16.7% |
| 4×5 | 20 | 2 | 10.0% |
| 4×6 | 24 | 3 | 12.5% |
| 5×5 | 25 | 4 | 16.0% |
| 5×6 | 30 | 3 | 10.0% |
| 6×6 | 36 | 3 | 8.3% |
A setter cannot scatter clues; they have to search
Scale up by sampling and the band closes fast:
| board | samples per clue count | best clue count | unique boards there |
|---|---|---|---|
| 6×6 | 4,000 | 9 | 8.1% |
| 8×8 | 1,500 | 13 | 1.5% |
| 10×10 | 600 | 22 | 0.7% |
| 12×12 | 300 | 0 | 0% |
At 6×6 you can find a puzzle by throwing clues at
the board. By 12×12 you cannot: across every clue count in
the sweep, 0 of 5,100 randomly
clued boards had exactly one answer. So the generator here does not
sample. It scatters k black cells, counts the answers,
and then walks the black cells around the board one move at a
time, downhill in answer count. Moving is the only edit available:
black cells cannot be added or removed one at a time without breaking
the multiple-of-three constraint, which is also why this puzzle has no
"erase clues while it stays unique" step of the kind most solvers'
generators end with. What the walk reaches inside a fixed budget:
| board | sparsest clue set the search reached | density |
|---|---|---|
| 6×6 | 3 | 8.3% |
| 8×8 | 7 | 10.9% |
| 10×10 | 13 | 13.0% |
| 12×12 | 24 | 16.7% |
A bound on the search, not on the puzzle. The exhaustive table above is the one that says what exists.
Every clue is load-bearing
Take a shipped board and move one black cell to a random empty cell, leaving the clue count untouched:
| board | single-clue moves tried | still exactly one answer | no answer at all |
|---|---|---|---|
| 8×8 | 1,440 | 6.2% | 30.8% |
| 12×12 | 3,888 | 3.4% | 41% |
Almost every move destroys the puzzle, and most destroy it by making it unsolvable rather than ambiguous — the same asymmetry the exhaustive census shows, seen this time from inside a board that works.
What each half of the rule is worth
| rule set | boards that stop being unique | of those, boards left with no answer |
|---|---|---|
| nothing removed | 0 / 72 | 0 |
| no same-shape rule (pure tromino packing) | 72 / 72 | 0 |
| rotations count as the same shape | 72 / 72 | 72 |
The same-shape rule is not a garnish on a packing puzzle; it is load-bearing for essentially every board. Tightening it the other way is just as destructive. Count a rotated L as the same shape — the convention LITS uses — and boards do not become more constrained and more unique; they become unsolvable, because the intended answer itself stops being legal.
Which trominoes actually get used
| I— | I| | L┌ | L┐ | L└ | L┘ | bars | |
|---|---|---|---|---|---|---|---|
| shipped answers | 16.1% | 15.5% | 16.5% | 16.5% | 17.7% | 17.7% | 31.6% |
| every tiling of a blank 3x6 | 18.1% | 15.2% | 16.7% | 16.7% | 16.7% | 16.7% | 33.3% |
| every tiling of a blank 4x6 | 17.3% | 16.9% | 16.4% | 16.4% | 16.4% | 16.4% | 34.2% |
| every tiling of a blank 6x6 | 14.9% | 14.9% | 17.5% | 17.5% | 17.5% | 17.5% | 29.9% |
| every tiling of a blank 2x12 | 0.0% | 0.0% | 25.0% | 25.0% | 25.0% | 25.0% | 0.0% |
I expected bars to be suppressed. A bar has one long flat side, and a long flat side is a lot of edge on which to run into a twin, so the rule ought to punish it. It barely does: bars are 31.6% of the pieces in the shipped answers against the 33.3% an unweighted shape set would give, and 29.9% across every tiling of a blank 6×6. Two or three points. Recorded as a null result rather than quietly dropped.
The exception is the one place the effect is not statistical at all. In a blank 2×12 bars are 0.0% of pieces — the two-row strip cannot use one, as above. Where the geometry is tight enough the rule excludes bars outright; where it is not, it hardly leans on them.
A pleasant consequence of the rule, visible on the board above: colouring each piece by its shape is automatically a proper colouring of the piece-adjacency graph, because same-coloured pieces are exactly the ones forbidden from touching. Six colours, guaranteed to suffice, for free.
What the ladder costs
Branch points needed to prove the shipped boards unique, at each rung, summed over the set. For scale, a board carries 170.7 candidate pieces on average at 8×8 and 377.1 candidate pieces on average at 12×12.
fit | region | hetero | probe | |
|---|---|---|---|---|
| 8×8, 40 boards | 7,046 | 6,547 | 6,537 | 0 |
| 12×12, 32 boards | 103,060 | 78,098 | 77,459 | 39 |
That is a strange-looking ladder. region — the rule that
an open region has a multiple of three cells, which sounds like it
should be doing a lot — takes 7.1%
off fit at 8×8 and
24.2%
at 12×12. hetero, the rung that encodes the
puzzle's own rule, takes off another
0.2%
and 0.8%.
Then probe takes 8×8 to
0 and 12×12
to 39. Almost flat,
then a cliff.
The reason shows up more plainly if you ask what each rung can prove from an untouched board, before any guess at all — which is exactly what the checkbox above the board displays:
| cells proved before any guess | fit | region | hetero | probe |
|---|---|---|---|---|
| 8×8 | 2.1% | 2.1% | 2.1% | 100% |
| 12×12 | 3.9% | 3.9% | 4.2% | 88.1% |
There is nothing on the board to propagate from. Every other puzzle in this series prints something — a number, an arrow, a region edge — that pins a cell or two locally and gives a fixpoint somewhere to start. Heteromino prints holes. Every open cell starts with 9.5 candidate pieces on average and no local rule can eliminate any of them, so the first three rungs between them settle 2.1% and 4.2% of the board and then stop. One level of lookahead — assume a piece, propagate, keep it only if that survives — settles 100% and 88.1%. Heteromino is, to a good approximation, exactly singleton-consistency-hard: nothing below probe works, and probe needs almost no search on top.
The bug the second engine caught
The search branches on "which piece owns this cell", which partitions the answers, so the subtrees are disjoint and nothing needs excluding between them. The first version excluded each tried candidate from the parent state anyway and re-propagated, as a tidy-looking optimisation. Propagation could then commit a later candidate to that same cell — and when that candidate's own branch came up, the commit found the cell already owned, returned false, and the branch was skipped in silence. It lost answers without ever raising an error: the propagator reported 5 tilings of a blank 3×4 where the scanner reported 14. Nothing about the propagator looked wrong on its own. It took a second engine sharing no code with it to say so.