Day06, Restructure and poetry
This commit is contained in:
parent
418a537df6
commit
90824af45c
8 changed files with 102 additions and 11 deletions
|
@ -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:
|
||||
days = [
|
||||
import_module(file.stem)
|
||||
for file in Path(".").iterdir()
|
||||
import_module(f".{file.stem}", package="aoc")
|
||||
for file in Path("aoc").iterdir()
|
||||
if file.name.endswith(".py") and file.name.startswith("day")
|
||||
]
|
||||
for day in days:
|
|
@ -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:
|
||||
Aoc2.__init__(self, 2023, 1)
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
from __future__ import annotations
|
||||
from dataclasses import dataclass
|
||||
|
||||
from aoc import Aoc2, AocParseLinesSameParser
|
||||
from .aoc import Aoc2, AocParseLinesSameParser
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
|
@ -2,7 +2,7 @@ from collections import defaultdict
|
|||
from dataclasses import dataclass
|
||||
from functools import reduce
|
||||
from typing import Any, Optional
|
||||
from aoc import Aoc2, AocSameParser
|
||||
from .aoc import Aoc2, AocSameParser
|
||||
|
||||
|
||||
@dataclass
|
|
@ -2,7 +2,7 @@ from __future__ import annotations
|
|||
from dataclasses import dataclass
|
||||
import regex
|
||||
|
||||
from aoc import Aoc2, AocParseLinesSameParser
|
||||
from .aoc import Aoc2, AocParseLinesSameParser
|
||||
|
||||
|
||||
@dataclass
|
||||
|
@ -41,9 +41,7 @@ class Day04(AocParseLinesSameParser[Card], Aoc2[list[Card], list[Card]]):
|
|||
def part2(self, cards: list[Card]) -> int:
|
||||
d = [0] * len(cards)
|
||||
for card in reversed(cards):
|
||||
d[card.card_id - 1] = 1 + sum(
|
||||
d[card.card_id + i] for i in range(card.wins)
|
||||
)
|
||||
d[card.card_id - 1] = 1 + sum(d[card.card_id + i] for i in range(card.wins))
|
||||
return sum(d)
|
||||
|
||||
|
|
@ -6,7 +6,7 @@ from typing import Optional
|
|||
|
||||
import regex as re
|
||||
|
||||
from aoc import Aoc2, AocSameParser
|
||||
from .aoc import Aoc2, AocSameParser
|
||||
|
||||
|
||||
class Map:
|
56
aoc/day06.py
Normal file
56
aoc/day06.py
Normal 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
22
pyproject.toml
Normal 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"
|
Loading…
Add table
Reference in a new issue