73 lines
2.2 KiB
Python
Executable file
73 lines
2.2 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
|
|
# https://adventofcode.com/2024/day/5
|
|
|
|
def get_lines(filename: str) -> list:
|
|
with open(filename, "r") as file:
|
|
return [line.strip() for line in file.readlines()]
|
|
|
|
|
|
def get_rules_and_updates(lines: list) -> tuple:
|
|
rules = {}
|
|
updates = []
|
|
for line in lines:
|
|
if "|" in line:
|
|
a, b = line.split("|")
|
|
if rules.get(b):
|
|
rules[b].append(a)
|
|
else:
|
|
rules[b] = [a]
|
|
elif "," in line:
|
|
updates.append(line.split(","))
|
|
return rules, updates
|
|
|
|
|
|
def check_validity(rules: dict, update: list) -> bool:
|
|
for position, page_number in enumerate(update):
|
|
if page_number not in rules:
|
|
continue
|
|
for earlier_number in rules[page_number]:
|
|
if earlier_number in update[position:]:
|
|
return False
|
|
return True
|
|
|
|
|
|
def sort_update(rules: dict, update: list) -> None:
|
|
len_update = len(update)
|
|
for i in range(len_update - 1):
|
|
for j in range(len_update - i - 1):
|
|
if update[j] not in rules:
|
|
continue
|
|
if update[j + 1] in rules[update[j]]:
|
|
update[j], update[j + 1] = update[j + 1], update[j]
|
|
|
|
|
|
def get_middle_page(update: list) -> int:
|
|
middle_pos = len(update) // 2
|
|
return int(update[middle_pos])
|
|
|
|
|
|
def get_middle_page_sums(rules: dict, updates: list) -> tuple:
|
|
valid_middle_page_sum = 0
|
|
corrected_middle_page_sum = 0
|
|
for update in updates:
|
|
if check_validity(rules, update):
|
|
valid_middle_page_sum += get_middle_page(update)
|
|
else:
|
|
sort_update(rules, update)
|
|
corrected_middle_page_sum += get_middle_page(update)
|
|
return valid_middle_page_sum, corrected_middle_page_sum
|
|
|
|
|
|
def main():
|
|
# lines = get_lines("sample-input.txt")
|
|
lines = get_lines("input.txt")
|
|
|
|
rules, updates = get_rules_and_updates(lines)
|
|
valid_middle_page_sum, invalid_middle_page_sum = get_middle_page_sums(rules, updates)
|
|
print("Part 1: The sum of middle pages in valid updates is:", valid_middle_page_sum)
|
|
print("Part 2: The sum of middle pages in corrected updates is:", invalid_middle_page_sum)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|