#!/usr/bin/env python3 # import numpy as np from functools import reduce from re import findall from copy import deepcopy import sys # filename = "in/day10.ref" filename = "in/day10.pzl" data = open(filename).read() lines = [line for line in data.rstrip('\n').split('\n')] res1 = 0 x = 1 cycles = 1 for line in lines: opcodes = line.split(' ') if opcodes[0] == 'addx': if cycles == 19 or (cycles+20) % 40 == 39: a = (cycles+1) * x res1 += a elif cycles == 20 or (cycles+20) % 40 == 0: a = cycles * x res1 += a x += int(opcodes[1]) cycles += 2 elif opcodes[0] == 'noop': if cycles == 20 or (cycles+20) % 40 == 0: a = cycles * x res1 += a cycles += 1 res2 = 'read it' crt = [0 for _ in range(40*6)] x = 1 cycles = 1 def print_crt(crt): for i,val in enumerate(crt): print('.' if val == 0 else '#', end='') if (i+1) % 40 == 0: print() print() def sprite(crt, cycles, x): s = [1 if abs(x-i) % 40 in [39, 0, 1] else 0 for i in range(40*6)] c = [1 if abs(cycles-i-1) % (40*6) == 0 else 0 for i in range(40*6)] m = list(map(lambda x: x[0]*x[1], zip(c,s))) crt = list(map(lambda x: x[0]+x[1], zip(crt,m))) return crt for line in lines: opcodes = line.split(' ') if opcodes[0] == 'addx': crt = sprite(crt, cycles+0, x) crt = sprite(crt, cycles+1, x) x += int(opcodes[1]) cycles += 2 elif opcodes[0] == 'noop': crt = sprite(crt, cycles+0, x) a = cycles * x cycles += 1 # print(cycles, x) print_crt(crt) print('res1:', res1) print('res2:', res2)