Minpentaia game from the novel Snowmoon, on Ethereum

Math · the rules, written down

The mathematics of Minpentai

One reversible rule, four pieces built from it, and a ledger that splits every payment. Each claim on this page is either proved or measured, and every figure runs the game’s own engine.

ruleCrittersboard256 × 256bell128 generationsseason14 days

t = 0
Fig. 0Time runs both ways. TAU FA, the last call of the book’s countdown, drawn in live cells. Run forward, the rule of §2 scatters it into gliders and debris. Then the inverse map runs it back, and every cell returns. Nothing is recorded on the way: each earlier frame is computed from the later one.

“Anything that can be created can be destroyed. You just have to take the path that creates it and do the same thing in reverse.”

Zei · Snowmoon, ch. 4

§ 0What comes from the book

In Snowmoon, Minpentai is a strategy game played on a grid under a time-reversible rule, with gliders, walls, symbols and intervention turns. This game keeps the physics and adds a ledger. The table says which is which.

In SnowmoonIn this game
“rotate one eighty if three,” a time-reversible ruleZei, ch. 4
Critters, exactly (Toffoli and Margolus, 1987)§2
Symbols: a player’s pattern of dots; a copy anywhere lets its owner see within thirty squaresch. 4
Sigils: a 2 × 2 block at the center of a site plot, your stake in the season§4
Intervention turns, when players may put down more squares near their symbolsch. 4
Bells every 4 hours; between bells the board runs 128 generations§4
The priests go into a sealed dungeon to decide each tournament’s rule setsch. 4, ch. 10
A rule card per 14-day season; season 1 is Critters§7
Minpentai as training for a drone war with the Arctic Empirech. 10, 17, 21
Arctic rams enter from the board edge when TAUFA is sold§6
No money. The book’s Minpentai has no buy-in.
Ours only: sigils cost ETH; tribute, war chest, TAUFA§5

§ 1The board and its neighborhood

The board is a grid of cells, each alive (1) or empty (0). Time moves in generations \(t = 0, 1, 2, \dots\). Unlike Conway’s Life, a generation does not look at each cell’s eight neighbors. It cuts the board into 2 × 2 blocks and updates every block on its own.

The trick is that the cut moves. On even generations the blocks start at the corner \((0,0)\); on odd generations they start at \((1,1)\), one cell down and one cell right. Something on the edge of a block at one tick sits in the middle of a block at the next, so patterns can travel.

\[ \begin{gathered} B^{(t)}_{ij} = I^{(t)}_i \times I^{(t)}_j \\[2pt] I^{(t)}_i = \{\,2i+p_t,\ 2i+p_t+1\,\} \\[2pt] p_t = t \bmod 2 \end{gathered} \tag{1} \]

In wordsAt tick \(t\), block \((i,j)\) covers two rows and two columns starting at \(2i+p\) and \(2j+p\), where \(p\) is 0 on even ticks and 1 on odd ticks.

flip (k = 0, 1, 4) stay (k = 2) flip, then turn 180° (k = 3)
Fig. 1The Margolus neighborhood, live. Bold lines are the current cut: violet on even ticks, teal on odd ticks. In the raw panel, every block that holds part of a pattern is tinted by what the rule will do to it (Fig. 2); blocks of plain background (\(k = 0\) or \(4\)) simply flip and are left untinted. The glider climbs 2 cells every 4 ticks; the block beside it never moves.

§ 2The rule

Read a block row by row as \(x = (a\,b\,/\,c\,d)\). Write \(|x| = a+b+c+d\) for its live count, \(\bar x\) for its complement (every cell flipped) and \(\rho\) for the half turn:

\[ x = \begin{pmatrix} a & b \\ c & d \end{pmatrix}, \qquad \rho(x) = \begin{pmatrix} d & c \\ b & a \end{pmatrix} \]

The whole physics of Minpentai is one function on the sixteen possible blocks:

\[ f(x) = \begin{cases} x & \text{if } |x| = 2 \\[2pt] \rho(\bar x) & \text{if } |x| = 3 \\[2pt] \bar x & \text{if } |x| \in \{0, 1, 4\} \end{cases} \tag{2} \]

