Added 2017/08
This commit is contained in:
parent
70aa64c63a
commit
c524009ad3
57
2017/08/8.md
Normal file
57
2017/08/8.md
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
## \-\-- Day 8: I Heard You Like Registers \-\--
|
||||||
|
|
||||||
|
You receive a signal
|
||||||
|
directly from the CPU. Because of your recent assistance with [jump
|
||||||
|
instructions](5), 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?
|
||||||
|
|
||||||
|
Your puzzle answer was `4066`.
|
||||||
|
|
||||||
|
## \-\-- Part Two \-\-- {#part2}
|
||||||
|
|
||||||
|
To be safe, the CPU also needs to know *the highest value held in any
|
||||||
|
register during this process* so that it can decide how much memory to
|
||||||
|
allocate to these operations. For example, in the above instructions,
|
||||||
|
the highest value ever held was `10` (in register `c` after the third
|
||||||
|
instruction was evaluated).
|
||||||
|
|
||||||
|
Your puzzle answer was `4829`.
|
||||||
|
|
||||||
|
Both parts of this puzzle are complete! They provide two gold stars:
|
||||||
|
\*\*
|
||||||
|
|
||||||
|
At this point, you should [return to your Advent calendar](/2017) and
|
||||||
|
try another puzzle.
|
||||||
|
|
||||||
|
If you still want to see it, you can [get your puzzle
|
||||||
|
input](8/input).
|
136
2017/08/solution.py
Normal file
136
2017/08/solution.py
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
#!/bin/python3
|
||||||
|
import sys,re
|
||||||
|
from pprint import pprint
|
||||||
|
|
||||||
|
input_f = 'input'
|
||||||
|
|
||||||
|
part = 2
|
||||||
|
#########################################
|
||||||
|
# #
|
||||||
|
# Part 1 #
|
||||||
|
# #
|
||||||
|
#########################################
|
||||||
|
|
||||||
|
if part == 1:
|
||||||
|
grid = []
|
||||||
|
values = {}
|
||||||
|
with open(input_f) as file:
|
||||||
|
for line in file:
|
||||||
|
grid.append(line.rstrip())
|
||||||
|
|
||||||
|
#pprint(grid)
|
||||||
|
|
||||||
|
|
||||||
|
pattern = r"(\w+)\s(inc|dec)\s(-?\d+)\sif\s(\w+)\s([<>=!]+)\s(-?\d+)"
|
||||||
|
|
||||||
|
# Process each instruction
|
||||||
|
for instruction in grid:
|
||||||
|
match = re.match(pattern, instruction)
|
||||||
|
if match:
|
||||||
|
input_var = match.group(1)
|
||||||
|
change = match.group(2)
|
||||||
|
value = int(match.group(3))
|
||||||
|
con1 = match.group(4)
|
||||||
|
con2 = match.group(5)
|
||||||
|
con3 = int(match.group(6))
|
||||||
|
|
||||||
|
#print(f"input = {input_var}, change = {change}, value = {value}, con1 = {con1}, con2 = {con2}, con3 = {con3}")
|
||||||
|
|
||||||
|
else:
|
||||||
|
print(instruction)
|
||||||
|
print('NO MATCH')
|
||||||
|
exit()
|
||||||
|
|
||||||
|
#print(f"input = {input_var}, change = {change}, value = {value}, con1 = {con1}, con2 = {con2}, con3 = {con3}")
|
||||||
|
|
||||||
|
if input_var not in values:
|
||||||
|
values[input_var] = 0
|
||||||
|
if con1 not in values:
|
||||||
|
values[con1] = 0
|
||||||
|
|
||||||
|
condition = f"{values[con1]} {con2} {con3}"
|
||||||
|
|
||||||
|
#print('calculation =======',condition)
|
||||||
|
|
||||||
|
if eval(condition):
|
||||||
|
if change == 'inc':
|
||||||
|
values[input_var] += value
|
||||||
|
if change == 'dec':
|
||||||
|
values[input_var] -= value
|
||||||
|
|
||||||
|
|
||||||
|
#pprint(values)
|
||||||
|
max_v = 0
|
||||||
|
for key, i in values.items():
|
||||||
|
if max_v < i:
|
||||||
|
max_v = i
|
||||||
|
print(max_v)
|
||||||
|
|
||||||
|
#########################################
|
||||||
|
# #
|
||||||
|
# Part 2 #
|
||||||
|
# #
|
||||||
|
#########################################
|
||||||
|
|
||||||
|
def find_max(x):
|
||||||
|
#print(x)
|
||||||
|
max_v = 0
|
||||||
|
for key, i in values.items():
|
||||||
|
if max_v < i:
|
||||||
|
max_v = i
|
||||||
|
return max_v
|
||||||
|
|
||||||
|
if part == 2:
|
||||||
|
grid = []
|
||||||
|
values = {}
|
||||||
|
total_max = 0
|
||||||
|
with open(input_f) as file:
|
||||||
|
for line in file:
|
||||||
|
grid.append(line.rstrip())
|
||||||
|
|
||||||
|
#pprint(grid)
|
||||||
|
|
||||||
|
|
||||||
|
pattern = r"(\w+)\s(inc|dec)\s(-?\d+)\sif\s(\w+)\s([<>=!]+)\s(-?\d+)"
|
||||||
|
# Process each instruction
|
||||||
|
for instruction in grid:
|
||||||
|
match = re.match(pattern, instruction)
|
||||||
|
if match:
|
||||||
|
input_var = match.group(1)
|
||||||
|
change = match.group(2)
|
||||||
|
value = int(match.group(3))
|
||||||
|
con1 = match.group(4)
|
||||||
|
con2 = match.group(5)
|
||||||
|
con3 = int(match.group(6))
|
||||||
|
|
||||||
|
#print(f"input = {input_var}, change = {change}, value = {value}, con1 = {con1}, con2 = {con2}, con3 = {con3}")
|
||||||
|
|
||||||
|
else:
|
||||||
|
print(instruction)
|
||||||
|
print('NO MATCH')
|
||||||
|
exit()
|
||||||
|
|
||||||
|
#print(f"input = {input_var}, change = {change}, value = {value}, con1 = {con1}, con2 = {con2}, con3 = {con3}")
|
||||||
|
|
||||||
|
if input_var not in values:
|
||||||
|
values[input_var] = 0
|
||||||
|
if con1 not in values:
|
||||||
|
values[con1] = 0
|
||||||
|
|
||||||
|
condition = f"{values[con1]} {con2} {con3}"
|
||||||
|
|
||||||
|
#print('calculation =======',condition)
|
||||||
|
|
||||||
|
if eval(condition):
|
||||||
|
if change == 'inc':
|
||||||
|
values[input_var] += value
|
||||||
|
if change == 'dec':
|
||||||
|
values[input_var] -= value
|
||||||
|
|
||||||
|
temp_max = find_max(values)
|
||||||
|
if total_max < temp_max:
|
||||||
|
total_max = temp_max
|
||||||
|
#print('New Max Found',total_max)
|
||||||
|
print(total_max)
|
||||||
|
#pprint(values)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user