#!/usr/bin/env luajit require("utils") require("unionfind") local hm = {} for line in io.lines(arg[3]) do local row = {} for c in chars(line) do table.insert(row, tonumber(c)) end table.insert(hm, row) end local w = #hm[1] local function get(r, c) return (hm[r] or {})[c] or 9 end local union = unionfind() for r, row in pairs(hm) do for c, col in pairs(row) do if col ~= 9 then if get(r - 1, c) ~= 9 then union:makeset(r*w + c) union:makeset(r*w - w + c) union:union(r*w + c, r*w - w + c) end if get(r, c - 1) ~= 9 then union:makeset(r*w + c) union:makeset(r*w + c - 1) union:union(r*w + c, r*w + c - 1) end end end end local sizes = {} for set, size in union:unions() do table.insert(sizes, size) end table.sort(sizes) print(sizes[#sizes] * sizes[#sizes - 1] * sizes[#sizes - 2])