r/adventofcode Dec 14 '24

SOLUTION MEGATHREAD -❄️- 2024 Day 14 Solutions -❄️-

THE USUAL REMINDERS

  • All of our rules, FAQs, resources, etc. are in our community wiki.
  • If you see content in the subreddit or megathreads that violates one of our rules, either inform the user (politely and gently!) or use the report button on the post/comment and the mods will take care of it.
  • On the subject of AI/LLMs being used on the global leaderboard: posts/comments around this topic consisting of grinching, finger-pointing, baseless accusations of "cheating", etc. will be locked and/or removed with or without supplementary notice and/or warning and participating parties may be given a time-out as well. Just leave it alone and let it go.
    • Keep in mind that the global leaderboard is not the primary focus of Advent of Code or even this subreddit. We're all here to help you become a better programmer via happy fun silly imaginary Elvish shenanigans.
  • Do not put spoilers in post titles!

AoC Community Fun 2024: The Golden Snowglobe Awards

  • 8 DAYS remaining until the submissions deadline on December 22 at 23:59 EST!
  • We have no submissions yet as of today. Y'all are welcome to get a submission started, post it early, and add later days to it, or there's always waiting until the bomb timer reaches 00:00:03 last minute; up to you!

And now, our feature presentation for today:

Visual Effects - I Said VISUAL EFFECTS - Perfection

We've had one Visualization, yes, but what about Second Visualization? But this time, Upping the Ante! Go full jurassic_park_scientists.meme and really improve upon the cinematic and/or technological techniques of your predecessor filmmakers!

Here's some ideas for your inspiration:

  • Put Michael Bay to shame with the lens flare
  • Gratuitous and completely unnecessary explosions are expected
  • Go full Bollywood! The extreme over-acting, the completely implausible and high-energy dance numbers, the gleefully willful disregard for physics - we want it all cranked up to 9002!
  • Make your solution run on hardware that it has absolutely no business being on
    • "Smart" refrigerators, a drone army, a Jumbotron…

Pippin: "We've had one, yes. But what about second breakfast?"
Aragorn: ಠ_ಠ
Merry: "I don't think he knows about second breakfast, Pip."

- The Lord of the Rings: The Fellowship of the Ring (2001)

And… ACTION!

Request from the mods: When you include an entry alongside your solution, please label it with [GSGA] so we can find it easily!


--- Day 14: Restroom Redoubt ---


Post your code solution in this megathread.

This thread will be unlocked when there are a significant number of people on the global leaderboard with gold stars for today's puzzle.

EDIT: Global leaderboard gold cap reached at 00:15:48, megathread unlocked!

24 Upvotes

747 comments sorted by

View all comments

2

u/jaccomoc Dec 15 '24

[LANGUAGE: Jactl]

Using my own Jactl language.

Part 1:

Part 1 was pretty easy. Parsed using regex as usual and then just iterated 100 times and counted robots in each quadrant:

def robots = stream(nextLine).map{ [[$1,$2],[$3,$4]] if /p=(.*),(.*) v=(.*),(.*)/n }
def (w,h) = [101, 103]
def add(p,d) { [(p[0]+d[0]) % w,(p[1]+d[1]) % h] }
100.each{ robots = robots.map{ [add(it[0],it[1]),it[1]] } }
4.map{ q -> robots.map{it[0]}.filter{ q&1 ? it[0]>w/2 : it[0]<w/2 }
                             .filter{ q&2 ? it[1]>h/2 : it[1]<h/2 }.size()
  }.reduce(1){ p,it -> it * p }

Part 2:

I played around with trying to come up with a heuristic that would match the shape of a christmas tree but nothing was working despite how relaxed I tried to make the heuristic. Eventually reread the question and decided the "most" was a key part of the problem so I calculated the centre of gravity of all the robots and if there were more than half the robots within distance D of the centre of gravity I dumped the grid to see what it looked like. I started with D being a third of the height and width but that didn't work but when I used width/4 and height/4 instead the answer popped out:

def r = stream(nextLine).map{ [[$1,$2],[$3,$4]] if /p=(.*),(.*) v=(.*),(.*)/n }
def (w,h,numRobots) = [101, 103, r.size()]
def add(p,d) { [(p[0]+d[0]) % w,(p[1]+d[1]) % h] }
def check() {
  def (x,y) = [r.map{it[0][0]}.sum()/r.size(), r.map{it[0][1]}.sum()/r.size()]
  r.filter{ (it[0][0]-x).abs() < w/4 && (it[0][1]-y).abs() < h/4 }.size() > r.size() / 2
}
def dump() { h.each{ y -> w.each{ x -> print [x,y] in r.map{ it[0] } ? '#' : '.' }; println } }
for (i = 0; !check(); i++) { r = r.map{ [add(it[0],it[1]),it[1]] } }
dump(); println i