2022-10 py

Signed-off-by: AKP <tom@tdpain.net>
This commit is contained in:
akp 2022-12-10 23:19:04 +00:00
parent 4b9273b751
commit 026d502ad5
No known key found for this signature in database
GPG key ID: AA5726202C8879B7
4 changed files with 122 additions and 0 deletions

View file

@ -0,0 +1 @@
# [Day 10: Cathode Ray Tube](https://adventofcode.com/2022/day/10)

View file

@ -0,0 +1,17 @@
{
"inputFile": "input.txt",
"testCases": {
"one": [
{
"input": "addx 15\naddx -11\naddx 6\naddx -3\naddx 5\naddx -1\naddx -8\naddx 13\naddx 4\nnoop\naddx -1\naddx 5\naddx -1\naddx 5\naddx -1\naddx 5\naddx -1\naddx 5\naddx -1\naddx -35\naddx 1\naddx 24\naddx -19\naddx 1\naddx 16\naddx -11\nnoop\nnoop\naddx 21\naddx -15\nnoop\nnoop\naddx -3\naddx 9\naddx 1\naddx -3\naddx 8\naddx 1\naddx 5\nnoop\nnoop\nnoop\nnoop\nnoop\naddx -36\nnoop\naddx 1\naddx 7\nnoop\nnoop\nnoop\naddx 2\naddx 6\nnoop\nnoop\nnoop\nnoop\nnoop\naddx 1\nnoop\nnoop\naddx 7\naddx 1\nnoop\naddx -13\naddx 13\naddx 7\nnoop\naddx 1\naddx -33\nnoop\nnoop\nnoop\naddx 2\nnoop\nnoop\nnoop\naddx 8\nnoop\naddx -1\naddx 2\naddx 1\nnoop\naddx 17\naddx -9\naddx 1\naddx 1\naddx -3\naddx 11\nnoop\nnoop\naddx 1\nnoop\naddx 1\nnoop\nnoop\naddx -13\naddx -19\naddx 1\naddx 3\naddx 26\naddx -30\naddx 12\naddx -1\naddx 3\naddx 1\nnoop\nnoop\nnoop\naddx -9\naddx 18\naddx 1\naddx 2\nnoop\nnoop\naddx 9\nnoop\nnoop\nnoop\naddx -1\naddx 2\naddx -37\naddx 1\naddx 3\nnoop\naddx 15\naddx -21\naddx 22\naddx -6\naddx 1\nnoop\naddx 2\naddx 1\nnoop\naddx -10\nnoop\nnoop\naddx 20\naddx 1\naddx 2\naddx 2\naddx -6\naddx -11\nnoop\nnoop\nnoop\n",
"expected": "13140"
}
],
"two": [
{
"input": "addx 15\naddx -11\naddx 6\naddx -3\naddx 5\naddx -1\naddx -8\naddx 13\naddx 4\nnoop\naddx -1\naddx 5\naddx -1\naddx 5\naddx -1\naddx 5\naddx -1\naddx 5\naddx -1\naddx -35\naddx 1\naddx 24\naddx -19\naddx 1\naddx 16\naddx -11\nnoop\nnoop\naddx 21\naddx -15\nnoop\nnoop\naddx -3\naddx 9\naddx 1\naddx -3\naddx 8\naddx 1\naddx 5\nnoop\nnoop\nnoop\nnoop\nnoop\naddx -36\nnoop\naddx 1\naddx 7\nnoop\nnoop\nnoop\naddx 2\naddx 6\nnoop\nnoop\nnoop\nnoop\nnoop\naddx 1\nnoop\nnoop\naddx 7\naddx 1\nnoop\naddx -13\naddx 13\naddx 7\nnoop\naddx 1\naddx -33\nnoop\nnoop\nnoop\naddx 2\nnoop\nnoop\nnoop\naddx 8\nnoop\naddx -1\naddx 2\naddx 1\nnoop\naddx 17\naddx -9\naddx 1\naddx 1\naddx -3\naddx 11\nnoop\nnoop\naddx 1\nnoop\naddx 1\nnoop\nnoop\naddx -13\naddx -19\naddx 1\naddx 3\naddx 26\naddx -30\naddx 12\naddx -1\naddx 3\naddx 1\nnoop\nnoop\nnoop\naddx -9\naddx 18\naddx 1\naddx 2\nnoop\nnoop\naddx 9\nnoop\nnoop\nnoop\naddx -1\naddx 2\naddx -37\naddx 1\naddx 3\nnoop\naddx 15\naddx -21\naddx 22\naddx -6\naddx 1\nnoop\naddx 2\naddx 1\nnoop\naddx -10\nnoop\nnoop\naddx 20\naddx 1\naddx 2\naddx 2\naddx -6\naddx -11\nnoop\nnoop\nnoop\n",
"expected": ""
}
]
}
}

