diff options
author | Christian Segundo | 2023-12-03 11:36:43 +0100 |
---|---|---|
committer | Christian Segundo | 2023-12-03 11:41:30 +0100 |
commit | af54dee0ed31b94cb56bc95c0aacc750743d6a2c (patch) | |
tree | f80c844e383356fed0be4f6b196d2d9e60046a7f /03.lua | |
parent | 73353e0e5e01f0702c0a8aa99397474c40af2a4c (diff) | |
download | advent-of-dotslash-2023-af54dee0ed31b94cb56bc95c0aacc750743d6a2c.tar.gz |
add day 3
Diffstat (limited to '03.lua')
-rwxr-xr-x | 03.lua | 110 |
1 files changed, 110 insertions, 0 deletions
@@ -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)) |