In wordsA block with two live cells is left alone. A block with three is flipped and then given a half turn. Every other block is flipped. The middle line is the one Zei names in chapter 4: “rotate one eighty if three.”

This is the Critters rule of Toffoli and Margolus (1987), and it is the only rule in season 1. Fig. 2 is generated by feeding all sixteen blocks through the game’s step function.

Fig. 2The complete transition table: all 16 blocks, grouped by live count \(k\), each followed by its image \(f(x)\). Only \(k = 3\) takes two moves.

§ 3Three theorems

Three facts follow from (2), and the game is built on them. Each comes with a short proof and something you can run.

Theorem 1 · Reversibility
\(f\) is a bijection of the sixteen blocks, with inverse \[ f^{-1}(y) = \begin{cases} y & \text{if } |y| = 2 \\[2pt] \rho(\bar y) & \text{if } |y| = 1 \\[2pt] \bar y & \text{if } |y| \in \{0, 3, 4\} \end{cases} \tag{3} \] Hence one tick of the board is a bijection, and its inverse applies \(f^{-1}\) on the same cut. The present determines the past.

Proof.\(f\) sends the blocks with \(|x| = 2\) to themselves, swaps the classes \(|x| = 0\) and \(|x| = 4\), and sends \(|x| = 1\) to \(|x| = 3\) and back. Flipping and turning are one-to-one, and the paired classes have equal sizes (1 and 1, 4 and 4), so \(f\) is a one-to-one map of a finite set into itself, hence onto. Substituting (2) into (3) gives \(f^{-1}(f(x)) = x\) in every case. A tick applies \(f\) to disjoint blocks that tile the board, so it is a product of bijections.∎

In wordsRun backward, the rule reads “rotate one eighty if one.” Zei puts it plainly in chapter 2: “So if you can do something in one direction, you can always run the same steps in reverse.”

Fig. 3\(f\) as a permutation of the sixteen blocks. Every block has exactly one arrow out and one arrow in, which is what “bijection” means. Reverse every arrow and you have \(f^{-1}\).
generation
t = 0
live cells, display
0
live cells, raw
0
fingerprint
vs. the start
DRAG TIME0–240
Fig. 4Scrub time in either direction. A 48 × 48 board, wrapped into a torus so nothing falls off, starts from a random patch. Dragging left runs \(f^{-1}\); no past state is stored. Back at \(t = 0\), the fingerprint matches the start. The display count never moves (Theorem 2); the raw count jumps every tick.
Theorem 2 · Conservation
Let the display be the raw state with odd ticks inverted. Then the number of live cells in the display never changes: \[ d_t = \begin{cases} x_t & t \text{ even} \\ \bar x_t & t \text{ odd} \end{cases} \;\;\Longrightarrow\;\; |d_{t+1}| = |d_t| \tag{4} \]

Proof.Look at one block of the cut, with raw contents \(x\). On an even tick its display goes from \(x\) to \(\overline{f(x)}\); on an odd tick it goes from \(\bar x\) to \(f(x)\). Checking the classes of (2) one by one shows that the new display block has exactly as many live cells as the old one; in fact it only moves cells, as the table below shows. Summing over the blocks of the cut gives (4).∎

display, live cellsk = 0k = 1k = 2k = 3k = 4
even tickstaystayswapturn 180°stay
odd tickstayturn 180°swapstaystay

Swap: the two live cells jump to the two empty places.

In wordsOn the board you see, cells only ever move around; nothing is created or destroyed. The raw state is not conserved (on odd ticks the empty background is all ones), which is why the game draws the display, and why every move a player makes is applied on an even tick, where raw and display agree.

Theorem 3 · Still life
A 2 × 2 block of live cells whose top-left corner has two odd coordinates, with nothing else in the 4 × 4 square around it, looks the same at every tick.

Proof.On an even tick the cut starts at even coordinates, so the block’s four cells fall into four different blocks of the cut, one each: \(k = 1\), which the display table leaves alone. On an odd tick the cut starts at odd coordinates, so the block is exactly one block of the cut: \(k = 4\), also left alone.∎

In wordsAlignment is everything. Put the same block at even coordinates and the roles swap: on odd ticks each cell is alone in its block and turns 180°, so the block bursts into four corners and comes back two ticks later, a period-4 oscillator. That is why every piece in the game is anchored at odd coordinates, and why a sigil sits at \((8i+3,\ 8j+3)\).

