From 3dedc1da036df52a9b701ff1148f083ecc52f727 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Mon, 8 Dec 2025 14:02:15 +0100 Subject: [PATCH] feat: solve day 8 puzzle 1 --- README.md | 4 +-- res/examples/day08.txt | 20 +++++++++++ res/stats.json | 2 +- src/day08/puzzle1.lua | 82 ++++++++++++++++++++++++++++++++++++++++++ src/day08/puzzle2.lua | 7 ++++ 5 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 res/examples/day08.txt create mode 100644 src/day08/puzzle1.lua create mode 100644 src/day08/puzzle2.lua diff --git a/README.md b/README.md index 4937af2..dfa4caa 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,10 @@ This project can also be run using the amazing [CraftOS-PC emulator](https://git ## Progress -#### Stars: 14/24 +#### Stars: 15/24 |Mon|Tue|Wed|Thu|Fri|Sat|Sun| |:-:|:-:|:-:|:-:|:-:|:-:|:-:| |1
:star::star:|2
:star::star:|3
:star::star:|4
:star::star:|5
:star::star:|6
:star::star:|7
:star::star:| -|8
|9
|10
|11
|12
||| +|8
:star:|9
|10
|11
|12
||| diff --git a/res/examples/day08.txt b/res/examples/day08.txt new file mode 100644 index 0000000..20c6fd2 --- /dev/null +++ b/res/examples/day08.txt @@ -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 \ No newline at end of file diff --git a/res/stats.json b/res/stats.json index 1191135..86b93f0 100644 --- a/res/stats.json +++ b/res/stats.json @@ -28,7 +28,7 @@ "puzzle2": true }, "day08": { - "puzzle1": false, + "puzzle1": true, "puzzle2": false }, "day09": { diff --git a/src/day08/puzzle1.lua b/src/day08/puzzle1.lua new file mode 100644 index 0000000..2d974ab --- /dev/null +++ b/src/day08/puzzle1.lua @@ -0,0 +1,82 @@ +local utils = require "utils" +local puzzle1 = {} + +function puzzle1.dist(box1, box2) + return math.sqrt( + (box2.x - box1.x) ^ 2 + + (box2.y - box1.y) ^ 2 + + (box2.z - box1.z) ^ 2 + ) +end + +function puzzle1.pretty(box) + return ("%d,%d,%d"):format(box.x, box.y, box.z) +end + +function puzzle1.solve(input) + local boxes = {} + + local lines = utils.splitLines(input) + + for i, line in ipairs(lines) do + local x, y, z = line:match("(%d+),(%d+),(%d+)") + table.insert(boxes, {x=x, y=y, z=z, i=i, circuit=i}) + end + + local dists = {} + local circuits = {} + + for i, box1 in ipairs(boxes) do + circuits[i] = i + for j=i+1, #boxes do + local box2 = boxes[j] + table.insert(dists, { + i=i, + j=j, + dist=puzzle1.dist(box1, box2) + }) + end + end + + table.sort(dists, function (a, b) + return a.dist < b.dist + end) + + local N = 1000 + if #boxes < 100 then + N = 10 + end + + for i, d in ipairs(dists) do + if i > N then + break + end + local circ1 = circuits[d.i] + local circ2 = circuits[d.j] + + for k, v in pairs(circuits) do + if v == circ2 then + circuits[k] = circ1 + end + end + end + + local circuitSizes = {} + + for _, c in pairs(circuits) do + circuitSizes[c] = (circuitSizes[c] or 0) + 1 + end + + local sizes = {} + + for _, s in pairs(circuitSizes) do + table.insert(sizes, s) + end + + table.sort(sizes) + local n = #sizes + + return sizes[n] * sizes[n - 1] * sizes[n - 2] +end + +return puzzle1 diff --git a/src/day08/puzzle2.lua b/src/day08/puzzle2.lua new file mode 100644 index 0000000..2f4bc9a --- /dev/null +++ b/src/day08/puzzle2.lua @@ -0,0 +1,7 @@ +local puzzle2 = {} + +function puzzle2.solve(input) + return 0 +end + +return puzzle2