Day06, Restructure and poetry

This commit is contained in:
Christoph Stahl 2023-12-06 12:24:37 +01:00
parent 418a537df6
commit 90824af45c
8 changed files with 102 additions and 11 deletions

View file

@ -179,10 +179,21 @@ class AocParseLinesSameParser(Generic[T1], AocParseLines[T1, T1]):
... ...
def run_latest() -> None:
days = [
import_module(f".{file.stem}", package="aoc")
for file in Path("aoc").iterdir()
if file.name.endswith(".py") and file.name.startswith("day")
]
day = days[-1]
print(f"Running {day.__name__}")
day.main()
def main() -> None: def main() -> None:
days = [ days = [
import_module(file.stem) import_module(f".{file.stem}", package="aoc")
for file in Path(".").iterdir() for file in Path("aoc").iterdir()
if file.name.endswith(".py") and file.name.startswith("day") if file.name.endswith(".py") and file.name.startswith("day")
] ]
for day in days: for day in days:

View file

@ -1,7 +1,11 @@
from aoc import Aoc2, AocSameImplementation, AocParseLines from .aoc import Aoc2, AocSameImplementation, AocParseLines
class Day01(AocParseLines[str, str], AocSameImplementation[list[str]], Aoc2[list[str], list[str]]): class Day01(
AocParseLines[str, str],
AocSameImplementation[list[str]],
Aoc2[list[str], list[str]],
):
def __init__(self) -> None: def __init__(self) -> None:
Aoc2.__init__(self, 2023, 1) Aoc2.__init__(self, 2023, 1)

View file

@ -1,7 +1,7 @@
from __future__ import annotations from __future__ import annotations
from dataclasses import dataclass from dataclasses import dataclass
from aoc import Aoc2, AocParseLinesSameParser from .aoc import Aoc2, AocParseLinesSameParser
@dataclass(frozen=True) @dataclass(frozen=True)

View file

@ -2,7 +2,7 @@ from collections import defaultdict
from dataclasses import dataclass from dataclasses import dataclass
from functools import reduce from functools import reduce
from typing import Any, Optional from typing import Any, Optional
from aoc import Aoc2, AocSameParser from .aoc import Aoc2, AocSameParser
@dataclass @dataclass

View file

@ -2,7 +2,7 @@ from __future__ import annotations
from dataclasses import dataclass from dataclasses import dataclass
import regex import regex
from aoc import Aoc2, AocParseLinesSameParser from .aoc import Aoc2, AocParseLinesSameParser
@dataclass @dataclass
@ -41,9 +41,7 @@ class Day04(AocParseLinesSameParser[Card], Aoc2[list[Card], list[Card]]):
def part2(self, cards: list[Card]) -> int: def part2(self, cards: list[Card]) -> int:
d = [0] * len(cards) d = [0] * len(cards)
for card in reversed(cards): for card in reversed(cards):
d[card.card_id - 1] = 1 + sum( d[card.card_id - 1] = 1 + sum(d[card.card_id + i] for i in range(card.wins))
d[card.card_id + i] for i in range(card.wins)
)
return sum(d) return sum(d)

View file

@ -6,7 +6,7 @@ from typing import Optional
import regex as re import regex as re
from aoc import Aoc2, AocSameParser from .aoc import Aoc2, AocSameParser
class Map: class Map:

56
aoc/day06.py Normal file
View file

@ -0,0 +1,56 @@
from dataclasses import dataclass
from functools import reduce
import re
from .aoc import Aoc2, AocSameImplementation
@dataclass
class Race:
time: int
distance: int
class Day06(AocSameImplementation[list[Race]], Aoc2[list[Race], list[Race]]):
def simulate(self, timeaccel: int, timeoverall: int) -> int:
racetime = timeoverall - timeaccel
return racetime * timeaccel
def parseinput2(self, inpt: str) -> list[Race]:
lines = inpt.splitlines()
times = int("".join(re.findall(r"\d+", lines[0])))
distances = int("".join(re.findall(r"\d+", lines[1])))
return [Race(times, distances)]
def parseinput1(self, inpt: str) -> list[Race]:
lines = inpt.splitlines()
times = (int(d) for d in re.findall(r"\d+", lines[0]))
distances = (int(d) for d in re.findall(r"\d+", lines[1]))
return [Race(*t) for t in zip(times, distances)]
def part(self, inpt: list[Race]) -> int:
return reduce(
lambda x, y: x * y,
[
len(
[
poss
for poss in range(race.time)
if self.simulate(poss, race.time) > race.distance
]
)
for race in inpt
],
)
def main() -> None:
day06 = Day06(2023, 6)
day06.run()
if __name__ == "__main__":
main()

22
pyproject.toml Normal file
View file

@ -0,0 +1,22 @@
[tool.poetry]
name = "aoc2023"
version = "0.1.0"
description = "Advent of Code 2023"
authors = ["Christoph Stahl <christoph.stahl@tu-dortmund.de>"]
readme = "README.md"
packages = [{include = "aoc"}]
[tool.poetry.dependencies]
python = "^3.10"
regex = "^2023.10.3"
types-regex = "^2023.10.3.0"
mypy = "^1.7.1"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
[tool.poetry.scripts]
aoc = "aoc.aoc:main"
latest = "aoc.aoc:run_latest"