this post was submitted on 10 Dec 2025
13 points (100.0% liked)

Advent Of Code

1199 readers
3 users here now

An unofficial home for the advent of code community on programming.dev! Other challenges are also welcome!

Advent of Code is an annual Advent calendar of small programming puzzles for a variety of skill sets and skill levels that can be solved in any programming language you like.

Everybody Codes is another collection of programming puzzles with seasonal events.

EC 2025

AoC 2025

Solution Threads

M T W T F S S
1 2 3 4 5 6 7
8 9 10 11 12

Visualisations Megathread

Rules/Guidelines

Relevant Communities

Relevant Links

Credits

Icon base by Lorc under CC BY 3.0 with modifications to add a gradient

console.log('Hello World')

founded 2 years ago
MODERATORS
 

Day 10: Factory

Megathread guidelines

  • Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
  • You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL

FAQ

you are viewing a single comment's thread
view the rest of the comments
[โ€“] Gobbel2000@programming.dev 3 points 1 week ago (3 children)

Rust

Only took four days, but I made it, and without any maths libraries. I tried lots of unsuccessful searches (including A*) before realizing part 2 is a linear equation system. Then I tried to find all solutions by just going row by row, guessing all but one unknown variable and finding the smallest solution, but this was still way too slow due to the high amount of variables guessed.

By looking around on Wikipedia I found that the problem could be simplified by turning the matrix into Smith Normal Form or Hermitian Normal Form, but couldn't find any Rust library implementing these. Their algorithms looked just a bit too complicated to implement myself. Maybe I would have used Python, because sagemath has everything, but the problem of ultimately finding the smallest integer solution still remained, and I already had the search code in Rust without simplifying the matrix.

So put the matrix into echelon form by implementing Gaussian elimination, which wasn't too bad, and it significantly reduced the number of variables to guess. Now part 2 runs in 70ms.

View code on github

[โ€“] mr_satan@lemmy.zip 1 points 1 week ago

I'm still attempting to make "no lib" solution using matrices and Gaussian elimination. It definitely reduces my solution space, but I'm still struggling to find a good approach to search the space.

My next step is gonna be somehow extracting inequality boundaries, lock a variable at the boundary and solve that reduced equation system. Unfortunately I have no good way to get lower bounds like I do on paper (by default lower bounds for all variables are 0).

After looking at examples of graphical linear system solutions my hope is that optimal solutions will sit on these intersections between equations. The idea hinges on these equations being linear, meaning that without curves there should be no other optimum solutions.

On paper, looking at the inequality ranges, one variable maximum seems imply a minimum for another (in case there are two variables). Searching for solutions by solving smaller and smaller systems with these locked variables feels like a probable approach.

Congrats! I'll try not to peek at your code, but will definitely try to repeat your process. I want to remove z3 from my solution.

[โ€“] EnEnCode@programming.dev 1 points 1 week ago

Nice job! I initially thought about using reduced-row echelon form, but the matrices all had infinitely many real solutions so I couldn't figure out how to proceed. Instead, I scanned Wikipedia for a bit, found the two-phase simplex algorithm, spent two days getting it to work on paper and another day implementing it.

And the reward?I'm not even done because ~10% of the systems have non-integer optima, so I still need to use cutting planes to add extra constraints to get the integer optima.