aoc/day2/day2_part2.lua
2024-12-02 09:17:03 -05:00

68 lines
1.5 KiB
Lua

--Lua 5.4.2
local File = io.open("input.txt", "r")
if not File then
print("File not found")
return
end
local function IsReportSafe(Numbers)
local IsSafe = true
local LastSign = 0
local LastNumber
for _, Number in next, Numbers do
if not LastNumber then
LastNumber = Number
goto continue
end
local Difference = math.abs(Number - LastNumber)
if Difference > 3 or Difference == 0 then
IsSafe = false
break
end
local Sign = (Number - LastNumber) > 0 and 1 or -1
if LastSign == 0 then
LastSign = Sign
else
if Sign ~= LastSign then
IsSafe = false
break
end
end
LastNumber = Number
::continue::
end
return IsSafe
end
local function Clone(t) --surface level copy
local Cloned = {}
for Key, Value in next, t do
Cloned[Key] = Value
end
return Cloned
end
local SafeReports = 0
for Line in File:lines() do
local Numbers = {}
for Number in Line:gmatch("%d+") do
table.insert(Numbers, tonumber(Number))
end
if IsReportSafe(Numbers) then
SafeReports = SafeReports + 1
else
for Index = 1, #Numbers do
local NumbersCopy = Clone(Numbers) --yikes
table.remove(NumbersCopy, Index)
if IsReportSafe(NumbersCopy) then
SafeReports = SafeReports + 1
break
end
end
end
end
print("Safe reports:", SafeReports)