forked from cdubz/advent-of-code-2017
-
Notifications
You must be signed in to change notification settings - Fork 0
/
registers.py
66 lines (50 loc) · 2.29 KB
/
registers.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
"""
--- Day 8: I Heard You Like Registers ---
You receive a signal directly from the CPU. Because of your recent assistance
with jump instructions, it would like you to compute the result of a series of
unusual register instructions.
Each instruction consists of several parts: the register to modify, whether to
increase or decrease that register's value, the amount by which to increase or
decrease it, and a condition. If the condition fails, skip the instruction
without modifying the register. The registers all start at 0. The instructions
look like this:
b inc 5 if a > 1
a inc 1 if b < 5
c dec -10 if a >= 1
c inc -20 if c == 10
These instructions would be processed as follows:
Because a starts at 0, it is not greater than 1, and so b is not modified.
a is increased by 1 (to 1) because b is less than 5 (it is 0).
c is decreased by -10 (to 10) because a is now greater than or equal to 1
(it is 1).
c is increased by -20 (to -10) because c is equal to 10.
After this process, the largest value in any register is 1.
You might also encounter <= (less than or equal to) or != (not equal to).
However, the CPU doesn't have the bandwidth to tell you what all the registers
are named, and leaves that to you to determine.
What is the largest value in any register after completing the instructions in
your puzzle input?
"""
import re
registers = {}
with open('input.txt') as f:
for line in f:
result = re.search('(?P<register>[a-z]+) (?P<op>inc|dec) (?P<amt>-?\d+) '
'if (?P<cond_register>[a-z]+) (?P<cond>.+) '
'(?P<cond_amt>-?\d+)', line.strip())
register = result.group('register')
op = result.group('op')
amt = int(result.group('amt'))
cond_register = result.group('cond_register')
cond = result.group('cond')
cond_amt = int(result.group('cond_amt'))
if register not in registers:
registers[register] = 0
if cond_register not in registers:
registers[cond_register] = 0
if eval('{} {} {}'.format(registers[cond_register], cond, cond_amt)):
if op == 'inc':
registers[register] += amt
elif op == 'dec':
registers[register] -= amt
print(registers[max(registers, key=registers.get)])