Aquarium
Fill the tanks. Water obeys gravity: each aquarium holds one flat waterline, wetting every arm bottom-up. Row and column numbers count their water cells. Click a cell to cycle water → air → clear.
Gravity makes each aquarium's state space a chain: a tank spanning d distinct rows has exactly d+1 possible fillings, totally ordered by inclusion — so the solver never tracks cells, it tracks one waterline bitmask per aquarium. A cell is known water when every surviving waterline covers it, known air when none does. The star deduction: an aquarium's contribution to a clued line is a pure function of its waterline — for a row it is all-or-nothing (one flat surface can't wet half a row), for a column it counts the cells at or below the surface. So every clue is a subset-sum over the aquariums crossing its line, and it is filtered exactly with a prefix/suffix reachable-sum DP: a waterline survives only if its contribution can be completed to the clue by the other tanks — Régin-style support filtering with a knapsack in place of the matching. Run to a fixpoint, this is as strong as enumerating each whole line. When it stalls, a search branches on the aquarium with the fewest waterlines left and proves every bundled board has a single solution. Boards are authored as filled tanks, clues greedily deleted while uniqueness survives — every surviving clue is load-bearing.