fn get_seq(mm : bytes) : list(int) [ mm := list_replace_substring(mm, ".", " "); var wh := list_break_whitespace(mm); return map(wh, len(byte, )); ] fn solve_line(line : bytes) : int [ var l := list_break_whitespace(line); var m := l[0]; var seq := map(list_break(l[1], ','), ston); var n_b := list_fold_monoid(seq); var q_idx := empty(int); for i := 0 to len(m) do [ if m[i] = '?' then q_idx +<= i; if m[i] = '#' then n_b -= 1; ] var s := 0; for i := 0 to 0 bts len(q_idx) do [ if popcnt i <> n_b then continue; var mm := m; for j := 0 to len(q_idx) do mm[q_idx[j]] := select(i bt j, '.', '#'); var seq2 := get_seq(mm); if seq = seq2 then s += 1; ] return s; ] fn main [ var lines := list_break_to_lines(read_lazy(h[0])); var sum := list_map_fold_monoid(lines, solve_line); write(h[1], ntos(sum) + nl); ]