View file

@ -0,0 +1,103 @@
from typing import *
from aocpy import BaseChallenge
Instruction = Tuple[str, Optional[int]]
def parse(instr: str) -> List[Instruction]:
res: List[Instruction] = []
for line in instr.strip().splitlines():
parts = line.split(" ")
if len(parts) == 1:
res.append((parts[0], None))
elif len(parts) == 2:
res.append((parts[0], int(parts[1])))
else:
raise ValueError(f"unexpected instruction length {len(parts)} for {line=}")
return res
class MachineOne:
ticks: int
acc: int
vals: List[int]
def __init__(self):
self.ticks = 0
self.acc = 1
self.vals = []
def tick(self):
self.ticks += 1
def check_acc(self):
tm = self.ticks % 40
if tm == 20:
self.vals.append(self.ticks * self.acc)
def execute(self, ins: Instruction):
(opcode, operand) = ins
if opcode == "noop":
self.tick()
self.check_acc()
elif opcode == "addx":
self.tick()
self.check_acc()
self.tick()
self.check_acc()
self.acc += operand
class MachineTwo(MachineOne):
output: str
def __init__(self):
super().__init__()
self.output = ""
def check_acc(self):
tm = self.ticks % 40
if tm == 0:
self.output += "\n"
if tm == 20:
self.vals.append(self.ticks * self.acc)
if self.acc - 1 <= tm <= self.acc + 1:
self.output += ""
else:
self.output += " "
def execute(self, ins: Instruction):
(opcode, operand) = ins
if opcode == "noop":
self.check_acc()
self.tick()
elif opcode == "addx":
self.check_acc()
self.tick()
self.check_acc()
self.tick()
self.acc += operand
class Challenge(BaseChallenge):
@staticmethod
def one(instr: str) -> int:
inp = parse(instr)
machine = MachineOne()
for ins in inp:
machine.execute(ins)
return sum(machine.vals)
@staticmethod
def two(instr: str):
inp = parse(instr)
machine = MachineTwo()
for ins in inp:
machine.execute(ins)
return "\n" + machine.output.strip()

View file

@ -23,4 +23,5 @@ Solutions to the [2022 Advent of Code](https://adventofcode.com/2022).
| 07 - No Space Left On Device | ★ ★ | [Python](07-noSpaceLeftOnDevice/py) | Turns out that fake file systems are prone to very subtle and infuriating bugs. |
| 08 - Treetop Tree House | ★ ★ | [Python](08-treetopTreeHouse/py) | Magical coordinate dictionary tuple things do be magical. |
| 09 - Rope Bridge | ★ ★ | [Python](09-ropeBridge/py), [Nim](09-ropeBridge/nim) | Does this count as this year's first cellular automata? |
| 10 - Cathode-Ray Tube | ★ ★ | [Python](10-cathodeRayTube/py) | A nasty problem with a nasty solution and nasty outputs that mess with my framework. |