#!/usr/bin/env lua local function expand(l, i) local p = { i, i } while p[1] > 1 and string.gmatch(l:sub(p[1] - 1, p[1] - 1), "%d")() ~= nil do p[1] = p[1] - 1 end while p[2] < #l and string.gmatch(l:sub(p[2] + 1, p[2] + 1), "%d")() ~= nil do p[2] = p[2] + 1 end return p end local function replace(l, s, e) local t = {} for token in string.gmatch(l, ".") do table.insert(t, token) end for i = 1, #t do if i >= s and i <= e then t[i] = "." end end return table.concat(t) end local function copy(v) local j = {} for i = 1, #v do j[i] = v[i] end return j end local function adj(i, j) return { { i - 1, j }, { i + 1, j }, { i, j - 1 }, { i, j + 1 }, { i - 1, j - 1 }, { i - 1, j + 1 }, { i + 1, j - 1 }, { i + 1, j + 1 }, } end local function p1(l) local v = copy(l) local s = 0 for i = 1, #v do for j = 1, #v[i] do if string.gmatch(v[i]:sub(j, j), "[*#+$=@%%/&-]")() ~= nil then local p = adj(i, j) for k = 1, #p do if (p[k][1] < 1 or p[k][2] < 1 or p[k][1] > #v or p[k][2] > #v[p[k][1]]) or (string.gmatch(v[p[k][1]]:sub(p[k][2], p[k][2]), "%d")() == nil) then goto nextkp1 end local pos = expand(v[p[k][1]], p[k][2]) s = s + tonumber(v[p[k][1]]:sub(pos[1], pos[2])) v[p[k][1]] = replace(v[p[k][1]], pos[1], pos[2]) ::nextkp1:: end end end end return s end local function p2(l) local v = copy(l) local s = 0 for i = 1, #v do for j = 1, #v[i] do if string.gmatch(v[i]:sub(j, j), "[*]")() ~= nil then local p = adj(i, j) local n = {} for k = 1, #p do if (p[k][1] < 1 or p[k][2] < 1 or p[k][1] > #v or p[k][2] > #v[p[k][1]]) or (string.gmatch(v[p[k][1]]:sub(p[k][2], p[k][2]), "%d")() == nil) then goto nextkp2 end local pos = expand(v[p[k][1]], p[k][2]) table.insert(n, tonumber(v[p[k][1]]:sub(pos[1], pos[2]))) v[p[k][1]] = replace(v[p[k][1]], pos[1], pos[2]) ::nextkp2:: end if #n == 2 then s = s + n[1] * n[2] end end end end return s end local f = io.open("03.txt", "r") local content = f:read("*all") f:close() local l = {} for line in string.gmatch(content, "[(%w%p)]+") do table.insert(l, line) end print(p1(l)) print(p2(l))