Ranked Neighborhood Info
Skill-spread 0.56 · Clues show comparative rank, not absolute mine counts.
Left-click reveals · right-click flags (long-press on mobile). Or hand it to an agent above and watch it play — PAFG is the paper's fixed symbolic solver, PAFG-LLM is the mechanic-adapted one.
The mechanic
A code-level mutation of the clue encoding. Instead of printing the number of adjacent mines, each revealed cell shows the ordinal rank of its mine count relative to its already-revealed neighbors — 1 means this cell borders the fewest mines among the cells around it. This shifts play from absolute deduction to comparative reasoning: you can tell which direction is relatively safer, but never the exact count. Random play cannot exploit the relational ordering, which is what makes the mechanic separate skilled from unskilled solvers.
How to read the board
- A cell showing 1 borders the fewest mines among its revealed neighbors — relatively safe.
- Higher numbers mean relatively more mines nearby than the surrounding revealed cells.
- A freshly revealed cell with no revealed neighbors falls back to its true mine count.
- Everything else (8-cell Moore adjacency, cascade, single life) is canonical Minesweeper.
The rule in code
The generated mechanic this game runs. The browser engine is an algorithm-faithful port of it.
class RankedNeighborInfo(InfoStrategy):
"""Each revealed cell shows the RANK of its adjacent-mine count relative to
its revealed neighbors: 1 = fewest mines nearby. Falls back to the raw count
when the cell has no revealed neighbors yet."""
def encode(self, board, r, c):
my_count = board.grid[r][c].adjacent_mines
revealed_neighbors = [
board.grid[nr][nc].adjacent_mines
for nr, nc in board.neighbors(r, c)
if board.grid[nr][nc].is_revealed and not board.grid[nr][nc].is_mine
]
if not revealed_neighbors:
return str(my_count) if my_count > 0 else ""
ordered = sorted(set(revealed_neighbors + [my_count]))
rank = ordered.index(my_count) + 1 # 1-based
return str(rank)