Nanro (ナンロー, also published as Signpost Numbers) in the browser
with five rule sets inside. The grid is cut into regions. Write a
number in some cells and leave the rest blank so that (1) every region
holds at least one number, (2) inside a region every number is the same
and equals how many of that region's cells are numbered, (3) all the
numbers form one connected group, (4) no 2×2 block is entirely
numbered, and (5) two adjacent numbered cells in different regions
hold different numbers. Puzzle #43 in the solver series.
Demo: https://sen.ltd/portfolio/nanro/
Repo: https://github.com/sen-ltd/nanro
You never choose a digit — you count it
Rule 2 is the whole personality of the puzzle. A region's label is the
size of the set it numbers, so the digits are not free variables at all: an
answer is completely described by the set S of numbered cells, and the
labels follow as the function region r ↦ |S ∩ r|.
That is why this board has no keypad. You mark cells, and every digit on
screen is a live count of its own region — flip one mark and a whole
region's digits move together. The solver has the same shape: one
two-valued variable per cell, plus one label variable per region that the
count pins. Cells are the only free variables, which is what makes
branching on nothing but numbered or blank a complete search.
The ladder, five levels:
| level | rule |
|---|---|
count |
region arithmetic: numbered ≤ label ≤ numbered + unknown, and both saturating ends |
block |
+ no 2×2 fully numbered (three numbers close the fourth cell) |
clash |
+ equal labels may not touch across a border, propagated both ways |
reach |
+ connectivity: unreachable components die, and cut vertices of the pinned group must be numbered (one lowlink DFS finds them all) |
probe |
+ assume one cell, run reach to fixpoint, drop the assumption on contradiction |
A clue is two facts, and one of them is nearly worthless
A printed clue says two separate things at once:
- this cell is numbered — the position half;
- this region counts to v — the value half.
The halves are independent, so they can be handed out independently. The
repo models all three regimes (full, a position-only MARK, and a
region-level labelHints) and then measures each one. Same answers, same
clue cells, one half withheld.
Here every numbered cell of the answer is clued (q = 1 — the answer
printed on the board), and one half of every clue is erased:
| board | full clue | position only | value only |
|---|---|---|---|
| 5×5 | 100.0% | 36.0% | 1.5% |
| 6×6 | 100.0% | 17.5% | 0.5% |
| 8×8 | 100.0% | 8.7% | 0.0% |
| 10×10 | 100.0% | 3.0% | 0.0% |
The value half alone is nothing. Publish every region's label and
withhold every position, and 1.5% of 5×5 boards are still pinned down —
0.0% by 8×8. Arithmetic with the geometry erased has nothing left in it.
The interesting part is that the position half is not free either. You
are told exactly which cells the answer numbers, and an 8×8 is unique only
8.7% of the time. Say the reason out loud and it is obvious: "this cell is
numbered" never says "and no other cell is", so answers that number
extra cells survive.
Put the halves back together on the very same clue cells and it is 100%.
The information is in neither half; it is in their conjunction. Thin the
clues to q = 0.8 and the shape repeats — 8×8 goes 24.0% full, 0.0%
position-only, 0.0% value-only.
The setter does not own the clue budget — the answer does
A clue can only be printed on a cell that is numbered in the answer; there
is no digit to print on a blank. So the budget is not a dial the setter
turns, it is a property of the answer:
| board | regions | numbered cells | share of the board | 2×2 ceiling | share probe needs revealed |
|---|---|---|---|---|---|
| 6×6 | 11.7 | 21.3 | 59.2% | 75.0% | 34.3% |
| 8×8 | 20.7 | 38.0 | 59.3% | 75.0% | 32.1% |
| 10×10 | 32.2 | 58.3 | 58.3% | 75.0% | 32.4% |
Legal answers number 58–59% of the board (the no-2×2 rule caps that at
75%), and the ladder wants about a third of them printed. Minimised clue
counts, median:
| board | numbered cells | count | block | clash | reach | probe |
|---|---|---|---|---|---|---|
| 6×6 | 21 | 17 | 14 | 14 | 9 | 8 |
| 8×8 | 38 | 32 | 25 | 24 | 16 | 13 |
| 10×10 | 59 | 49 | 38 | 37 | 24 | 19 |
And the budget has to be spent well. 19 adversarially chosen clues make a
10×10 unique; 19 random ones did it on 0 of 30 boards — same story at 6×6
(7 clues) and 8×8 (12).
Ablation and the incremental ladder disagree, with the opposite sign
The unfiltered stream — random partition, one legal answer, a random
fraction q of its numbered cells printed, nothing conditioned on
uniqueness:
| board | q | count | +block | +clash | +reach | +probe | unique |
|---|---|---|---|---|---|---|---|
| 6×6 | 0.8 | 3.6% | 12.0% | 12.8% | 32.4% | 40.8% | 40.8% |
| 6×6 | 0.9 | 24.8% | 38.0% | 41.6% | 58.4% | 65.6% | 65.6% |
| 8×8 | 0.9 | 6.0% | 14.0% | 16.5% | 37.5% | 45.5% | 45.5% |
| 10×10 | 0.9 | 0.7% | 6.0% | 7.3% | 21.3% | 24.7% | 24.7% |
Read incrementally, clash is a passenger: +2.5 points at 8×8 (q = 0.9),
and one single clue in the table above. Now take each rule away from the
full probe ladder — the ablation runs at a slightly denser q per size, so
that every column has room to differ:
| board | full | −count | −block | −clash | −reach |
|---|---|---|---|---|---|
| 6×6 | 64.0% | 0.5% | 49.5% | 52.0% | 44.5% |
| 8×8 | 69.3% | 0.0% | 53.3% | 50.0% | 40.0% |
| 10×10 | 54.0% | 0.0% | 37.0% | 36.0% | 24.0% |
−clash costs 19.3 points at 8×8. A rule that cannot advance the board on its
own takes a fifth of it when removed, because the probe does not need a
rule that advances, it needs a rule that refutes — and clash is the
cheapest contradiction on this board. count is the only rule that reads a
clue at all, so removing it takes everything.
This series keeps relearning the same lesson from new angles: read only
the ablation and every rule looks redundant; read only the increments and
every rule looks essential. Nanro's version is the middle case — a
passenger by increment, a pressure point by ablation.
A partition into single cells is not hard, it is illegal
The one dial the setter really owns is region granularity (n = 8, q = 0.9):
| region sizes | partitions tried | with a legal answer | regions | numbered | count | +reach | +probe | unique |
|---|---|---|---|---|---|---|---|---|
| 1–1 | 120 | 0 | — | — | — | — | — | — |
| 1–2 | 120 | 0 | — | — | — | — | — | — |
| 2–2 | 120 | 120 | 29.4 | 64.9% | 6.7% | 45.8% | 80.0% | 80.0% |
| 2–3 | 120 | 120 | 24.0 | 61.3% | 9.2% | 36.7% | 54.2% | 54.2% |
| 2–4 | 120 | 120 | 20.8 | 58.9% | 7.5% | 25.8% | 38.3% | 38.3% |
| 3–5 | 120 | 120 | 14.6 | 54.6% | 4.2% | 31.7% | 40.0% | 40.0% |
| 4–7 | 120 | 120 | 10.4 | 52.1% | 6.7% | 20.8% | 27.5% | 27.5% |
The zeroes in the first two rows are a theorem more than a measurement. A
size-1 region can only be labelled 1, so its cell is always numbered; make
every region a single cell and every cell is numbered, so every 2×2 is
full. For n ≥ 2 there is no legal board at all. (Two adjacent singletons
also clash — both labelled 1.) Turn the granularity dial to its minimum and
the puzzle does not get harder, it disappears.
Turn it the other way and uniqueness falls 80.0% → 27.5%. Other puzzles in
this series had a granularity dial that swept from 100% to 0%; Nanro has a
wall at one end of it.
probe ⇔ unique broke once in 2,400 boards
The running conjecture in this series is the probe fixpoint finishes ⟺ the
board is unique (⇒ is a theorem from soundness; ⇐ is measured). Nanro held
it on 2,399 of 2,400 boards and broke it on one: an 8×8 at q = 0.7 that
is unique while the ladder stalls.
That board got a second opinion from an engine that shares no code with the
ladder. Nanro's raw engine can walk the definition directly: because a
region's label is its count, choosing a non-empty subset of a region also
chooses its label, so the entire space is the product over regions of
2^size − 1 subsets. Enumerate region by region, prune only on rules whose
operands are already written, and score every leaf with the rule text. Its
verdict on the gap board: exactly 1 solution, 5,029 nodes, no cap — the
propagating search agrees.
Across the whole suite the two engines agreed on 614/614 board–engine
pairs, with the 1 board and 34 runs that hit a node cap reported as skips
rather than quietly as agreements.
Generation, bank, tests
Generation does need a puzzle-level search — drawing one legal answer out
of a random partition — but a propagating randomized DFS with a 4,000-node
cap and Las Vegas restarts handles it. After that it is the usual
minimisation: reveal numbered cells until the target level finishes, then
take back every clue it can do without, and grade by the weakest level that
still completes. The partition and the answer never move between grades;
only the clue set does.
The bank is 75 boards — 6×6, 8×8 and 10×10, five per grade, every bucket
filled — each re-proved unique by the searching engine before it ships.
35 tests: a hand fixture (5×5, nine regions, six clues, unique, needs
reach), the four legal boards of a 2×2 grid counted by hand and matched
against both engines, one test per rule for its signature deduction, a
property test that no level ever eliminates the true answer, the
nesting of the ladder, the load-bearingness of every clue in a minimised
set, and the grade and uniqueness of every shipped board.
Takeaways
- When the digit is counted rather than chosen, the answer is just a set — and the solver's variables, the search, and the shape of a clue all follow from that.
- A clue is two facts. Value only: 0–1.5% unique. Position only: 3–36%. Both: 100%. The information lives in the conjunction.
- Clues can only sit on numbered cells, so the answer sets the budget, not the setter — 58–59% of the board, of which the ladder wants a third.
- A rule that earns +2.5 points incrementally can cost 19.3 when ablated: the probe wants refutations, not advances.
- Granularity 1 is illegal, not hard.
- probe ⇔ unique broke once in 2,400 boards, and the raw engine confirmed the anomaly in 5,029 nodes.
Puzzle #43 in the solver series.

Top comments (0)