fn main [ var lines := list_break_to_lines(read_lazy(h[0])); var copies := infinite(1); var card := 0; for line in lines do [ var c := list_search(line, ':'); line := line[c + 1 .. ]; var winning : uint128 := 0; var n_winning := 0; var pass := false; while len_greater_than(line, 0) do [ if list_begins_with(line, " |") then [ line := line[2 .. ]; pass := true; continue; ] if line[0] <> ' ' then abort; if line[1] = ' ' then line[1] := '0'; var num := 10 * (line[1] - '0') + line[2] - '0'; line := line[3 .. ]; if not pass then winning bts= num; else if winning bt num then n_winning += 1; ] for i := card + 1 to card + 1 + n_winning do copies[i] += copies[card]; card += 1; ] var sum := list_fold_monoid(copies[ .. card]); write(h[1], ntos(sum) + nl); ]