diff options
| author | Juan Marín Noguera <juan@mnpi.eu> | 2024-12-02 13:22:28 +0100 |
|---|---|---|
| committer | Juan Marín Noguera <juan@mnpi.eu> | 2024-12-02 13:29:23 +0100 |
| commit | 07691021e215b598d986a1709b3b6a6e0a1a031d (patch) | |
| tree | e89ad978c18001b61762e5075d89e845150557fc | |
| parent | 4ea000f99b8fc4d145deb89370312937c5646de3 (diff) | |
Refactor Day 02
To make it more idiomatic & explore the language
| -rw-r--r-- | 02.lua | 33 |
1 files changed, 19 insertions, 14 deletions
@@ -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 |
