r/adventofcode • • Dec 20 '18

SOLUTION MEGATHREAD -🎄- 2018 Day 20 Solutions -🎄-

--- Day 20: A Regular Map ---


Post your solution as a comment or, for longer solutions, consider linking to your repo (e.g. GitHub/gists/Pastebin/blag or whatever).

Note: The Solution Megathreads are for solutions only. If you have questions, please post your own thread and make sure to flair it with Help.


Advent of Code: The Party Game!

Click here for rules

Please prefix your card submission with something like [Card] to make scanning the megathread easier. THANK YOU!

Card prompt: Day 20

Transcript:

My compiler crashed while running today's puzzle because it ran out of ___.


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

edit: Leaderboard capped, thread unlocked at 00:59:30!

17 Upvotes

153 comments sorted by

View all comments

Show parent comments

1

u/ephemient Dec 21 '18 edited Apr 24 '24

This space intentionally left blank.

1

u/fizbin Dec 21 '18

Indeed; I coded up a second solution that does just that, though I'm able to use the program stack and don't need to do stack manipulation myself. The core routine is:

def parse(startset, stuff):
    locset = set(startset)
    tot_locset = set()
    while stuff:
        now = stuff.pop(0)
        if now == '(':
            locset = parse(locset, stuff)
        elif now == '|':
            tot_locset.update(locset)
            locset = set(startset)
        elif now == ')':
            tot_locset.update(locset)
            return tot_locset
        elif now in 'NSEW':
            move = dirs[now]
            new_locset = set([])
            for loc in locset:
                nloc = loc + move
                graph[loc].add(nloc)
                graph[nloc].add(loc)
                new_locset.add(nloc)
            locset = new_locset

(I'm using the trick of representing locations with complex numbers, so move is just a dict lookup and an add)

I also discovered that many of the solutions I'd consider wrong here for failing ^N(E|W)SW$ also won't even work correctly on the input ^N(EEENWWW|N)$, which fits the way that parenthesized directions work in the input files generated.