Fig. 5The same four cells at two alignments, ticks 0 to 4, with each tick’s cut drawn in. Top: corner at odd coordinates, a still life. Bottom: corner at even coordinates, a period-4 oscillator.

§ 4The pieces

Everything a player can place is one of four patterns, stamped on an even generation with its top-left corner at odd coordinates. The contract accepts (piece, odd \(y\), odd \(x\)) and nothing else. One cell off, a glider stops flying: it stays where it is and oscillates.

Fig. 6Plate of pieces, drawn cell for cell from the game’s pattern table. The pink tick marks each anchor, the top-left corner the contract checks.

What the pieces do

Measured on the real rule in our physics tests; Fig. 7 replays one case of each.

  1. A single glider cannot break a lone sigil: 0 of 32 distinct hits break it. It bounces straight back.
  2. A ram cracks it: 4 of 4 touching aims, in all four directions.
  3. Posts make mirrors. A row of nine posts 8 cells apart reflected 42 of 42 glider aims with no leaks. Against rams it lost 0.48 posts per ram, and the sigil behind it was never killed (0 of 21 aims, against 4 of 21 with no wall). This is the wall Zei describes in chapter 2, “a wall structure that reflected their gliders right back at them.”
t = 0
Fig. 7Three collisions on the game’s engine, including its 2-cell absorbing frame (hatched), which deletes whatever reaches the edge. (a) A glider hits a sigil and bounces; the sigil is broken for 28 generations, then whole again. (b) A ram cracks the sigil for good. (c) A glider aimed at the gap between two posts is still turned back.

The census

Fig. 7a shows the problem: a harmless bounce leaves the sigil broken for a while. So the game never judges a sigil at a single instant. At generations 96, 104, 112, 120 and 128 of every bell it checks whether the sigil’s 2 × 2 is complete, and

\[ \text{alive}_n \iff \bigvee_{t\, \in\, \{96,\,104,\,112,\,120,\,128\}} I_n(t) \tag{5} \]

In words\(I_n(t)\) is 1 if the sigil is intact at generation \(t\) of bell \(n\). One intact sample out of five is enough. A sigil that fails all five is cracked: it stops earning until its owner repairs it, and if it fails again at the next bell it falls and becomes a ruin.

Lemma · Bounces never crack a sigil
A disturbance lasting at most 32 consecutive generations cannot fail the census.

Proof.The samples run from generation 96 to 128, a span of 33 generations, so a shorter window misses the first sample or the last. A bounce breaks the sigil for at most 28 generations, measured over every hit.∎

Our tests show why it matters. With a single census at generation 128, one well-timed glider could fake a kill in 496 of 3,920 placements. With five samples, in none.

WINDOW STARTS AT GENERATION90
Fig. 8The census as a covering problem. Slide the window. A bounce can cover at most four of the five samples; a crack covers all five.

§ 5The money

Nothing in this section comes from the book: Minpentai in Snowmoon has no buy-in. Every payment below is ours.

The price of a sigil

Let \(p_0 = 0.003\) ETH be the floor, \(t_s\) the time of the last sale and \(p_s\) the price that sale left behind. Then

\[ \begin{gathered} p(t) = p_0 + (p_s - p_0)\, 2^{-(t - t_s)/6\,\mathrm{h}} \\[2pt] p_s \leftarrow 1.003\; p(t_s) \end{gathered} \tag{6} \]

In wordsEvery sale makes the next sigil 0.3% more expensive, and whatever sits above the floor halves every six hours.

Proposition · Steady price
If sales arrive steadily, \(r\) per hour, the price paid at each sale settles at \[ \begin{gathered} p^* = p_0 \left( 1 + \frac{0.003\, a}{1 - 1.003\, a} \right) \\[2pt] a = 2^{-1/(6r)} \end{gathered} \tag{7} \] provided \(1.003\,a < 1\), that is, \(r < r_c = 1/(6 \log_2 1.003) \approx 38.6\) sales per hour. Faster than that, the price keeps climbing until buyers slow down.

