-- Advent of Code 2025 - Day 8 - Bas Grolleman require("functions") -- Variables local boxes = {} local inputfile = "Day8/test" local limit = 11 function distance(p1, p2) return math.sqrt((p2.x - p1.x) ^ 2 + (p2.y - p1.y) ^ 2 + (p2.z - p1.z) ^ 2) end function boxes.find(id) for i, box in ipairs(boxes) do if box.id == id then return box end end end local id_counter = 0 for line in io.lines(inputfile) do local x, y, z = line:match("(%d+)%,(%d+)%,(%d+)") id_counter = id_counter + 1 local box = { id = id_counter, x = tonumber(x), y = tonumber(y), z = tonumber(z), xyz = x .. "," .. y .. "," .. z, } table.insert(boxes, box) end local distance_table = {} for i, box1 in ipairs(boxes) do for j, box2 in ipairs(boxes) do if box1.id ~= box2.id then table.insert(distance_table, { id1 = box1.id, id2 = box2.id, d = distance(box1, box2), }) end end end table.sort(distance_table, function(a, b) return a.d < b.d end) local circuit = 0 for i, dt in ipairs(distance_table) do box1 = boxes.find(dt.id1) box2 = boxes.find(dt.id2) if limit > 0 then io.write(string.format("%2d Linking %2d <-> %2d %.0f", limit, box1.id, box2.id, dt.d)) if box1.c == nil and box2.c == nil then circuit = circuit + 1 box1.c = circuit box2.c = circuit limit = limit - 1 print(" C=" .. circuit .. " BOTH") elseif box1.c ~= nil and box2.c ~= nil then if box1.c == box2.c then print(" C=" .. box1.c .. " ALREADY") else -- Oh look, we merge 2 circuits! print(" Merging " .. box1.c .. " and " .. box2.c) local remove = box2.c for k, uc in ipairs(boxes) do if uc.c == remove then uc.c = box1.c end end limit = limit - 1 end elseif box1.c == nil then box1.c = box2.c limit = limit - 1 print(" C=" .. box1.c .. " HOOK BOX1") elseif box2.c == nil then box2.c = box1.c limit = limit - 1 print(" C=" .. box1.c .. " HOOK BOX2") end end end for k, box in ipairs(boxes) do if box.c == nil then circuit = circuit + 1 box.c = circuit end end table.sort(boxes, function(a, b) return a.c < b.c end) local lc = 0 local circuit_size = {} for k, box in ipairs(boxes) do if lc ~= box.c then circuit_size[box.c] = 1 print() else circuit_size[box.c] = circuit_size[box.c] + 1 end print(string.format("Box %2d Circuit %2d", box.id, box.c)) lc = box.c end print() local circuit_size2 = {} for k, v in pairs(circuit_size) do circuit_size2[#circuit_size2 + 1] = v end table.sort(circuit_size2, function(a, b) return b < a end) print_table(circuit_size2) local total = circuit_size2[1] * circuit_size2[2] * circuit_size2[3] print("Total size " .. total)