| import itertools | |||||
| import sys | |||||
| from intcode import compute | |||||
| ''' | |||||
| . . . . . . . . . . . . . . . . . . | |||||
| . . . . . . . . . . . . . . . . . . | |||||
| . . . . . . . . . . . . . . . . . . | |||||
| . . . . . . . # . . . . . . . . . . | |||||
| | | |||||
| . . . . . . @-@-#-# . . . . . . . . | |||||
| | | |||||
| . . . . . . . . C . . . . . . . . . | |||||
| | | |||||
| . . . . . . . @ @-@ . . . . . . . . | |||||
| | | | | |||||
| . . . . . . #-#-# #w@w@ . . . . . . | |||||
| | | | |||||
| . . . . . . . . Pn@e# # . . . . . . | |||||
| e | |||||
| . . . . . . . . . . . . . . . . . . | |||||
| . . . . . . . . . . . . . . . . . . | |||||
| ''' | |||||
| text = sys.stdin.read() | |||||
| code = ''' | |||||
| north | |||||
| west | |||||
| take mug | |||||
| west | |||||
| take easter egg | |||||
| east | |||||
| east | |||||
| south | |||||
| south | |||||
| take asterisk | |||||
| south | |||||
| west | |||||
| north | |||||
| take jam | |||||
| south | |||||
| east | |||||
| north | |||||
| east | |||||
| take klein bottle | |||||
| south | |||||
| west | |||||
| take tambourine | |||||
| west | |||||
| take cake | |||||
| east | |||||
| south | |||||
| east | |||||
| take polygon | |||||
| north | |||||
| ''' | |||||
| bytes_ = list(code.lstrip().encode()) | |||||
| items = {line for line in code.splitlines() if line.startswith('take')} | |||||
| combos = itertools.combinations(sorted(items), 4) | |||||
| last_line = '' | |||||
| history = '' | |||||
| for c in map(chr, compute(text, iter(bytes_))): | |||||
| history += c | |||||
| if history.endswith('== Security Checkpoint =='): | |||||
| take = next(combos) | |||||
| drop = items.difference(take) | |||||
| instructions = '\n'.join( | |||||
| [line for line in take] + | |||||
| [line.replace('take', 'drop') for line in drop] + | |||||
| ['east\n'] | |||||
| ) | |||||
| bytes_.extend(instructions.encode()) | |||||
| print(history.splitlines()[-1]) |