# -*- coding: utf-8 -*- from abc import ABC from functools import lru_cache from typing import Iterator, List, Dict, Any from aoc import BaseAssignment class Assignment(BaseAssignment, ABC): def __init__(self, path): super().__init__(path) self.x_history = {1: 1} def parse_instructions(self, instructions: Iterator[str]) -> Iterator[int]: x = 1 for instruction in instructions: instruction, *args = instruction.split(" ") yield x if instruction != "noop": yield x x += int(*args) class AssignmentOne(Assignment): example_result = 13140 def run(self, input: Iterator) -> int: return sum( [ cycle * x for cycle, x in enumerate(self.parse_instructions(input), start=1) if cycle in {20, 60, 100, 140, 180, 220} ] ) class AssignmentTwo(Assignment): example_result = ( "██ ██ ██ ██ ██ ██ ██ ██ ██ ██ \n" "███ ███ ███ ███ ███ ███ ███ \n" "████ ████ ████ ████ ████ \n" "█████ █████ █████ █████ \n" "██████ ██████ ██████ ████\n" "███████ ███████ ███████ " ) def render_pixel(self, row: int, col: int, instructions: List[str]): cycle = row * 40 + col x_register = self.x_after(cycle, instructions) if col in [x_register - 1, x_register, x_register + 1]: return "#" return "." def run(self, input: Iterator) -> str: rows = [] row = [] for cycle, x in enumerate(self.parse_instructions(instructions=input), start=1): col = (cycle - 1) % 40 row.append("█" if col in {x - 1, x, x + 1} else " ") if cycle % 40 == 0: rows.append(row) row = [] return "\n".join("".join(row) for row in rows)