aboutsummaryrefslogtreecommitdiff
path: root/02.lua
diff options
context:
space:
mode:
authorJuan Marín Noguera <juan@mnpi.eu>2024-12-02 13:22:28 +0100
committerJuan Marín Noguera <juan@mnpi.eu>2024-12-02 13:29:23 +0100
commit07691021e215b598d986a1709b3b6a6e0a1a031d (patch)
treee89ad978c18001b61762e5075d89e845150557fc /02.lua
parent4ea000f99b8fc4d145deb89370312937c5646de3 (diff)
Refactor Day 02
To make it more idiomatic & explore the language
Diffstat (limited to '02.lua')
-rw-r--r--02.lua33
1 files changed, 19 insertions, 14 deletions
diff --git a/02.lua b/02.lua
index ce28bb6..3168f3b 100644
--- a/02.lua
+++ b/02.lua
@@ -1,31 +1,35 @@
local Report = {}
Report.__index = Report
+function Report:__tostring ()
+ return table.concat(self, ' ')
+end
+
function Report:new (values)
- if #values == 0 then error "Cannot construct an empty report." end
+ 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_dir (down, allow_dampen)
+ local function valid_jump (start, finish)
+ local diff = down and start - finish or finish - start
+ return diff >= 1 and diff <= 3
+ end
-function Report:is_safe_factor (mult, allow_dampen)
- local prev = self[1] * mult
+ local prev = self[1]
for i = 2,#self do
- local cur = self[i] * mult
+ local cur = self[i]
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)
+ local remove_cur = i == #self or valid_jump(prev, self[i+1])
if not remove_cur then
- local remove_prev = i == 2 or valid_jump(self[i-2] * mult, cur)
+ local remove_prev = i == 2 or valid_jump(self[i-2], cur)
if not remove_prev then return false end
prev = cur
end
@@ -37,15 +41,15 @@ function Report:is_safe_factor (mult, allow_dampen)
end
function Report:is_safe (allow_dampen)
- return self:is_safe_factor(1, allow_dampen) or
- self:is_safe_factor(-1, allow_dampen)
+ return self:is_safe_dir(true, allow_dampen) or
+ self:is_safe_dir(false, allow_dampen)
end
local input = {}
-for line in function () return io.read("*l") end do
+for line in function () return io.read('*l') end do
local parsed = {}
- for v in line:gmatch("%d+") do
+ for v in line:gmatch('%d+') do
table.insert(parsed, tonumber(v))
end
table.insert(input, Report:new(parsed))
@@ -60,6 +64,7 @@ function input:sum_safe (allow_dampen)
end
function input:part1 ()
+ print(self)
print(self:sum_safe(false))
end