Added solution for day 5
This commit is contained in:
parent
97e4aafa98
commit
fb54b00fba
4 changed files with 1529 additions and 0 deletions
28
day5/example.txt
Normal file
28
day5/example.txt
Normal file
|
@ -0,0 +1,28 @@
|
|||
47|53
|
||||
97|13
|
||||
97|61
|
||||
97|47
|
||||
75|29
|
||||
61|13
|
||||
75|53
|
||||
29|13
|
||||
97|29
|
||||
53|29
|
||||
61|53
|
||||
97|53
|
||||
61|29
|
||||
47|13
|
||||
75|47
|
||||
97|75
|
||||
47|61
|
||||
75|61
|
||||
47|29
|
||||
75|13
|
||||
53|13
|
||||
|
||||
75,47,61,53,29
|
||||
97,61,53,29,13
|
||||
75,29,13
|
||||
75,97,47,61,53
|
||||
61,13,29
|
||||
97,13,75,29,47
|
1369
day5/input.txt
Normal file
1369
day5/input.txt
Normal file
File diff suppressed because it is too large
Load diff
49
day5/solution.py
Normal file
49
day5/solution.py
Normal file
|
@ -0,0 +1,49 @@
|
|||
import sys
|
||||
|
||||
def main():
|
||||
lines = sys.stdin.read().splitlines()
|
||||
|
||||
order_rules = set()
|
||||
updates = []
|
||||
i = 0
|
||||
n = len(lines)
|
||||
while i < n and lines[i].strip():
|
||||
line = lines[i].strip()
|
||||
if '|' in line:
|
||||
x, y = line.split('|')
|
||||
x = int(x)
|
||||
y = int(y)
|
||||
order_rules.add((x, y))
|
||||
i += 1
|
||||
|
||||
while i < n and not lines[i].strip():
|
||||
i += 1
|
||||
|
||||
while i < n:
|
||||
line = lines[i].strip()
|
||||
if line:
|
||||
update = [int(x) for x in line.split(',')]
|
||||
updates.append(update)
|
||||
i += 1
|
||||
|
||||
middle_pages = []
|
||||
|
||||
for update in updates:
|
||||
position = {page: idx for idx, page in enumerate(update)}
|
||||
valid = True
|
||||
for x, y in order_rules:
|
||||
if x in position and y in position:
|
||||
if position[x] >= position[y]:
|
||||
valid = False
|
||||
break
|
||||
|
||||
if valid:
|
||||
mid_index = len(update) // 2
|
||||
middle_page = update[mid_index]
|
||||
middle_pages.append(middle_page)
|
||||
|
||||
total = sum(middle_pages)
|
||||
print(total)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
83
day5/solution2.py
Normal file
83
day5/solution2.py
Normal file
|
@ -0,0 +1,83 @@
|
|||
import sys
|
||||
import collections
|
||||
|
||||
def main():
|
||||
|
||||
lines = sys.stdin.read().splitlines()
|
||||
|
||||
order_rules = set()
|
||||
updates = []
|
||||
i = 0
|
||||
n = len(lines)
|
||||
while i < n and lines[i].strip():
|
||||
line = lines[i].strip()
|
||||
if '|' in line:
|
||||
x, y = line.split('|')
|
||||
x = int(x)
|
||||
y = int(y)
|
||||
order_rules.add((x, y))
|
||||
i += 1
|
||||
|
||||
while i < n and not lines[i].strip():
|
||||
i += 1
|
||||
|
||||
while i < n:
|
||||
line = lines[i].strip()
|
||||
if line:
|
||||
update = [int(x) for x in line.split(',')]
|
||||
updates.append(update)
|
||||
i += 1
|
||||
|
||||
middle_pages_correct = []
|
||||
middle_pages_incorrect = []
|
||||
|
||||
for update in updates:
|
||||
position = {page: idx for idx, page in enumerate(update)}
|
||||
|
||||
valid = True
|
||||
for x, y in order_rules:
|
||||
if x in position and y in position:
|
||||
if position[x] >= position[y]:
|
||||
valid = False
|
||||
break
|
||||
|
||||
if valid:
|
||||
mid_index = len(update) // 2
|
||||
middle_page = update[mid_index]
|
||||
middle_pages_correct.append(middle_page)
|
||||
else:
|
||||
pages_in_update = set(update)
|
||||
graph = collections.defaultdict(list)
|
||||
indegree = collections.defaultdict(int)
|
||||
for x in pages_in_update:
|
||||
indegree[x] = 0
|
||||
|
||||
for x, y in order_rules:
|
||||
if x in pages_in_update and y in pages_in_update:
|
||||
graph[x].append(y)
|
||||
indegree[y] += 1
|
||||
|
||||
queue = collections.deque([node for node in pages_in_update if indegree[node] == 0])
|
||||
sorted_pages = []
|
||||
|
||||
while queue:
|
||||
node = queue.popleft()
|
||||
sorted_pages.append(node)
|
||||
for neighbor in graph[node]:
|
||||
indegree[neighbor] -= 1
|
||||
if indegree[neighbor] == 0:
|
||||
queue.append(neighbor)
|
||||
|
||||
if len(sorted_pages) != len(pages_in_update):
|
||||
print("Cycle detected in ordering rules. Cannot perform topological sort.")
|
||||
sys.exit(1)
|
||||
|
||||
mid_index = len(sorted_pages) // 2
|
||||
middle_page = sorted_pages[mid_index]
|
||||
middle_pages_incorrect.append(middle_page)
|
||||
|
||||
total_incorrect = sum(middle_pages_incorrect)
|
||||
print(total_incorrect)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in a new issue