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:
|
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:
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
|
@ -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
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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
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