HANTAI (反対 — “opposite”) is a puzzle built from the antonyms table. One rule: arrange the words so no two opposites touch. Clashing tiles spark until you slide them apart.
Every pair on its fifty boards is a strong, mutually listed opposite from the table; the boards are search-verified solvable, and there is no timer. Drag a tile onto another to swap them — or tap one, then the other.
The rest of this page is the build: where the pairs come from, how a board grows, why random tapping can’t win, and how many boards English holds.
Pairs are mutual strong opposites from the Linguabase antonyms table. Boards are search-verified solvable. No timer — ever.
This build draws on 2 of the 13 Linguabase tables:
First, the raw material. Tap a word: every opposite the table lists for it, grouped by the axis it opposes on.
Bold, rated 6–7 · plain, 5 · faded, 4 and under. Twenty-four words explored the same way: What’s the opposite of “mother”?
The table lists 1,596,686 axis rows. A pair enters HANTAI only if it survives three filters: both sides are single words inside the 20,000 most familiar; the listing is rated 6+ in at least one direction; and — the filter that matters most — the listing is mutual: each word names the other as a bare opposite, on any axis. Our first boards paired OLD with HOT, a stretch no player would accept, and the table explains it: one row, one direction — hot [freshness/recency] → old:6 — while OLD lists only the phrase “hot off the press:4” in return. One-way listing is the data’s own signature for a stretch.
| axis rows in the table | 1,596,686 |
| familiar, single-word, rated 6+ in some direction | 47,140 pairs |
| listed in both directions | 21,105 pairs |
The mutual filter cuts 55% of the candidates, and the casualties confirm the cut is surgical: people:one, know:think, maybe:yes, sun:night. If you build anything on this table, the mutual self-join is the first move.
A board is a dense patch of the pair network. Start from a seed word, add the neighbor that opposes the most words already on the board, repeat until the grid is full — then keep the board only if a backtracking search proves at least one clash-free arrangement exists. Every tile carries at least one opposite on the board, so there is no free parking, and most carry two or more, so fixing one clash risks striking a new one. Fifty boards ship this way: 3×3 through 4×5, from 5 pairs on the teaching board to 72 on the densest.
Growth is also why boards feel themed. ICY’s board pulls BOILING · BURNING · CHILLED · COLD · COOL · FREEZING… — the dense patches of the pair network are semantic neighborhoods.
Before shipping a puzzle, simulate the dumbest policy that could win it. Our first build fell instantly: tiles with no opposites on the board were free parking, and a policy of “swap a random clashing tile with a random calm one” solved every board in a median of 4–7 mindless moves — 99–100% of runs finished inside 20. If the dumbest policy wins, there is no puzzle.
# the dumbest winning policy - if this solves the board, there is no puzzle
while conflicts(order) and moves < 300:
bad = [i for i in tiles if in_conflict(i)]
calm = [i for i in tiles if not in_conflict(i)]
i, j = choice(bad), choice(calm or bad)
order[i], order[j] = order[j], order[i]
moves += 1
The rebuild removed the parking and favored words with two or more opposites in play. A board ships only when measurement says it resists: the random policy must run past its 300-move cap, and greedy best-swap must stall in a local minimum often, yet still win often enough with lucky tie-breaks that a thinking player has a fair path.
| free-parking build | shipped boards 3–50 | |
| random-swap policy, median moves | 4–7 | 300-move cap |
| …solved within 20 moves | 99–100% | under 4% |
| greedy best-swap, stalled in a local minimum | 0% | 28–64% |
| greedy best-swap, still wins | 100% | 36–72% |
The 21,105 mutual pairs could seat roughly 530 fully pair-disjoint hard boards at the ~40 pairs a 4×5 board carries — about 1,400 at 3×3. Empirically, a greedy packer built 68 boards that pass the difficulty gates with no two sharing more than two pairs, then ran dry: hard boards cluster in the same high-degree semantic neighborhoods — temperature, emotion, open/closed — so the practical supply is set by how many dense clusters the language has, not by how many pairs the table holds.
In daily-game terms the honest number today is ten weeks, not years: 68 boards of this quality exist right now, the envelope says roughly 530 could, and closing that gap is generator work — smarter packing, wider seeds — not data work. 68 is this generator’s floor, not the table’s ceiling.
The pairs are screened (Example 1), the boards are grown (2), the difficulty is proven (3), and the supply is counted (4). What each table contributed:
| Example 1 (the pairs) | Example 2 (the boards) | Example 3 (the gates) | Example 4 (the supply) | |
| antonyms | the 21,105 mutual pairs | every edge a board grows on | the clashes both policies fight | the pool being packed |
| vocabulary | the 20,000 cap, both sides | seed hubs ranked by familiarity | — | — |
Fifty boards and 68 packed are one spec against one release. Still open:
For opposites games: download the tables from any of the three repositories, state your own board shape — bigger grids, themed packs, a gentler ramp — and test it the way Example 3 tested this one: simulate the dumbest policy first. The walkthrough demos and each table’s README on the mirrors go deeper — and this page itself is a workable hand-off to whoever builds for you.
To help, two heavily documented draft artifacts for you or your coding agent to continue from: