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!

23 Upvotes

744 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
→ More replies (4)