aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan Marín Noguera <juan@mnpi.eu>2024-12-02 12:02:52 +0100
committerJuan Marín Noguera <juan@mnpi.eu>2024-12-02 12:03:33 +0100
commit4ea000f99b8fc4d145deb89370312937c5646de3 (patch)
tree314aacaf6bb31bc4732443354791028e34c2e020
parent627f06a7fb41e1ac77103ad4a6c070cff7dfaeaa (diff)
Day 02
-rw-r--r--02.lua70
1 files changed, 70 insertions, 0 deletions
diff --git a/02.lua b/02.lua
new file mode 100644
index 0000000..ce28bb6
--- /dev/null
+++ b/02.lua
@@ -0,0 +1,70 @@
+local Report = {}
+Report.__index = Report
+
+function Report:new (values)
+ if #values == 0 then error "Cannot construct an empty report." end
+ setmetatable(values, Report)
+ return values
+end
+
+local function valid_jump (start, finish)
+ local diff = finish - start
+ return diff >= 1 and diff <= 3
+end
+
+function Report:is_safe_factor (mult, allow_dampen)
+ local prev = self[1] * mult
+ for i = 2,#self do
+ local cur = self[i] * mult
+
+ if valid_jump(prev, cur) then
+ prev = cur
+ elseif not allow_dampen then
+ return false
+ else
+ local remove_cur = i == #self or valid_jump(prev, self[i+1] * mult)
+
+ if not remove_cur then
+ local remove_prev = i == 2 or valid_jump(self[i-2] * mult, cur)
+ if not remove_prev then return false end
+ prev = cur
+ end
+
+ allow_dampen = false
+ end
+ end
+ return true
+end
+
+function Report:is_safe (allow_dampen)
+ return self:is_safe_factor(1, allow_dampen) or
+ self:is_safe_factor(-1, allow_dampen)
+end
+
+local input = {}
+
+for line in function () return io.read("*l") end do
+ local parsed = {}
+ for v in line:gmatch("%d+") do
+ table.insert(parsed, tonumber(v))
+ end
+ table.insert(input, Report:new(parsed))
+end
+
+function input:sum_safe (allow_dampen)
+ local sum = 0
+ for _, x in ipairs(input) do
+ if x:is_safe(allow_dampen) then sum = sum + 1 end
+ end
+ return sum
+end
+
+function input:part1 ()
+ print(self:sum_safe(false))
+end
+
+function input:part2 ()
+ print(self:sum_safe(true))
+end
+
+return input