Double Choco
Cut the grid into blocks. Every block holds as many grey cells as cream ones — and the grey half and the cream half have to be the same shape, turned or mirrored if you like. A number says how many cells of each shade its block holds; a block holds at most one number, and may hold none. Drag across cells to draw a block; tap a finished block to take it back.
the board
Equal counts are cheap. Equal shapes are the puzzle.
Every cut-the-grid genre I had built before this one grades a region by a number — its area, how many cells it holds, what its cells add up to. Double Choco grades it by a shape, and a shape survives nothing. Take a legal block and move one cell from the grey half to the cream half: every count is still right, and the block is dead, because the two halves are no longer the same polyomino.
So before any number on the board is read, walk every connected set of at most eight cells on a shipped board and sort it. That is 958,977 sets with the right number of each shade; requiring each half to be in one piece leaves 83,225 of them (8.7%), and requiring the two halves to be the same shape leaves 34,800 (41.8% of what survived the first step, 3.6% of where we started). The rule as written is one sentence and it throws away 96.4% of the balanced sets.
| board | balanced sets | halves in one piece | halves congruent | survives |
|---|---|---|---|---|
| 6×6 | 254,099 | 20,716 | 9,375 | 3.7% |
| 8×8 | 704,878 | 62,509 | 25,425 | 3.6% |
And congruence is not a euphemism for "looks similar": only 34.7% of the surviving blocks have halves that are plain translates of one another, so the rest genuinely need a turn or a mirror. In the 774 blocks that shipped, 454 are slides (58.7%), 299 need a rotation (38.6%) and 21 need a reflection no rotation can imitate (2.7%).
The experiment that isolates the shape clause
Moving one cell from its block into a neighbour is the usual way to test how rigid an answer is, and here it is useless: all 5,377 such moves on the shipped boards are illegal, but 64.7% of them are illegal purely because the two counts stopped matching. Arithmetic catches everything, so nothing is learned.
The sharp experiment is a swap: trade a cell of block A for a cell of block B of the same shade. Every count on the board is unchanged. Every number still has the right number of cells under it. The only things left that can object are geometric. There are 17,860 such swaps available across the bank, and 0 of them are legal.
| what objects to the swap | swaps it objects to | swaps it is the only objection to |
|---|---|---|
| a block falls into two pieces | 17,505 | 234 |
| one half falls into two pieces | 17,109 | 144 |
| the halves stop being the same shape | 1,570 | 83 |
| a number disagrees with its block | 367 | 6 |
| two numbers end up in one block | 319 | 21 |
83 rearrangements of a shipped answer keep every count, keep every block and every half in one piece, keep every number happy — and are illegal anyway, because an S is not an L. That is the shape clause doing work that nothing else on the board could do.
The theorem that organises the weaker genre is vacuous here
Drop the shape clause and Double Choco becomes "equal counts", a genre with a clean little theorem. Glue two touching blocks that hold no number: the union is connected, still balanced, still numberless, so it is a legal different answer. Therefore no two numberless blocks may touch in a unique puzzle, and the minimum clue count is a graph invariant of the answer.
With the shape clause the glue has to produce a congruent pair, and it essentially never does. Of the 1,445 pairs of touching blocks across the shipped answers, 0 glue into a legal block. 241 of those pairs carry no number between them — in the equal-counts genre every single one of them would be a proof that the board is ambiguous, and here not one of them is.
| board | touching pairs | unions that are legal blocks | unions legal without the shape clause | pairs with no number between them |
|---|---|---|---|---|
| 6×6 | 479 | 0 (0.0%) | 83 (17.3%) | 83 |
| 8×8 | 966 | 0 (0.0%) | 158 (16.4%) | 158 |
Which is why the boards here can leave 349 of their 774 blocks — 45.1% — without a number at all: the shape clause is already holding those blocks in place, so the numbers do not have to.
What the shape clause does not buy: existence
Here is what I got wrong going in. Deciding whether a shading admits any answer at all is NP-complete (Đurić, 2022), so I expected random shadings to be mostly dead boards. Sampled with blocks capped at four cells of each shade, they are not — and the cap matters, because the "the whole grid is one block" escape that makes existence free in the equal-counts genre is not available under it either.
| board | shading | drawn | has an answer | has one without the shape clause |
|---|---|---|---|---|
| 6×6 | uniform | 150 | 143 (95.3%) | 145 (96.7%) |
| 6×6 | blobby | 150 | 102 (68.0%) | 137 (91.3%) |
| 8×8 | uniform | 80 | 72 (90.0%) | 77 (96.3%) |
| 8×8 | blobby | 80 | 32 (40.0%) | 46 (57.5%) |
Uniformly random shadings are easy to cut up either way — 90.0% at 8×8 with the shape clause against 96.3% without it. It is the blobby shadings, the ones that look like a real published board, where the clause bites: 40.0% against 57.5%. Big single-shade areas are exactly where a block cannot find a congruent partner nearby.
Either way, what the clause destroys is not existence but abundance, and uniqueness has to be built rather than found — which is why the generator draws the answer first, laying legal blocks down in raster order, and lets the shading fall out of the partition.
The dial is the numbers, and it is a short dial
A block holds at most one number, so the numbers can never say more than one thing per block — and the shipped boards use barely half of even that ceiling: 53.9% of blocks at 6×6, 55.5% of blocks at 8×8. Turn the dial the blunt way: put a number in m blocks at random, in a random cell of each, and ask whether the answer is still alone.
| numbers kept | 6×6 unique | 8×8 unique |
|---|---|---|
| 1 | 0/180 (0.0%) | 0/180 (0.0%) |
| 2 | 0/180 (0.0%) | 0/180 (0.0%) |
| 3 | 2/180 (1.1%) | 0/180 (0.0%) |
| 4 | 19/180 (10.6%) | 0/180 (0.0%) |
| 5 | 29/180 (16.1%) | 1/180 (0.6%) |
| 6 | 62/180 (34.4%) | 0/180 (0.0%) |
| 7 | 91/180 (50.6%) | 2/180 (1.1%) |
| 8 | 120/180 (66.7%) | 5/180 (2.8%) |
| 9 | — | 8/180 (4.4%) |
| 10 | — | 15/180 (8.3%) |
| 11 | — | 33/180 (18.3%) |
| 12 | — | 52/180 (28.9%) |
| 13 | — | 68/180 (37.8%) |
| one in every block | 30/36 (83.3%) | 29/36 (80.6%) |
The last row is the one worth staring at. A number in every single block is not enough: 6 of 36 boards at 6×6 and 7 of 36 boards at 8×8 still have a second answer when every block is labelled with its own size. The numbers are a ceiling as well as a dial, and the ceiling is not high.
The shipped boards carry 4.3 numbers at 6×6 and 7.6 numbers at 8×8, and each one has been checked the hard way: take any single number away and a second answer appears. Every board in the bank is a local minimum, and npm test re-derives that from the shipped file rather than trusting the generator.
The ladder
only— a cell that only one surviving block can cover belongs to that block.bond— intersect the blocks still available to a cell. Any cell in that intersection is in the same block whatever happens, so every block holding one of them without the other is dead.area— every block is balanced and lies inside one connected run of unclaimed cells, so no run may be left with unequal shades. This is the rung that notices a wall has strangled a corner.probe— assume a block, run the three rungs below, drop it if that alone contradicts.search— most-constrained cell first, over the same catalogue.
| rung | 6×6 cells settled | 8×8 cells settled | 6×6 boards finished | 8×8 boards finished |
|---|---|---|---|---|
only | 11.7% | 6.0% | 1/36 | 0/36 |
bond | 62.7% | 36.4% | 19/36 | 7/36 |
area | 81.9% | 53.1% | 29/36 | 17/36 |
probe | 100.0% | 100.0% | 36/36 | 36/36 |
Every board in the bank falls to probe without a single branch. Run the search at area instead and the median shipped board still takes 1 node at 6×6 and 3 nodes at 8×8, worst case 7 and 39.
Both ways of misreading the rule delete the puzzle, in opposite directions
The rule is usually written "each block holds the same number of grey and cream cells, and the two areas are the same shape". There are three things to get wrong, and they do not fail symmetrically.
| misreading | board | intended answer still legal | answers | still unique |
|---|---|---|---|---|
| drop the shape clause | 6×6 | 36/36 | median 9 over 36 boards, 1 past the 400 cap | 3 |
| drop the shape clause | 8×8 | 36/36 | median 276 over 36 boards, 14 past the 400 cap | 1 |
| let a half be in pieces | 6×6 | 36/36 | median 1 over 36 boards, max 13 | 24 |
| let a half be in pieces | 8×8 | 36/36 | median 5 over 36 boards, max 400 | 13 |
| read "same shape" as "same orientation" | 6×6 | 1/36 | 1/36 boards have any answer at all | 0 |
| read "same shape" as "same orientation" | 8×8 | 0/36 | 0/36 boards have any answer at all | 0 |
Loosen the rule and the intended answer stays perfectly legal — it just stops being the only one, and nothing looks wrong until you count. Tighten it, by forbidding the turn and the mirror, and the intended answer becomes illegal: 1 of the 72 boards has any answer at all under that reading, and the rest just go blank. The loose misreading is the dangerous one precisely because it is silent.
Counting, against numbers somebody else published
The shape engine is load-bearing — get congruence wrong and every number on this page is wrong in a way nothing else would catch — so it is made to reproduce the polyomino counts three different ways: fixed (A001168), free, i.e. up to rotation and reflection, which is exactly the relation the rule uses (A000105), and one-sided, rotations only (A000988).
| cells | fixed | A001168 | free | A000105 | one-sided | A000988 |
|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 1 | 1 | 1 | 1 |
| 3 | 6 | 6 | 2 | 2 | 2 | 2 |
| 4 | 19 | 19 | 5 | 5 | 7 | 7 |
| 5 | 63 | 63 | 12 | 12 | 18 | 18 |
| 6 | 216 | 216 | 35 | 35 | 60 | 60 |
| 7 | 760 | 760 | 108 | 108 | 196 | 196 |
| 8 | 2,725 | 2,725 | 369 | 369 | 704 | 704 |
| 9 | 9,910 | 9,910 | 1,285 | 1,285 | 2,500 | 2,500 |
And the solver is pinned to a sequence that has nothing to do with chocolate. Cap every block at one cell of each shade and shade the board like a chequerboard: a block is then one grey cell and one cream cell side by side, and two single cells are trivially the same shape — so Double Choco is domino tiling, and the answer counts have to be the published ones.
| grid | solver | block-first brute force | published |
|---|---|---|---|
| 2×1 | 1 | 1 | 1 |
| 2×2 | 2 | 2 | 2 |
| 2×3 | 3 | 3 | 3 |
| 2×4 | 5 | 5 | 5 |
| 2×5 | 8 | 8 | 8 |
| 2×6 | 13 | 13 | 13 |
| 2×7 | 21 | 21 | 21 |
| 3×4 | 11 | 11 | 11 |
| 4×4 | 36 | 36 | 36 |
| 4×6 | 281 | 281 | 281 |
| 5×6 | 1,183 | — | 1,183 |
| 6×6 | 6,728 | — | 6,728 |
Finally, a count this repository had to work out for itself: how many block shapes exist at each half size — an unordered pair of congruent polyominoes, disjoint, with a connected union, counted up to translation. It is the size of the vocabulary the whole genre is written in, and searching the OEIS for it in September 2026 returns nothing.
| cells of each shade | block shapes | of which the halves only slide | distinct half shapes |
|---|---|---|---|
| 1 | 2 | 2 | 1 |
| 2 | 16 | 8 | 1 |
| 3 | 104 | 32 | 2 |
| 4 | 678 | 126 | 5 |
| 5 | 3,182 | 498 | 12 |
Three engines
The catalogue is the one thing every number above depends on, so it is checked against two enumerators that have never heard of it. bruteByBlocks takes the first unclaimed cell and grows every connected set out of it. bruteByBorders never mentions a block at all: it walks the cells in raster order, decides the two borders that arrive with each one, and only checks the rules when a component can no longer grow. All three agree on the answer set, not merely the count, and all three reproduce the domino tilings. Of the 72 shipped boards, 72 carry a legal answer and 72 have exactly the answer they shipped with.