
Daily Brains · one logic-grid case a day: who wore what, who came when, who brought which. Gentle on Monday, fiendish on Sunday.
Who Had What is the logic-grid deduction puzzle in Daily Brains (/daily), in the tradition of the classic zebra puzzle. Each day sets one case: a small cast of invented characters in a scene (a picnic, a heist crew, a garage band, a village bake-off, a haunted manor and two dozen more) and two or three things to pin on each of them, such as a colour, a time, a pet, a seat or a prize. A short list of clues narrows it down to exactly one answer. You work it out on the classic stepped grid, marking each pairing X (not a match) or O (a match) until every person has exactly one of everything.
Cases are generated offline by scripts/who-had-what/generate.mjs and shipped as a fixed book (public/gamedata/who-had-what/book.js). For each case the generator picks the day's scene, a cast with different initials, the categories and their values (ordered ones such as times, places and seat numbers take a consecutive run), and deals a random answer. It then adds true clues drawn from the clue types that weekday allows until exactly one answer is left, and finally strips every clue the answer can do without, so every clue on the page is needed. The answer is stored scrambled, so the page source does not give it away.
Every case is solved by a human-style solver that always reaches for the easiest technique that makes progress, and the case is kept only if the hardest technique it needed matches its weekday. Direct: plain is, is-not and either-or clues, the last gap in a row or column, an O clearing its row and column, and carrying an O across blocks. Clue reading: one relational clue (earlier or later, exactly n after, next to, one-and-the-other, all different) read against the grid. Chains: two things share no possible partner in some third category, so they cannot belong to the same person. Contradiction: try a mark, follow it through, and watch it break.
scripts/test-who-had-what.mjs re-solves every case with a brute-force solver written only from the clue rules, sharing no code with the generator. It proves each case has exactly one answer and that it is the stored one, that dropping any single clue lets a second answer in, that the technique rating still lands on its weekday band, that no day in the book repeats and neighbouring days never share a scene, that the weekly ramp rises from Monday to Sunday, that every value has a drawn icon, and that no clue text or file contains an emoji.
The stepped grid pairs every category with every other once: the people against each category along the top band, then the categories against each other in the steps below. Tap a square once for X, twice for O, a third time to clear. With auto-cross on (the default, switchable in Settings), an O crosses out the rest of its row and column in that block; removing the O lifts those crosses again. Two O's in one row or column are ringed in red, because that can never be right.
On a phone the full grid is a map. When its squares are too small to hit reliably, tapping it zooms into that block, with full labels and squares of at least 46px; swipe or use the arrows to move from block to block, and the Grid button returns to the whole map. On Monday and Tuesday the whole grid is big enough to mark directly.
Clues sit in a paged card under the grid (two columns on wider screens) with small drawn icons beside every thing they name, and never scroll. Tap a clue to cross it off. Tap the Clues title to pull the card up over the grid as a drawer and read more at once. Notes such as 'The ovens are numbered from left to right' head the list when a scene needs them.
A case starts at 1,000 points. Check marks every wrong X or O in red for 100 points. Hint fills in the next deduction your grid does not show yet, explains it and flashes the clue it came from, for 150 points (if you have a wrong mark, the hint points at that instead). Filling the people blocks with a complete but wrong answer costs 100 points each distinct time. The floor is 100. A clean solve (no checks, hints or wrong grids) earns the perfect bonus. Time is shown but not scored.



| Day | Difficulty | Size | Clue types | What it needs |
|---|---|---|---|---|
| Monday | Gentle | 3 people, 3 categories | is, is not, either-or | Direct marks only |
| Tuesday | Easy | 4 people, 3 categories | + earlier/later, next to, exactly n after | One relational clue read against the grid |
| Wednesday | Steady | 4 people, 4 categories | + one-and-the-other | Clue reading, more of it |
| Thursday | Tricky | 4 people, 4 categories | + all different | A chain or one contradiction |
| Friday | Tough | 5 people, 3 categories | all types | Chains and up to two contradictions |
| Saturday | Hard | 5 people, 4 categories | all types | One to three contradictions |
| Sunday | Fiendish | 5 people, 4 categories | all types | Four or more contradictions |
| Event | Points |
|---|---|
| Start of the case | 1000 |
| Check for mistakes | -100 each |
| Hint | -150 each |
| Complete but wrong answer | -100 each distinct answer |
| Lowest possible score | 100 |