|
- import re
- import sys
-
- from intcode import compute, parse
-
- from toolkit import read_image
-
-
- # part1
- text = sys.stdin.read()
- snapshot = ''.join(chr(val) for val in compute(text, 0))
- grid = read_image(snapshot)
- alignment_parameters = [
- (pos.real, pos.imag)
- for pos, val in grid.items()
- if {grid.get(pos + d) for d in [0, 1, -1, 1j, -1j]} == {'#'}
- ]
- print(int(sum(a * b for a, b in alignment_parameters)))
-
- # find path
- pos = {v: k for k, v in grid.items()}['^']
- ori = -1j
- path = []
- while {grid[pos + ori * rot] for rot in [1, 1j, -1j]} != {'.'}:
- if grid[pos + ori] == '#':
- pos += ori
- path[-1] += 1
- else:
- for c, rot in [('R', 1j), ('L', -1j)]:
- if grid[pos + ori * rot] == '#':
- ori *= rot
- path += [c, 0]
- full_path = ','.join(str(c) for c in path) + ','
-
- # compress
- regex = r'^(.{2,21})(?:\1)*(.{2,21})(?:\1|\2)*(.{2,21})(?:\1|\2|\3)*$'
- A, B, C = [group.strip(',') for group in re.match(regex, full_path).groups()]
- MAIN = full_path.replace(A, 'A').replace(B, 'B').replace(C, 'C').strip(',')
-
- # part2
- mem = parse(text)
- mem[0] += 1
- code = ('\n'.join([MAIN, A, B, C, 'n']) + '\n').encode()
- output = ''.join(chr(val) for val in compute(mem, iter(code)))
- print(ord(output[-1]))
|