From 07691021e215b598d986a1709b3b6a6e0a1a031d Mon Sep 17 00:00:00 2001 From: Juan MarĂ­n Noguera Date: Mon, 2 Dec 2024 13:22:28 +0100 Subject: Refactor Day 02 To make it more idiomatic & explore the language --- 02.lua | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) (limited to '02.lua') 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 -- cgit v1.2.3