diff options
| author | Juan Marín Noguera <juan@mnpi.eu> | 2024-12-02 12:02:52 +0100 |
|---|---|---|
| committer | Juan Marín Noguera <juan@mnpi.eu> | 2024-12-02 12:03:33 +0100 |
| commit | 4ea000f99b8fc4d145deb89370312937c5646de3 (patch) | |
| tree | 314aacaf6bb31bc4732443354791028e34c2e020 /02.lua | |
| parent | 627f06a7fb41e1ac77103ad4a6c070cff7dfaeaa (diff) | |
Day 02
Diffstat (limited to '02.lua')
| -rw-r--r-- | 02.lua | 70 |
1 files changed, 70 insertions, 0 deletions
@@ -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 |
