Creek in the browser with five rule sets inside. The numbers are not
in the cells — they sit on the corners of the grid, and each one counts
the shaded cells among the (at most) four squares that touch it. Every
unshaded cell must join one connected creek. Puzzle #48 in the solver
series.
Demo: https://sen.ltd/portfolio/creek/
Repo: https://github.com/sen-ltd/creek
This puzzle has a closed form
A corner of the paper touches exactly one cell, so it names that cell
outright. An edge corner touches two, an interior corner four. Writing
C(i,j) for the number on corner (i,j):
C(i,j) = x[i−1][j−1] + x[i−1][j] + x[i][j−1] + x[i][j] (out-of-range terms dropped)
That is the mixed second difference of the board, and inclusion–exclusion
inverts it:
x[r][c] = Σ_{i≤r, j≤c} (−1)^((r−i)+(c−j)) · C(i,j)
The answer is the chequerboard-signed running total of the clues.
solveByScan in the repo is that formula in six lines.
Measured on 600 random fully clued answers at each of 6×6, 8×8 and 10×10: the
closed form reproduces the answer 100% of the time, the board is unique
100% of the time, and count — the weakest rung in the ladder, which
does nothing but tally one corner — finishes 100% of them. Repeatedly
counting a corner that has one unknown cell left is that triangular scan.
So there is no puzzle in a fully clued board. Everything difficult about
Creek lives in the numbers the setter rubbed out.
| numbers kept (8×8, of 81) | unique | finished by count
|
finished by the whole ladder |
|---|---|---|---|
| 81 (100%) | 100.0% | 100.0% | 100.0% |
| 73 (90%) | 99.2% | 98.5% | 99.2% |
| 65 (80%) | 89.0% | 82.7% | 89.0% |
| 57 (70%) | 56.5% | 42.3% | 56.5% |
| 49 (60%) | 19.5% | 10.0% | 19.5% |
| 41 (50%) | 2.3% | 0.5% | 2.3% |
The ink on the edge of the paper is the ink you can throw away
The corner clue is the most powerful number on the board — it names a cell
with no reasoning at all — and it is the one to erase. Take an answer and
delete either (a) the whole border ring of corners, or (b) the same number of
corners drawn from the interior:
| board | erase the ring | erase the same count from the interior |
|---|---|---|
| 6×6 (24 numbers) | unique 92.5%, dof left 11.00 | unique 0.0%, dof left 15.00 |
| 8×8 (32 numbers) | unique 97.2%, dof left 15.00 | unique 0.0%, dof left 19.00 |
| 10×10 (40 numbers) | unique 99.7%, dof left 19.00 | unique 1.0%, dof left 23.03 |
The same number of equations goes away, and the rank barely moves — four
extra degrees of freedom out of a hundred variables. Uniqueness goes from
~100% to ~0%.
The collapse is not about how big the kernel is. It is about what shape it
is.
The kernel is enormous and almost entirely illegal
Erase the border ring and only genuine 2×2 windows remain. If two boards
agree on every 2×2 sum, their difference d has a chequerboard twist
e[i][j] = (−1)^(i+j) d[i][j] with vanishing mixed second difference, hence
e[i][j] = u_i + v_j
and the kernel has dimension exactly w+h−1 (checked against the row
reduction at eight different shapes).
Now restrict d to {−1,0,+1}, since both boards are 0/1 matrices. The
catalogue collapses to three shapes:
- row — one whole row flipped in chequerboard alternation,
- col — one whole column, likewise,
- cross — row r and column c with opposite signs, crossing cell untouched.
There is no small ambiguity in a border-erased Creek board. The cheapest
second solution costs an entire row. Which is why:
| board | kernel dimension | ±1 sign patterns | still unique | has a legal flip |
|---|---|---|---|---|
| 6×6 | 11 | 2,048 | 93.2% | 6.5% (row 23, col 15, cross 1) |
| 8×8 | 15 | 32,768 | 98.2% | 1.8% (row 5, col 6, cross 0) |
| 10×10 | 19 | 524,288 | 100.0% | 0.0% |
findFlipCertificate walks that catalogue with no search at all. It explains
98.1% of ambiguous border-erased boards at 6×6 (107 of them) and 100%
at 8×8 (30), with zero false positives on unique boards. On randomly
erased boards, where interior windows are missing and the theorem no longer
applies, it explains 0.3% and 0.1%. The certificate works exactly
where its proof does, and the measurement says so.
The rule ladder
| rung | what it reads |
|---|---|
count |
one corner: a cardinality constraint on ≤4 cells, already GAC at that scope |
linear |
the whole clue system, row-reduced once at build time, then bound-propagated |
pair |
two corners one step apart share a domino — enumerate their ≤6 cells exactly |
connect |
the creek is one piece: dead components go black, cut vertices stay white |
probe |
assume a colour, run the sub-ladder, drop it on explosion |
Ablation: only the non-linear rung changes anything
Drop one rung, run to a fixpoint, compare bit for bit against the full ladder
on 120 random boards per size:
| dropped | fixpoint moved | boards completed | probe assumptions |
|---|---|---|---|
−count
|
0/120, 0/120, 1/120 | 61→61, 29→29, 7→7 | +0.8%, +6.2%, +3.9% |
−linear
|
0/120, 0/120, 0/120 | 61→61, 29→29, 7→7 | +0.0%, +0.4%, +2.6% |
−pair
|
0/120, 0/120, 0/120 | 61→61, 29→29, 7→7 | +7.2%, +5.8%, +9.2% |
−connect
|
37/120, 52/120, 64/120 | 61→42, 29→16, 7→5 | +16.8%, +8.4%, −6.4% |
(6×6, 8×8, 10×10.) The three linear rungs are mutually redundant:
remove any one and the surviving two rebuild its fixpoint to the bit. They
are not free, though — dropping pair costs the prober 6–9% more
assumptions, dropping count 1–6%. Only connect, the one rule in the
ladder that is not linear algebra, moves the answer.
The incremental reading points the other way, as it always does: count
34.2% → linear 35.0% → pair 35.0% → connect 45.0% → probe 50.8% at
6×6. Read increments alone and every rung looks essential; read the ablation
alone and three of them look like decoration. Both tables ship.
Two incomparable rungs with the same finish line
linear reasons about the whole board over the rationals. pair looks at six
cells but is allowed to know they are integers. Neither contains the
other. On 9,000 random boards:
- bits
linearfinds thatpairdoes not: 756 - bits
pairfinds thatlineardoes not: 1,947 - boards where their fixpoints differ at all: 742
- boards one finishes and the other does not: 0 — in either direction
And yet the shipped bank does contain pair-graded boards, because thinning
a board to a locally minimal clue set drives it onto precisely the frontier
where the two rungs separate; that happens 1.7% of the time. The null result
was a statement about where you sample, not about the rules.
The dials on the answer's side
Shading density. A thin creek in a big bank is easy, a wide one is hard
(8×8, keeping 60% of the numbers at random):
| shaded | unique | adversarially minimal numbers |
|---|---|---|
| 20% | 8.7% | 32 of 81 |
| 40% | 13.3% | 29 of 81 |
| 60% | 24.7% | 22 of 81 |
| 70% | 42.7% | 18 of 81 |
Creek shape. Hold the area fixed and change only the shoreline, by
growing towards cells with fewer white neighbours:
| growth | shoreline (edges) | 0s printed | 4s printed | unique |
|---|---|---|---|---|
| blob (t=1) | 26.5 | 35.6% | 10.3% | 25.3% |
| t=2 | 40.4 | 25.1% | 6.6% | 16.7% |
| t=4 | 51.2 | 18.2% | 4.0% | 15.3% |
| tendrils (t=8) | 55.9 | 15.3% | 3.1% | 14.7% |
Same size, same white area, same number of printed numbers — and the
uniqueness rate halves. The mechanism is in the histogram: a 0 or a 4
decides four cells on its own, and a winding creek prints far fewer of
them. Doubling the shoreline trades the extremes for 1s.
Adversarial ink against random ink. A locally minimal clue set needs
16 / 29 / 43 numbers at 6×6 / 8×8 / 10×10 — about 35% of the lattice,
remarkably flat across sizes. Random disclosure needs 2.0× as many.
The generator cannot dead-end
A Creek answer is any shading whose unshaded cells are connected, so the
generator builds the creek instead of searching for one: seed a cell, then
absorb frontier cells one at a time. The frontier is non-empty until the white
set is the whole board, so growth never rejects, never restarts and never
fails.
The census, checked against formulas rather than against itself
-
1×m boards — the white cells are one interval, so
m(m+1)/2 + 1: 2, 4, 7, 11, 16, 22, 29, 37 — matched exactly by exhaustive enumeration. - 2×m boards — the two cells of a column are adjacent, so legal boards are exactly those whose white columns form a run with consecutive columns overlapping. The transfer matrix gives 4, 14, 41, 109, 276, 682, 1665, 4041, 9780, 23638 — matched exactly — and continues 57097, 137877, 332900, …
- n×n boards — 2, 14, 219, 11507.
- Injectivity of the full clue map — exhaustively at 3×3, 4×3, 4×4: 512 → 512, 4,096 → 4,096, 65,536 → 65,536 distinct clue fields. No two boards ever print the same numbers.
-
Kernel dimension — predicted
w+h−1, confirmed by row reduction at eight shapes.
Engine agreement: 300 small boards × five rule levels, 100% agreement with
a raw engine that shares no rule, no candidate array and no row reduction
with the ladder.
One more identity, about the ladder rather than the board: on 9,000 boards
across three sizes and five erasure rates, probe finishes a board if and
only if the board is unique — 0 exceptions in either direction.
In short
- The numbers live on the corners, and the clue field is the board's mixed
second difference — so a fully clued board has a closed form and no
puzzle in it;
countalone finishes 100% of them - Erasing the 24-corner border ring of a 6×6 leaves 92.5% of boards unique; erasing 24 interior corners leaves 0.0% — same equation count, four degrees of freedom apart. Shape of the kernel, not size
- That kernel is exactly
(−1)^(i+j)(u_i + v_j), dimension w+h−1, and at ±1 it is three shapes: row, column, cross. The cheapest ambiguity costs a whole row, which is why a 19-dimensional kernel leaves 0% of 10×10 boards ambiguous - The certificate explains 98–100% of border-erased ambiguity with no search and 0.1–0.3% of randomly-erased ambiguity — it works exactly where its proof does
- Ablation: the three linear rungs are bit-identical replacements for each
other; only
connectmoves any fixpoint. Increments say the opposite, and both ship -
linearandpairare incomparable (756 vs 1,947 bits) yet separated 0/9,000 boards at the finish line — until thinning drives boards onto the frontier, where they separate 1.7% of the time - Doubling the shoreline at constant area halves the uniqueness rate, because 0s and 4s are the only numbers that decide four cells at once
30 tests. TypeScript, zero runtime dependencies.
Demo: https://sen.ltd/portfolio/creek/
Repo: https://github.com/sen-ltd/creek

Top comments (0)