Skip to content

Commit 8d870cc

Browse files
authored
AoC 2024 01
Signed-off-by: GitHub <[email protected]>
1 parent a8bdc82 commit 8d870cc

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from collections import Counter
2+
from pathlib import Path
3+
4+
5+
def parse_input(text: str) -> tuple[list[int], list[int]]:
6+
rows = text.strip().split("\n")
7+
8+
left = []
9+
right = []
10+
for row in rows:
11+
left_str, right_str = row.split()
12+
left.append(int(left_str))
13+
right.append(int(right_str))
14+
left.sort()
15+
right.sort()
16+
return left, right
17+
18+
19+
def part1(left: list[int], right: list[int]) -> int:
20+
return sum(abs(left[index] - right[index]) for index in range(len(left)))
21+
22+
23+
def part2(left: list[int], right: list[int]) -> int:
24+
right_counter = Counter(right)
25+
return sum(left_number * right_counter[left_number] for left_number in left)
26+
27+
28+
if __name__ == "__main__":
29+
rows = Path("../input.txt").read_text(encoding="locale")
30+
print(part1(*parse_input(rows)))
31+
print(part2(*parse_input(rows)))
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import pytest
2+
from aoc_2024_01 import parse_input, part1, part2
3+
4+
TEST_INPUT = """
5+
3 4
6+
4 3
7+
2 5
8+
1 3
9+
3 9
10+
3 3
11+
"""
12+
13+
def test_parse_input() -> None:
14+
assert parse_input(TEST_INPUT) == ([1, 2, 3, 3, 3, 4], [3, 3, 3, 4, 5, 9])
15+
16+
def test_part1() -> None:
17+
assert part1(*parse_input(TEST_INPUT)) == 11
18+
19+
def test_part2() -> None:
20+
assert part2(*parse_input(TEST_INPUT)) == 31

0 commit comments

Comments
 (0)