From 4b9196370a7408e46b7deff3f237de07f98aecf4 Mon Sep 17 00:00:00 2001 From: tommy Date: Mon, 2 Dec 2024 09:17:03 -0500 Subject: [PATCH] Day 2: Part 2 --- day2/day2_part2.lua | 67 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 day2/day2_part2.lua diff --git a/day2/day2_part2.lua b/day2/day2_part2.lua new file mode 100644 index 0000000..89167cc --- /dev/null +++ b/day2/day2_part2.lua @@ -0,0 +1,67 @@ +--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)