Proof.Let \(q_n\) be the premium \(p - p_0\) just before sale \(n\). The sale lifts it to \(1.003\,(p_0 + q_n) - p_0\), and the next \(1/r\) hours multiply it by \(a\), so \(q_{n+1} = a\,(1.003\, q_n + 0.003\, p_0)\). This map is a contraction exactly when \(1.003\,a < 1\), and its fixed point gives (7).∎

In wordsAt 10 sales an hour the price hovers near 0.0040 ETH; at 30 an hour, near 0.0135 ETH. The six-hour half-life is strong: the price only runs away if sigils sell faster than one every 93 seconds.

SALES PER HOUR, FIRST 36 HOURSr = 10

Fig. 9The price of the next sigil over two days, with \(r\) sales per hour for 36 hours and none after. Each sale is a 0.3% jump; between sales the premium decays with a six-hour half-life. The dashed line is \(p^*\) from (7).

From day 8 there is one more floor, where \(C\) is the war chest and \(n\) the number of standing sigils:

\[ p(t) \;\ge\; 0.8 \cdot \frac{0.9\, C}{n} \tag{8} \]

In wordsA late sigil costs at least 80% of what one sigil’s share of the war chest is worth, so nobody can buy into the chest cheaply in the last days.

Where each payment goes

A sigil bought at price \(p\) is split four ways: tribute, war chest, buy-and-burn of TAUFA, and operations.

\[ p \;=\; 0.45\,p \;+\; 0.42\,p \;+\; 0.08\,p \;+\; 0.05\,p \tag{9} \]
Fig. 10One payment, followed to the end of the season. Band widths are to scale. Of every 100 units, 82.8 come back to this season’s players and 17.2 leave.

Tribute without a loop

Paying hundreds of sigils one by one would cost too much gas. Instead the contract keeps one running number \(A\), the tribute earned so far by a sigil that has always stood, and a debt \(D_i\) for each player. When player \(b\) buys at price \(p\) while \(n\) sigils stand, \(n_b\) of them \(b\)’s own:

\[ \begin{gathered} \Delta A = \frac{0.45\, p}{n - n_b} \\[2pt] A \leftarrow A + \Delta A, \qquad D_b \leftarrow D_b + n_b\, \Delta A \end{gathered} \tag{10} \]

A player with \(a_i\) standing sigils can claim at any time

\[ \mathrm{pending}_i = a_i\, A - D_i \tag{11} \]

In wordsThe 45% is shared equally by every standing sigil except the buyer’s own. Whenever \(a_i\) changes by \(\delta\) (a plant, a crack, a repair), \(D_i \leftarrow D_i + \delta A\), so each sigil earns only from sales after it was planted and while it stands.

Creator fees go the same way. Stockereum pays a creator fee of 2% of TAUFA trading volume, and all of it goes to tribute, with nobody excluded:

\[ \Delta A = \frac{F}{n} \qquad \text{for a fee payment } F \tag{12} \]

Season settlement

At the end of the 14 days, 90% of the war chest \(C\) is paid out by claim weight, and 10% carries over to the next season:

\[ \begin{gathered} \mathrm{payout}_i = 0.9\, C\, \frac{w_i}{\sum_j w_j} \\[4pt] w_{\text{standing}} = 1 + \tfrac12\, m, \qquad w_{\text{ruin}} = \tfrac12 \end{gathered} \tag{13} \]

In wordsA standing sigil holds one unit of claim, plus half a unit for each of the \(m\) ruins it has captured; a ruin keeps half a unit. When a sigil falls, half of its unit stays with the ruin and half moves to the nearest older standing sigil, so a fall moves claim weight around rather than destroying it.

The identity

Add up what comes back to the season’s players. With \(S\) the season’s spending on sigils, \(F\) the creator fees and \(K\) what players spend on cells:

\[ \begin{aligned} R &= (0.45 + 0.9 \times 0.42)\, S + F - K \\ &= 0.828\, S + F - K \end{aligned} \tag{14} \]

In wordsAs a group, players get back 82.8% of what they pay for sigils, plus all trading fees, minus what they burn on cells. Without trading fees the group loses at least 17.2%, and any one player’s gain is other players’ loss. Tribute flows from later sigils to earlier ones: if new sigils stop, tribute stops.

Who loses

The identity fixes the total, not the split. For the split we coupled the real 256 × 256 board to this economy and simulated whole seasons, with the tuned parameters on this page. Slide through the creator-fee levels we simulated.

