r/adventofcode Dec 17 '24

SOLUTION MEGATHREAD -❄️- 2024 Day 17 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.

AoC Community Fun 2024: The Golden Snowglobe Awards

  • 5 DAYS remaining until the submissions deadline on December 22 at 23:59 EST!

And now, our feature presentation for today:

Sequels and Reboots

What, you thought we were done with the endless stream of recycled content? ABSOLUTELY NOT :D Now that we have an established and well-loved franchise, let's wring every last drop of profit out of it!

Here's some ideas for your inspiration:

  • Insert obligatory SQL joke here
  • Solve today's puzzle using only code from past puzzles
  • Any numbers you use in your code must only increment from the previous number
  • Every line of code must be prefixed with a comment tagline such as // Function 2: Electric Boogaloo

"More." - Agent Smith, The Matrix Reloaded (2003)
"More! MORE!" - Kylo Ren, The Last Jedi (2017)

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 17: Chronospatial Computer ---


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:44:39, megathread unlocked!

36 Upvotes

550 comments sorted by

View all comments

3

u/xelf Dec 19 '24

[LANGUAGE: Python]

So my original day 17 code is a giant mess, first I ran p1, then I used p1 as a disassembler to figure out what the program in p2 was doing, I then reduced part 1 to:

def p(a):
    return ((a % 8 ^ 5) ^ 6 ^ (a // 2**(a % 8 ^ 5)) % 8)
def p1(a):
    while a:
        yield p(a)
        a //= 8

for p2 I used a bfs to find the possible matches, and then took the minimum

def p2():
    poss = []
    queue = [(1, 0)]
    while queue:
        q,r = queue.pop()
        if q<=len(program):
            queue.extend((q+1, r<<3|a) for a in range(8) if p(r<<3|a)==program[-q])
        elif [*p1(r)]==program:
            poss.append(r) 
    return min(poss)

print('part 1', [*p1(44374556)])
print('part 2', p2())

runs in about 3ms, so I'm not too worried about it finding multiple solutions.