Day 15
This commit is contained in:
parent
3688946a24
commit
c384d04223
1 changed files with 70 additions and 0 deletions
70
aoc/day15.py
Normal file
70
aoc/day15.py
Normal file
|
@ -0,0 +1,70 @@
|
|||
from __future__ import annotations
|
||||
from typing import Optional, TypeAlias
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
from .aoc import Aoc2
|
||||
|
||||
P1: TypeAlias = list[str]
|
||||
P2: TypeAlias = list[tuple[str, Optional[int]]]
|
||||
|
||||
|
||||
class Day15(Aoc2[P1, P2]):
|
||||
def parseinput1(self, inpt: str) -> P1:
|
||||
inpt = "".join(inpt.splitlines())
|
||||
return inpt.split(",")
|
||||
|
||||
def parseinput2(self, inpt: str) -> P2:
|
||||
inpt = "".join(inpt.splitlines())
|
||||
|
||||
output = []
|
||||
for word in inpt.split(","):
|
||||
if "-" in word:
|
||||
output.append((word[:-1], None))
|
||||
else:
|
||||
name, boxnr = word.split("=")
|
||||
output.append((name, int(boxnr)))
|
||||
return output
|
||||
|
||||
@staticmethod
|
||||
def hash(string: str) -> int:
|
||||
waccum = 0
|
||||
for char in string:
|
||||
waccum += ord(char)
|
||||
waccum *= 17
|
||||
waccum = waccum % 256
|
||||
return waccum
|
||||
|
||||
def part1(self, inpt: P1) -> int:
|
||||
accum = 0
|
||||
for word in inpt:
|
||||
accum += self.hash(word)
|
||||
return accum
|
||||
|
||||
def part2(self, inpt: P2) -> int:
|
||||
boxes = {}
|
||||
for name, op in inpt:
|
||||
boxnr = self.hash(name)
|
||||
if boxnr not in boxes:
|
||||
boxes[boxnr] = {}
|
||||
if op is None:
|
||||
if name in boxes[boxnr]:
|
||||
del boxes[boxnr][name]
|
||||
else:
|
||||
boxes[boxnr][name] = op
|
||||
|
||||
accum = 0
|
||||
for nr, box in boxes.items():
|
||||
for pos, (label, lens) in enumerate(box.items()):
|
||||
fp = (1 + nr) * (1 + pos) * lens
|
||||
accum += fp
|
||||
|
||||
return accum
|
||||
|
||||
|
||||
def main() -> None:
|
||||
aoc = Day15(2023, 15, example_code_nr2=0)
|
||||
aoc.run()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Add table
Reference in a new issue