217 lines
2.2 KiB
Python
217 lines
2.2 KiB
Python
with open("10.txt") as f:
|
|
data = f.read()
|
|
|
|
ex_data = """noop
|
|
addx 3
|
|
addx -5"""
|
|
|
|
ex2_data = """addx 15
|
|
addx -11
|
|
addx 6
|
|
addx -3
|
|
addx 5
|
|
addx -1
|
|
addx -8
|
|
addx 13
|
|
addx 4
|
|
noop
|
|
addx -1
|
|
addx 5
|
|
addx -1
|
|
addx 5
|
|
addx -1
|
|
addx 5
|
|
addx -1
|
|
addx 5
|
|
addx -1
|
|
addx -35
|
|
addx 1
|
|
addx 24
|
|
addx -19
|
|
addx 1
|
|
addx 16
|
|
addx -11
|
|
noop
|
|
noop
|
|
addx 21
|
|
addx -15
|
|
noop
|
|
noop
|
|
addx -3
|
|
addx 9
|
|
addx 1
|
|
addx -3
|
|
addx 8
|
|
addx 1
|
|
addx 5
|
|
noop
|
|
noop
|
|
noop
|
|
noop
|
|
noop
|
|
addx -36
|
|
noop
|
|
addx 1
|
|
addx 7
|
|
noop
|
|
noop
|
|
noop
|
|
addx 2
|
|
addx 6
|
|
noop
|
|
noop
|
|
noop
|
|
noop
|
|
noop
|
|
addx 1
|
|
noop
|
|
noop
|
|
addx 7
|
|
addx 1
|
|
noop
|
|
addx -13
|
|
addx 13
|
|
addx 7
|
|
noop
|
|
addx 1
|
|
addx -33
|
|
noop
|
|
noop
|
|
noop
|
|
addx 2
|
|
noop
|
|
noop
|
|
noop
|
|
addx 8
|
|
noop
|
|
addx -1
|
|
addx 2
|
|
addx 1
|
|
noop
|
|
addx 17
|
|
addx -9
|
|
addx 1
|
|
addx 1
|
|
addx -3
|
|
addx 11
|
|
noop
|
|
noop
|
|
addx 1
|
|
noop
|
|
addx 1
|
|
noop
|
|
noop
|
|
addx -13
|
|
addx -19
|
|
addx 1
|
|
addx 3
|
|
addx 26
|
|
addx -30
|
|
addx 12
|
|
addx -1
|
|
addx 3
|
|
addx 1
|
|
noop
|
|
noop
|
|
noop
|
|
addx -9
|
|
addx 18
|
|
addx 1
|
|
addx 2
|
|
noop
|
|
noop
|
|
addx 9
|
|
noop
|
|
noop
|
|
noop
|
|
addx -1
|
|
addx 2
|
|
addx -37
|
|
addx 1
|
|
addx 3
|
|
noop
|
|
addx 15
|
|
addx -21
|
|
addx 22
|
|
addx -6
|
|
addx 1
|
|
noop
|
|
addx 2
|
|
addx 1
|
|
noop
|
|
addx -10
|
|
noop
|
|
noop
|
|
addx 20
|
|
addx 1
|
|
addx 2
|
|
addx 2
|
|
addx -6
|
|
addx -11
|
|
noop
|
|
noop
|
|
noop"""
|
|
|
|
def solve1(data):
|
|
cycle = 1
|
|
cycle_val = dict()
|
|
reg = 1
|
|
|
|
for line in data.splitlines():
|
|
parts = line.strip().split(" ")
|
|
if parts[0] == "noop":
|
|
cycle_val[cycle] = cycle * reg
|
|
cycle += 1
|
|
elif parts[0] == "addx":
|
|
cycle_val[cycle] = cycle * reg
|
|
cycle_val[cycle + 1] = (cycle + 1) * reg
|
|
cycle += 2
|
|
dx = int(parts[1])
|
|
reg += dx
|
|
|
|
s = 0
|
|
want = [20, 60, 100, 140, 180, 220]
|
|
for id in want:
|
|
s += cycle_val[id]
|
|
print(s)
|
|
|
|
def solve2(data):
|
|
cycle = 1
|
|
reg = 1
|
|
|
|
crt = dict()
|
|
for x in range(40):
|
|
for y in range(6):
|
|
crt[x, y] = "."
|
|
|
|
def topos(n): return (n % 40, n // 40)
|
|
|
|
def draw():
|
|
px = cycle - 1
|
|
if (px % 40) in [reg - 1, reg, reg + 1]:
|
|
pos = topos(px)
|
|
crt[pos] = "#"
|
|
|
|
for line in data.splitlines():
|
|
parts = line.strip().split(" ")
|
|
if parts[0] == "noop":
|
|
draw()
|
|
cycle += 1
|
|
elif parts[0] == "addx":
|
|
draw()
|
|
cycle += 1
|
|
draw()
|
|
cycle += 1
|
|
dx = int(parts[1])
|
|
reg += dx
|
|
|
|
for y in range(6):
|
|
for x in range(40):
|
|
print(crt[x, y], end="")
|
|
print()
|
|
|
|
solve1(ex2_data)
|
|
solve1(data)
|
|
|
|
solve2(ex2_data)
|
|
solve2(data)
|