from functools import reduce from typing import Any, Iterator from ..base import BaseSolver def _hash(s: str) -> int: return reduce(lambda v, u: ((v + ord(u)) * 17) % 256, s, 0) class Solver(BaseSolver): def solve(self, input: str) -> Iterator[Any]: steps = input.split(",") # part 1 yield sum(map(_hash, steps)) # part 2 boxes: list[dict[str, int]] = [{} for _ in range(256)] for step in steps: if (i := step.find("=")) >= 0: label, length = step[:i], int(step[i + 1 :]) boxes[_hash(label)][label] = length else: label = step[:-1] boxes[_hash(label)].pop(label, None) yield sum( i_box * i_lens * length for i_box, box in enumerate(boxes, start=1) for i_lens, length in enumerate(box.values(), start=1) )