2022-10 py
Signed-off-by: AKP <tom@tdpain.net>
This commit is contained in:
parent
4b9273b751
commit
026d502ad5
4 changed files with 122 additions and 0 deletions
1
challenges/2022/10-cathodeRayTube/README.md
Normal file
1
challenges/2022/10-cathodeRayTube/README.md
Normal file
|
@ -0,0 +1 @@
|
|||
# [Day 10: Cathode Ray Tube](https://adventofcode.com/2022/day/10)
|
17
challenges/2022/10-cathodeRayTube/info.json
Normal file
17
challenges/2022/10-cathodeRayTube/info.json
Normal 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": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
103
challenges/2022/10-cathodeRayTube/py/__init__.py
Normal file
103
challenges/2022/10-cathodeRayTube/py/__init__.py
Normal 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()
|
|
@ -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. |
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue