{
"id": "251",
"prompt": "The forest-fire automaton: a 16x12 grid packed as row bitmasks in state slots (trees in one bank, fire in another). Every 5 frames: fire spreads deterministically to every orthogonally adjacent tree (build the neighbor mask with shifts and row ORs, then AND with the tree mask), burning cells turn to ash, THREE random empty cells sprout new trees, and roughly 1 step in 32 lightning strikes a random cell - igniting it only if a tree stands there. Flicker the flames between two oranges and keep a live TREES count. Seed the initial forest from an LCG at init.",
"solution_rl": "fn frame(t: i32) {\n if host::display::state_get(0) == 0 {\n host::display::state_set(0, 1);\n let mut seed: i32 = 313;\n let mut r: i32 = 0;\n while r < 12 {\n seed = seed * 1103515245 + 12345;\n host::display::state_set(8 + r, (seed >> 8) & 65535);\n host::display::state_set(20 + r, 0);\n r = r + 1;\n }\n host::display::state_set(2, seed);\n }\n let mut tree = [0; 12];\n let mut fire = [0; 12];\n let mut r: i32 = 0;\n while r < 12 {\n tree[r] = host::display::state_get(8 + r);\n fire[r] = host::display::state_get(20 + r);\n r = r + 1;\n }\n if t % 5 == 0 {\n let mut seed: i32 = host::display::state_get(2);\n let mut nf = [0; 12];\n r = 0;\n while r < 12 {\n let mut nb: i32 = ((fire[r] << 1) | (fire[r] >> 1)) & 65535;\n if r > 0 { nb = nb | fire[r - 1]; }\n if r < 11 { nb = nb | fire[r + 1]; }\n nf[r] = nb & tree[r];\n r = r + 1;\n }\n r = 0;\n while r < 12 {\n tree[r] = tree[r] & (65535 ^ nf[r]);\n fire[r] = nf[r];\n r = r + 1;\n }\n let mut k: i32 = 0;\n while k < 3 {\n seed = seed * 1103515245 + 12345;\n let rr: i32 = ((seed >> 16) & 4095) % 12;\n let cc: i32 = ((seed >> 4) & 4095) % 16;\n let bit: i32 = 1 << cc;\n if (tree[rr] & bit) == 0 && (fire[rr] & bit) == 0 {\n tree[rr] = tree[rr] | bit;\n }\n k = k + 1;\n }\n seed = seed * 1103515245 + 12345;\n if ((seed >> 16) & 63) < 2 {\n let rr: i32 = ((seed >> 4) & 4095) % 12;\n let cc: i32 = ((seed >> 9) & 4095) % 16;\n let bit: i32 = 1 << cc;\n if (tree[rr] & bit) == bit {\n fire[rr] = fire[rr] | bit;\n tree[rr] = tree[rr] & (65535 ^ bit);\n }\n }\n r = 0;\n while r < 12 {\n host::display::state_set(8 + r, tree[r]);\n host::display::state_set(20 + r, fire[r]);\n r = r + 1;\n }\n host::display::state_set(2, seed);\n }\n host::display::clear(0x080806);\n let mut trees: i32 = 0;\n r = 0;\n while r < 12 {\n let mut c: i32 = 0;\n while c < 16 {\n let mut col: i32 = 0x141410;\n if ((fire[r] >> c) & 1) == 1 {\n col = if ((t + r + c) & 1) == 0 { 0xff8020 } else { 0xffc040 };\n } else if ((tree[r] >> c) & 1) == 1 {\n col = 0x207830;\n trees = trees + 1;\n }\n host::display::fill_rect(64 + c * 24, 90 + r * 24, 22, 22, col);\n c = c + 1;\n }\n r = r + 1;\n }\n host::display::draw_string(64, 40, \"TREES\", 0x40a050, 2);\n host::display::draw_number(160, 40, trees, 0xffffff, 2);\n host::display::present();\n}\n",
"tags": [
"simulation",
"automaton",
"bitmask",
"prng"
]
}