fn solve_task(presents : array(array(bool, [ 3, 3 ]), [ 6 ]), x y : int, num : array(int, [ 6 ])) : bool [ var xs := x div 3; var ys := y div 3; if list_fold_monoid(array_to_list(num)) <= xs * ys then return true; var used := 0; for p := 0 to 6 do [ var u := 0; for i := 0 to 3 do for j := 0 to 3 do u += select(presents[p][i, j], 0, 1); used += u * num[p]; ] if used > x * y then return false; abort; ] fn main [ var lines := list_break_to_lines(read_lazy(h[0])); var sections := list_break(lines, ""); var presents := array_fill(array_fill(false, [ 3, 3 ]), [ 6 ]); for i := 0 to 6 do [ var s := sections[i][1 .. 4]; for x := 0 to 3 do [ for y := 0 to 3 do [ if s[y][x] = '#' then presents[i][x, y] := true; else if s[y][x] <> '.' then abort; ] ] ] var sum := 0; for task in sections[6] do [ task := list_replace_substring(task, "x", " "); task := list_replace_substring(task, ":", ""); var n := map(list_break_whitespace(task), ston); sum += select(solve_task(presents, n[0], n[1], list_to_array([ 6 ], n[2 .. 8])), 0, 1); ] write(h[1], ntos(sum) + nl); ]