fn main [ var lines := list_break_to_lines(read_lazy(h[0])); const x := len(lines[0]); const y := len(lines); var a := list_to_array([x, y], list_join(lines, "")); a := array_flatten(a); var seen := treemap_init(array(byte, [x, y]), int); var iterations := 1000000000; for seq := 0 to iterations do [ var srch := treemap_search(seen, a); if srch is j then [ var loop_start := srch.j; var loop_end := seq; if (iterations - seq) mod (loop_end - loop_start) = 0 then break; ] else [ seen := treemap_insert(seen, a, seq); ] for d in [ [0,-1], [-1,0], [0,1], [1,0] ] do [ var dx := d[0]; var dy := d[1]; while true do [ var did_something := false; for i := 0 to x do [ for j := 0 to y do [ if i + dx < 0 or i + dx >= x then continue; if j + dy < 0 or j + dy >= y then continue; if a[i, j] = 'O', a[i + dx, j + dy] = '.' then [ a[i + dx, j + dy] := 'O'; a[i, j] := '.'; did_something := true; ] ] ] if not did_something then break; ] ] ] var load := 0; for i := 0 to x do [ for j := 0 to y do [ if a[i, j] = 'O' then load += y - j; ] ] write(h[1], ntos(load) + nl); ]