import shared from anim import Animate import matrix cycles = { "noop": 1, "addx": 2, } def part1(x): X = 1 cycle_count = 0 signal_strength = [] for step, instruction in enumerate(x): val = None if instruction.startswith("addx"): opcode, val = instruction.split(" ") val = int(val) else: opcode = instruction for x in range(cycles[opcode]): cycle_count += 1 if cycle_count == 20 or ((cycle_count - 20) % 40 == 0): signal_strength.append(cycle_count * X) if opcode == "addx": X += val print(sum(signal_strength)) def part2(x): def cycle_to_xy(cycle): x = cycle % 40 y = cycle // 40 return x, y screen = matrix.matrix_of_size(40, 6) X = 1 cycle_count = 0 for step, instruction in enumerate(x): val = None if instruction.startswith("addx"): opcode, val = instruction.split(" ") val = int(val) else: opcode = instruction for x in range(cycles[opcode]): _x, y = cycle_to_xy(cycle_count) criteria = (X - 1, X, X + 1) cycle_count += 1 if _x in criteria: screen[y][_x] = 1 if opcode == "addx": X += val matrix.ppmx(screen, pad=False, space=False) anim = Animate(screen, day="10") anim.add_frame(screen) print("wrote gif-10/day10.gif") def main(): rows = [row for row in shared.load(10)] part1(rows) print("%" * 40) part2(rows) if __name__ == "__main__": main()