Forgot to commit the last few days
This commit is contained in:
121
2025/Day8/Day8.lua
Normal file
121
2025/Day8/Day8.lua
Normal file
@@ -0,0 +1,121 @@
|
||||
-- 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)
|
||||
1000
2025/Day8/full
Normal file
1000
2025/Day8/full
Normal file
File diff suppressed because it is too large
Load Diff
20
2025/Day8/test
Normal file
20
2025/Day8/test
Normal file
@@ -0,0 +1,20 @@
|
||||
162,817,812
|
||||
57,618,57
|
||||
906,360,560
|
||||
592,479,940
|
||||
352,342,300
|
||||
466,668,158
|
||||
542,29,236
|
||||
431,825,988
|
||||
739,650,466
|
||||
52,470,668
|
||||
216,146,977
|
||||
819,987,18
|
||||
117,168,530
|
||||
805,96,715
|
||||
346,949,466
|
||||
970,615,88
|
||||
941,993,340
|
||||
862,61,35
|
||||
984,92,344
|
||||
425,690,689
|
||||
Reference in New Issue
Block a user