From 9c8cd8e7a9501831061586e3da213bb5f28d28b9 Mon Sep 17 00:00:00 2001 From: Felix Van der Jeugt Date: Thu, 9 Dec 2021 09:21:55 +0100 Subject: [PATCH] day 9 --- day09/part1.lua | 26 ++++++++++++++++++ day09/part2.lua | 71 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100755 day09/part1.lua create mode 100755 day09/part2.lua diff --git a/day09/part1.lua b/day09/part1.lua new file mode 100755 index 0000000..a123862 --- /dev/null +++ b/day09/part1.lua @@ -0,0 +1,26 @@ +#!/usr/bin/env luajit +require("utils") + +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 function get(r, c) + return (hm[r] or {})[c] or math.huge +end + +local lowsum = 0 +for r, row in pairs(hm) do + for c, col in pairs(row) do + if col < get(r - 1, c) and col < get(r, c - 1) and col < get(r + 1, c) and col < get(r, c + 1) then + lowsum = lowsum + col + 1 + end + end +end + +print(lowsum) diff --git a/day09/part2.lua b/day09/part2.lua new file mode 100755 index 0000000..ef2f19e --- /dev/null +++ b/day09/part2.lua @@ -0,0 +1,71 @@ +#!/usr/bin/env luajit +require("utils") + +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 function get(r, c) + return (hm[r] or {})[c] or 9 +end + +local union = {} +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 + if union[r] == nil then union[r] = {} end + union[r][c] = { r - 1, c } + end + if get(r, c - 1) ~= 9 then + if union[r] == nil then union[r] = {} end + if union[r][c] ~= nil then + local r0, c0 = r, c - 1 + while type(union[r0][c0]) == "table" do + r0, c0 = unpack(union[r0][c0]) + if union[r0] == nil then union[r0] = {} end + end + local r1, c1 = r, c + while type(union[r1][c1]) == "table" do + r1, c1 = unpack(union[r1][c1]) + if union[r1] == nil then union[r1] = {} end + end + if r0 ~= r1 or c0 ~= c1 then + union[r1][c1] = { r0, c0 } + end + else + union[r][c] = { r, c - 1 } + end + end + end + end +end + +local sums = {} +for r, row in pairs(hm) do + for c, col in pairs(row) do + if col ~= 9 then + local r0, c0 = r, c + while type(union[r0][c0]) == "table" do + r0, c0 = unpack(union[r0][c0]) + end + if sums[r0] == nil then sums[r0] = {} end + sums[r0][c0] = (sums[r0][c0] or 0) + 1 + end + end +end + +local sizes = {} +for r, row in pairs(sums) do + for c, col in pairs(row) do + table.insert(sizes, col) + end +end + +table.sort(sizes) +print(sizes[#sizes] * sizes[#sizes - 1] * sizes[#sizes - 2])