fn main [ var lines := list_break_to_lines(read_lazy(h[0])); const x := len(lines[0]) + 2; const y := len(lines) + 2; var a := array_fill(byte, '.', [x, y]); for j := 1 to y - 1 do [ var line := lines[j - 1]; for i := 1 to x - 1 do [ a[i, j] := line[i - 1]; ] ] var gears_attached := array_fill(0, [x, y]); var gears_ratio := array_fill(1, [x, y]); fn is_digit(i j : int) := a[i, j] >= '0' and a[i, j] <= '9'; fn is_gear(i j : int) := a[i, j] = '*'; for j := 1 to y - 1 do [ for i := 1 to x - 1 do [ if is_digit(i, j) then [ var num : int := a[i, j] - '0'; var si := i; i += 1; while is_digit(i, j) do [ num := num * 10 + a[i, j] - '0'; i += 1; ] for qj := j - 1 to j + 2 do [ for qi := si - 1 to i + 1 do [ if is_gear(qi, qj) then [ gears_attached[qi, qj] += 1; gears_ratio[qi, qj] *= num; ] ] ] ] ] ] var sum := 0; for j := 1 to y - 1 do [ for i := 1 to x - 1 do [ if gears_attached[i, j] = 2 then sum += gears_ratio[i, j]; ] ] write(h[1], ntos(sum) + nl); ]