50 lines
1.0 KiB
Python
50 lines
1.0 KiB
Python
import bisect
|
|
from collections import Counter
|
|
from typing import Generator, TextIO, Tuple
|
|
|
|
|
|
def read_input(f: TextIO) -> Generator[Tuple[int, int], None, None]:
|
|
for line in f:
|
|
x, y = line.strip().split()
|
|
yield (int(x), int(y))
|
|
|
|
|
|
def total_distance() -> int:
|
|
left = []
|
|
right = []
|
|
total_distance = 0
|
|
|
|
with open("input.txt", "r") as f:
|
|
for x, y in read_input(f):
|
|
bisect.insort(left, x)
|
|
bisect.insort(right, y)
|
|
|
|
for x, y in zip(left, right):
|
|
total_distance += abs(x - y)
|
|
|
|
return total_distance
|
|
|
|
|
|
|
|
def similarity_score() -> int:
|
|
left = []
|
|
right = []
|
|
similarity_score = 0
|
|
|
|
with open("input.txt", "r") as f:
|
|
for x, y in read_input(f):
|
|
left.append(x)
|
|
right.append(y)
|
|
|
|
frequencies = Counter(right)
|
|
|
|
for x in left:
|
|
similarity_score += x * frequencies[x]
|
|
|
|
return similarity_score
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print(f"total_distance = {total_distance()}")
|
|
print(f"similarity_score = {similarity_score()}")
|