summaryrefslogtreecommitdiff
path: root/03.lua
diff options
context:
space:
mode:
Diffstat (limited to '03.lua')
-rwxr-xr-x03.lua110
1 files changed, 110 insertions, 0 deletions
diff --git a/03.lua b/03.lua
new file mode 100755
index 0000000..4cf692f
--- /dev/null
+++ b/03.lua
@@ -0,0 +1,110 @@
+#!/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))