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

legal block — balanced, and both halves the same shape unfinished — the two counts have not met yet wrong — balanced but the shapes differ, or split, or the number disagrees proved — what the selected rung already knows

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.

boardbalanced setshalves in one piecehalves congruentsurvives
6×6254,09920,7169,3753.7%
8×8704,87862,50925,4253.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 swapswaps it objects toswaps it is the only objection to
a block falls into two pieces17,505234
one half falls into two pieces17,109144
the halves stop being the same shape1,57083
a number disagrees with its block3676
two numbers end up in one block31921

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.

boardtouching pairsunions that are legal blocksunions legal without the shape clausepairs with no number between them
6×64790 (0.0%)83 (17.3%)83
8×89660 (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.

boardshadingdrawnhas an answerhas one without the shape clause
6×6uniform150143 (95.3%)145 (96.7%)
6×6blobby150102 (68.0%)137 (91.3%)
8×8uniform8072 (90.0%)77 (96.3%)
8×8blobby8032 (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 kept6×6 unique8×8 unique
10/180 (0.0%)0/180 (0.0%)
20/180 (0.0%)0/180 (0.0%)
32/180 (1.1%)0/180 (0.0%)
419/180 (10.6%)0/180 (0.0%)
529/180 (16.1%)1/180 (0.6%)
662/180 (34.4%)0/180 (0.0%)
791/180 (50.6%)2/180 (1.1%)
8120/180 (66.7%)5/180 (2.8%)
98/180 (4.4%)
1015/180 (8.3%)
1133/180 (18.3%)
1252/180 (28.9%)
1368/180 (37.8%)
one in every block30/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

rung6×6 cells settled8×8 cells settled6×6 boards finished8×8 boards finished
only11.7%6.0%1/360/36
bond62.7%36.4%19/367/36
area81.9%53.1%29/3617/36
probe100.0%100.0%36/3636/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.

misreadingboardintended answer still legalanswersstill unique
drop the shape clause6×636/36median 9 over 36 boards, 1 past the 400 cap3
drop the shape clause8×836/36median 276 over 36 boards, 14 past the 400 cap1
let a half be in pieces6×636/36median 1 over 36 boards, max 1324
let a half be in pieces8×836/36median 5 over 36 boards, max 40013
read "same shape" as "same orientation"6×61/361/36 boards have any answer at all0
read "same shape" as "same orientation"8×80/360/36 boards have any answer at all0

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).

cellsfixedA001168freeA000105one-sidedA000988
1111111
2221111
3662222
419195577
5636312121818
621621635356060
7760760108108196196
82,7252,725369369704704
99,9109,9101,2851,2852,5002,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.

gridsolverblock-first brute forcepublished
2×1111
2×2222
2×3333
2×4555
2×5888
2×6131313
2×7212121
3×4111111
4×4363636
4×6281281281
5×61,1831,183
6×66,7286,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 shadeblock shapesof which the halves only slidedistinct half shapes
1221
21681
3104322
46781265
53,18249812

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.