From 7c5efb3b1ac62561ae4bc5bfac45530986109a12 Mon Sep 17 00:00:00 2001 From: Ted Cassirer Date: Wed, 3 Jan 2024 22:19:47 +0700 Subject: [PATCH] Day 11 and init day improvements --- aoc_cas/aoc2023/day11.py | 64 ++++++++++++++++++++++++++++++++++++++ aoc_cas/cli.py | 11 ++++++- tests/fixtures/2023/11.txt | 12 +++++++ 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 aoc_cas/aoc2023/day11.py create mode 100644 tests/fixtures/2023/11.txt diff --git a/aoc_cas/aoc2023/day11.py b/aoc_cas/aoc2023/day11.py new file mode 100644 index 0000000..960272e --- /dev/null +++ b/aoc_cas/aoc2023/day11.py @@ -0,0 +1,64 @@ +Coordinate = tuple[int, int] + + +def get_galaxy_coords(data: str) -> list[Coordinate]: + coords = [] + for y, row in enumerate(data.splitlines()): + for x, v in enumerate(row): + if v == "#": + coords.append((y, x)) + return coords + + +def calculate_expanded_distance(coords: list[Coordinate]) -> int: + distance = 0 + seen_galaxies = 0 + remaining_galaxies = len(coords) + by_y = sorted(c[0] for c in coords) + prev = 0 + for y in by_y: + if y - 1 > prev: + distance += (y - 1 - prev) * (seen_galaxies * remaining_galaxies) + seen_galaxies += 1 + remaining_galaxies -= 1 + prev = y + + seen_galaxies = 0 + remaining_galaxies = len(coords) + by_x = sorted(c[1] for c in coords) + prev = 0 + for x in by_x: + if x - 1 > prev: + distance += (x - 1 - prev) * (seen_galaxies * remaining_galaxies) + seen_galaxies += 1 + remaining_galaxies -= 1 + prev = x + + return distance + + +def total_distance(coords: list[Coordinate]) -> int: + total = 0 + for i, c1 in enumerate(coords): + for c2 in coords[i + 1 :]: + total += abs(c2[0] - c1[0]) + abs(c2[1] - c1[1]) + + return total + + +def part_a(data: str) -> int: + coords = get_galaxy_coords(data) + distance = total_distance(coords) + return distance + calculate_expanded_distance(coords) + + +def part_b(data: str, expansion: int = 1000000) -> int: + coords = get_galaxy_coords(data) + distance = total_distance(coords) + return distance + calculate_expanded_distance(coords) * (expansion - 1) + + +if __name__ == "__main__": + from aoc_cas.util import solve_with_examples + + solve_with_examples(year=2023, day=11) diff --git a/aoc_cas/cli.py b/aoc_cas/cli.py index 347e005..ab94e2e 100644 --- a/aoc_cas/cli.py +++ b/aoc_cas/cli.py @@ -45,4 +45,13 @@ def init_challenge(year: int, day: int) -> None: test_folder = Path.cwd() / f"tests/fixtures/{year}" test_folder.mkdir(exist_ok=True) - test_folder.joinpath(f"{day}.txt").touch() + + fixtures = [] + puzzle = Puzzle(year, day) + for example in puzzle.examples: + data = example.input_data + ans_a = example.answer_a if example.answer_a is not None else "-" + ans_b = example.answer_b if example.answer_b is not None else "-" + fixtures.append(f"{data}\n{ans_a}\n{ans_b}") + with open(test_folder.joinpath(f"{day}.txt"), "w") as fixture: + fixture.write("\n===\n".join(fixtures)) diff --git a/tests/fixtures/2023/11.txt b/tests/fixtures/2023/11.txt new file mode 100644 index 0000000..a795c43 --- /dev/null +++ b/tests/fixtures/2023/11.txt @@ -0,0 +1,12 @@ +...#...... +.......#.. +#......... +.......... +......#... +.#........ +.........# +.......... +.......#.. +#...#..... +374 +82000210 \ No newline at end of file