day 1 - part 2

This commit is contained in:
Stanislas Jouffroy 2024-12-02 16:16:06 +01:00
parent b844fafd78
commit 5f492b3f66
6 changed files with 99 additions and 22 deletions

16
2024/day1/common.py Normal file
View file

@ -0,0 +1,16 @@
from pathlib import Path
def get_lists(data_file: Path) -> tuple[list[int], list[int]]:
list1 = []
list2 = []
for line in data_file.open():
numbers = line.strip().split(" ")
list1.append(int(numbers[0]))
list2.append(int(numbers[1]))
return list1, list2
def get_ordered_lists(data_file: Path) -> tuple[list[int], list[int]]:
list1, list2 = get_lists(data_file)
return sorted(list1), sorted(list2)

View file

@ -1,25 +1,19 @@
from pathlib import Path from pathlib import Path
from day1.common import get_ordered_lists
def get_ordered_lists(data_file: Path) -> tuple[list[int], list[int]]:
list1 = list()
list2 = list()
for line in data_file.open():
numbers = line.strip().split(" ")
list1.append(int(numbers[0]))
list2.append(int(numbers[1]))
return sorted(list1), sorted(list2)
def compute_distance(list1, list2) -> int: def compute_distance(list1, list2) -> int:
return sum([abs(item2 - item1) for item1, item2 in zip(list1, list2)]) return sum([abs(item2 - item1) for item1, item2 in zip(list1, list2)])
def main(): def main(data_file: Path):
file = Path(__file__).parent / "input-data" list1, list2 = get_ordered_lists(data_file)
list1, list2 = get_ordered_lists(file) distance = compute_distance(list1, list2)
print(compute_distance(list1, list2)) print(distance)
return distance
if __name__ == "__main__": if __name__ == "__main__":
main() file = Path(__file__).parent / "input-data"
main(file)

38
2024/day1/part2.py Normal file
View file

@ -0,0 +1,38 @@
from pathlib import Path
from day1.common import get_ordered_lists
def get_elem_amount(data: list[int]) -> dict[int, int]:
data_set = set(data)
amount = {}
for element in data_set:
nb_elem = data.count(element)
data.remove(element)
amount[element] = nb_elem
return amount
def compute_similarity_score(
elem_amount1: dict[int, int], elem_amount2: dict[int, int]
) -> int:
score = 0
for k1, v1 in elem_amount1.items():
if k1 in elem_amount2.keys():
score += k1 * v1 * elem_amount2[k1]
return score
def main(data_file: Path):
list1, list2 = get_ordered_lists(data_file)
elem_amount1 = get_elem_amount(list1)
elem_amount2 = get_elem_amount(list2)
similarity_score = compute_similarity_score(elem_amount1, elem_amount2)
print(similarity_score)
return similarity_score
if __name__ == "__main__":
file = Path(__file__).parent / "input-data"
main(file)

View file

@ -0,0 +1,15 @@
from pathlib import Path
from day1 import common
TEST_FILE = Path(__file__).parent / "test-data"
def test_get_lists():
assert common.get_lists(TEST_FILE)[0] == [3, 4, 2, 1, 3, 3]
assert common.get_lists(TEST_FILE)[1] == [4, 3, 5, 3, 9, 3]
def test_get_sorted_lists():
assert common.get_ordered_lists(TEST_FILE)[0] == [1, 2, 3, 3, 3, 4]
assert common.get_ordered_lists(TEST_FILE)[1] == [3, 3, 3, 4, 5, 9]

View file

@ -2,13 +2,13 @@ from pathlib import Path
from day1 import part1 from day1 import part1
TEST_FILE = Path(__file__).parent / "test-data"
def test_compute_distance():
list1 = [1, 2, 3, 3, 3, 4]
list2 = [3, 3, 3, 4, 5, 9]
assert part1.compute_distance(list1, list2) == 11
def test_first(): def test_main():
assert part1.compute(TEST_FILE) == 11 test_file = Path(__file__).parent / "test-data"
assert part1.main(test_file) == 11
def test_get_lists():
assert part1.get_ordered_lists(TEST_FILE)[0] == [1, 2, 3, 3, 3, 4]
assert part1.get_ordered_lists(TEST_FILE)[1] == [3, 3, 3, 4, 5, 9]

View file

@ -0,0 +1,14 @@
from pathlib import Path
from day1 import part2
def test_compute_similarity_score():
dict1 = {1: 1, 2: 1, 3: 3, 4: 1}
dict2 = {3: 3, 4: 1, 5: 1, 9: 1}
assert part2.compute_similarity_score(dict1, dict2) == 31
def test_main():
test_file = Path(__file__).parent / "test-data"
assert part2.main(test_file) == 31