fn main [ var lk := list_break(list_break_to_lines(read_lazy(h[0])), ""); var locks := empty(array(uint8, [5])); var keys := empty(array(uint8, [5])); for l in lk do [ if l[0] = "#####", l[6] = "....." then [ var lock := array_fill(uint8, 0, [5]); for i := 0 to 5 do for j := 1 to 6 do if l[j][i] = '#' then lock[i] += 1; locks +<= lock; ] else if l[6] = "#####", l[0] = "....." then [ var key := array_fill(uint8, 0, [5]); for i := 0 to 5 do for j := 1 to 6 do if l[j][i] = '#' then key[i] += 1; keys +<= key; ] else [ abort; ] ] var fit := 0; for l := 0 to len(locks) do [ for k := 0 to len(keys) do [ for i := 0 to 5 do [ if locks[l][i] + keys[k][i] > 5 then goto doesnt_fit; ] fit += 1; doesnt_fit: ] ] write(h[1], ntos(fit) + nl); ]