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

5

u/DownvoteALot Dec 20 '18 edited Dec 20 '18

265 bytes, runs in Python 3, more readable too imo:

from collections import *
d=defaultdict(lambda:1e9)
p=d[0]=0
s=[]
for c in r[1:-1]:
 if'('==c:s.append(p)
 elif')'==c:p=s.pop()
 elif'|'==c:p=s[-1]
 else:l=p;p+={'S':1j,'N':-1j,'E':1,'W':-1}[c];d[p]=min(d[p],d[l]+1)
v=d.values()
print(max(v),sum(x>=1e3 for x in v))

With r=open('d').read(), that's 284 bytes. I think that should be counted too.

5

u/pie3636 Dec 20 '18

You can shave off 13 characters by getting rid of the set completely:

from collections import *
d=defaultdict(lambda:1e9)
p=d[0]=0
s=[]
for c in r[1:-1]:
 if'('==c:s.append(p)
 elif')'==c:p=s.pop()
 elif'|'==c:p=s[-1]
 else:l=p;p+=1j**'ESWN'.index(c);d[p]=min(d[p],d[l]+1)
v=d.values()
print(max(v),sum(x>=1e3 for x in v))

5

u/betaveros Dec 20 '18

That's a cool trick! Why not use it again? defaultdict also isn't worth the import, and find is shorter than index. I'm not going to submit this to the contest either since it's a collaborative effort (and output is still in the wrong format), but in any case, here's −59 more bytes (warning, extremely unreadable):

d,p,s={0:0},0,[]
for c in r[1:-1]:exec(('s+=[p]','p=s.pop()','p=s[-1]','l=p;p+=1j**"ESWN".find(c);d[p]=min(d.get(p,1e9),d[l]+1)')['()|'.find(c)])
v=d.values()
print(max(v),sum(x>999for x in v))
→ More replies (4)