fn solve_line(line : bytes) : int [ var l := list_break_whitespace(line); var m := l[0]; var seq := map(list_break(l[1], ','), ston); for i := 1 to 5 do m += "?" + l[0]; seq := list_repeat(seq, 5); const len_m := len(m); const sum_of_seq := list_fold_monoid(seq); var boundaries := array_fill(false, [sum_of_seq]); var seq_ptr := 0; for i := 0 to len(seq) do [ boundaries[seq_ptr] := true; seq_ptr += seq[i]; ] var pos := array_fill(0, [len_m + 1, sum_of_seq + 1, 2]); pos[0, 0, 0] := 1; for i_m := 0 to len_m do [ for i_last := 0 to 2 do [ for i_seq := 0 to sum_of_seq + 1 do [ var pos_val := pos[i_m, i_seq, i_last]; if pos_val = 0 then continue; var cur_ch := m[i_m]; if cur_ch = '.' or cur_ch = '?' then [ pos[i_m + 1, i_seq, 0] += pos_val; ] if cur_ch = '#' or cur_ch = '?', i_seq < sum_of_seq then [ if i_last <> 0 xor boundaries[i_seq] then [ pos[i_m + 1, i_seq + 1, 1] += pos_val; ] ] ] ] ] return pos[len_m, sum_of_seq, 0] + pos[len_m, sum_of_seq, 1]; ] 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); ]