Guest User

Untitled

a guest
Dec 5th, 2025
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.83 KB | None | 0 0
  1. package.path = package.path .. ";../lib/?.lua"
  2. local helper = require("helper")
  3. helper.load_lib("../lib/libaoc.so")
  4.  
  5. local function part1(ranges, ids)
  6.     local fresh = 0
  7.     local counted = {}
  8.     for _, id in ipairs(ids) do
  9.         for _, range in ipairs(ranges) do
  10.             if id >= range[1] and id <= range[2] and counted[id] == nil then
  11.                 fresh = fresh + 1
  12.                 counted[id] = true
  13.             end
  14.         end
  15.     end
  16.     return fresh
  17. end
  18.  
  19. local function merge_ranges(r1, r2)
  20.     local do_overlap = r1[1] <= r2[2] and r1[2] >= r2[1]
  21.     if do_overlap then
  22.         return true, {
  23.             math.min(r1[1], r2[1]),
  24.             math.max(r1[2], r2[2])
  25.         }
  26.     else
  27.         return false, nil
  28.     end
  29. end
  30.  
  31. local function part2(ranges)
  32.     table.sort(ranges, function(l, r)
  33.         if l[1] == r[1] then
  34.             return l[2] < r[2]
  35.         else
  36.             return l[1] < r[1]
  37.         end
  38.     end)
  39.     local total = 0
  40.     local final_ranges = {}
  41.     for _, r1 in ipairs(ranges) do
  42.         if #final_ranges == 0 then
  43.             table.insert(final_ranges, r1)
  44.         else
  45.             local did_merge, merged = merge_ranges(r1, final_ranges[#final_ranges])
  46.             if did_merge then
  47.                 final_ranges[#final_ranges] = merged
  48.             else
  49.                 table.insert(final_ranges, r1)
  50.             end
  51.         end
  52.     end
  53.  
  54.     for _, range in ipairs(final_ranges) do
  55.         total = total + (range[2] - range[1] + 1)
  56.     end
  57.     return total
  58. end
  59.  
  60. ---@param input string
  61. local function parse_input(input)
  62.     local ranges = {}
  63.     local ids = {}
  64.     local lines = helper.line_iter(input)
  65.     for line in lines do
  66.         if not line:match("-") then
  67.             table.insert(ids, tonumber(line))
  68.         else
  69.             local num_iter = line:gmatch("%d+")
  70.             table.insert(ranges, { tonumber(num_iter()), tonumber(num_iter()) })
  71.         end
  72.     end
  73.     return ranges, ids
  74. end
  75.  
  76. local input = helper.get_input(5, 2025)
  77. local sample = helper.get_sample("sample.txt")
  78.  
  79. local ranges, ids = parse_input(input)
  80. print(part1(ranges, ids))
  81. print(string.format("%.f", part2(ranges)))
  82.  
Advertisement
Add Comment
Please, Sign In to add comment