CREATOR FEES PER DAY0.05 ETH

Fig. 11Share of players who ended the season with less ETH than they put in. Bars span three crowd sizes (100, 300 and 1,000 players); dots mark each. Simulation results, not a forecast: each dot pools 32 seasons (4 arrival curves × 8 seeds); 40% of players tend their sigils and 8% attack; demand does not react to returns. Only these three fee levels were simulated, so nothing is drawn between them.

§ 6Weather and the attack budget

In the book, Minpentai is training for a war. Mu tells Zei in chapter 10: “It’s military training.” Here the enemy is the market. Let \(s\) be the net amount of TAUFA sold over the last 24 hours, measured from the pool’s time-weighted reserves with the game’s own buys added back. Each bell, \(k\) Arctic rams enter from the board edge:

\[ k = \min\!\left(4,\ \left\lfloor \log_2\!\left(1 + \frac{s}{0.1\ \mathrm{ETH}}\right) \right\rfloor \right) \tag{15} \]

In words\(k\) rams need \(s \ge 0.1\,(2^k - 1)\) ETH: 0.1, 0.3, 0.7 and 1.5 ETH for one to four. No selling, no rams; each extra ram needs about twice as much selling as the one before.

NET TAUFA SOLD, LAST 24 HOURSs = 0.42 ETH

Fig. 12Rams per bell against 24-hour net selling: a staircase with steps at \(0.1\,(2^k - 1)\) ETH, capped at four.

Players’ own attacks share one budget: 8 weapon cells per bell for the whole board, which is one ram, with a target of 4. The price of a cell moves like Ethereum’s base fee under EIP-1559, where \(u_n \le 8\) is the number of weapon cells used at bell \(n\):

\[ c_{n+1} = \max\!\left( c_0,\ c_n \left( 1 + \frac{1}{8} \cdot \frac{u_n - 4}{4} \right) \right) \tag{16} \]

In wordsA bell that uses the whole budget makes the next one 12.5% more expensive, a bell that uses none of it makes the next one 12.5% cheaper, and the price never drops below the launch price. Repairs sit outside this budget and always cost the launch price.

With these numbers, our simulations lost about 28% of untended sigils per season and 13% of tended ones, and 92% of the sigils standing when the siege began were still standing at the end. The edge takes most of the weather: untended loss was 63% on the outer ring of sites, against 15% in the interior.

§ 7Assumptions and limits

  1. The edge is not reversible. The real board has a 2-cell frame that deletes whatever enters it, so debris can leave. Theorem 1 holds in the interior; once something has touched the frame, running backward no longer brings it back.
  2. Proofs and measurements are different things. Theorems 1–3 and the lemma are proved. The piece facts in §4 are measurements on isolated setups: one sigil, one wall, one projectile. On a crowded board, two gliders arriving together can break what one cannot.
  3. The census can still be wrong. Five samples remove bounce misreads, but in simulation 4–6% of declared deaths were still false.
  4. The money results are simulations. Player behavior is assumed, not measured: 40% tend their sigils, 8% attack, attackers aim well, nobody builds posts, and demand does not react to returns. The low loss shares at high fees are optimistic for that reason.
  5. Capacity is small. The board has 512 sites. In the simulations a season held about 190–230 players; with 1,000 arrivals, 78% could not get a sigil.
  6. Everything here is for one rule card. A new season rule changes the physics, and §2–§4 would have to be redone.
  7. No promise of profit. Later sigils pay earlier ones. You can lose what you pay.

Sources

  1. Norman Margolus, “Physics-like models of computation,” Physica D 10 (1984). The shifting 2 × 2 cut of §1.
  2. Tommaso Toffoli and Norman Margolus, Cellular Automata Machines (MIT Press, 1987). The Critters rule of §2.
  3. Snowmoon (2026, GPL v3), chapters 2, 4, 10, 17 and 21: every quotation on this page, and the game itself.
  4. EIP-1559, “Fee market change for ETH 1.0 chain” (2019). The pricing rule behind (16).
  5. This game’s physics tests and integrated season simulations, run on independent engines that agree bit for bit. The figures on this page are computed in your browser by the step function of the playable demo; view the source to check.