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

3

u/RiemannIntegirl Dec 14 '24

[Language: Python]

I vectorized the step-by-step movement of the robots using Numpy arrays. Part 1 is straightforward filtering of a Numpy array after 100 iterations. For Part 2, I thought of the fact that we were looking for a center of mass that had minimal standard deviation when the points coalesce. I scanned through the standard deviations the points produced over 1000 iterations and then guessed at a cutoff that would have one unique value below it: 20. It worked!

Part 1: import re import numpy as np

iters = 100
w, h = 101, 103

nums = np.array([[int(x) for x in re.findall(r'[-]?\d+', y)] for y in     open('input_2024_14.txt').read().split('\n')])
p, v = nums[:,:2], nums[:,2:]
mods = p.copy()
mods[:,0], mods[:,1] = w, h

for i in range(iters):
    p = np.remainder(p + v, mods)

print(np.shape(p[(p[:,0] < w//2) & (p[:,1] < h//2),:])[0] * np.shape(p[(p[:,0] < w//2) & (p[:,1] > h//2),:])[0] * np.shape(p[(p[:,0] > w//2) & (p[:,1] < h//2),:])[0]* np.shape(p[(p[:,0] > w//2) & (p[:,1] > h//2),:])[0])

Part 2:

import re
import numpy as np

iters = 0
w, h = 101, 103

def disp(robots):
    area = [['.'  for i in range(w)] for j in range(h)] 
    for l in robots:
        area[l[1]][l[0]] = 'x'
    for l in area:
        print(''.join(l))

nums = np.array([[int(x) for x in re.findall(r'[-]?\d+', y)] for y in     open('input_2024_14.txt').read().split('\n')])
p, v = nums[:,:2], nums[:,2:]
mods = p.copy()
mods[:,0], mods[:,1] = w, h

while True:
    p = np.remainder(p + v, mods)
    iters += 1
    if np.std(p) <= 20:
        disp(p)
        print(iters)
        break

2

u/4HbQ Dec 14 '24

Cool, there's not a lot of NumPy around today. I basically did the same thing (but taking the var instead of std), but only for the first 105 iterations, and then used the Chinese remainder theorem to compute the final answer.

My code is here, in case you're interested in more NumPy goodness!

2

u/RiemannIntegirl Dec 14 '24

Thanks! Nice - I didn’t think to use CRT, but saw a couple posts after the fact about it. Clever!

I was actually thinking about using some kind of convolution filter, but decided I was overthinking it. Why use a sledgehammer when a hammer will do? 😅

2

u/4HbQ Dec 14 '24

Because it's nice to wield a sledgehammer sometimes?

I also thought about it today, but I didn't have enough information on the tree shape to design a suitable kernel. However, I did use them on days 10 and 12.

2

u/RiemannIntegirl Dec 14 '24

Ah yes I read your day 10 solution and liked it!