day 5 done
This commit is contained in:
@@ -0,0 +1,86 @@
|
|||||||
|
testing = 0
|
||||||
|
if not testing:
|
||||||
|
with open(r"2024/05\input.txt", "r") as file:
|
||||||
|
input = file.read()
|
||||||
|
else:
|
||||||
|
input = """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"""
|
||||||
|
|
||||||
|
# first we split the input into the two parts
|
||||||
|
# the first part is the "rules" and the second part is the "updates"
|
||||||
|
rules, updates = input.split("\n\n")
|
||||||
|
# print(rules)
|
||||||
|
# print('^v^v^v^')
|
||||||
|
# print(updates)
|
||||||
|
# for each rule the left side is the page that must come before the right side
|
||||||
|
# to check the updates are correct we need to check that the left side of the update is before the right side
|
||||||
|
# if all updatesare correct then the rules are correct and we need to store the 'middle' number
|
||||||
|
|
||||||
|
# lets assign each update to a list of numbers
|
||||||
|
update_lists = []
|
||||||
|
for update in updates.split("\n"):
|
||||||
|
update_lists.append(list(map(int, update.split(","))))
|
||||||
|
#print(update_lists)
|
||||||
|
|
||||||
|
# lets also assign the rules to a list of tuples of numbers
|
||||||
|
rule_tuples = []
|
||||||
|
for rule in rules.split("\n"):
|
||||||
|
rule_tuples.append(tuple(map(int, rule.split("|"))))
|
||||||
|
#print(rule_tuples)
|
||||||
|
|
||||||
|
valid_updates = []
|
||||||
|
# now for each update we need to check that it follows the rules
|
||||||
|
for update in update_lists:
|
||||||
|
valid = True
|
||||||
|
# we need to check that the update is ordered correctly based on the rules
|
||||||
|
for rule in rule_tuples:
|
||||||
|
# if the update does not contain the any number in the rules we can ignore that rule
|
||||||
|
if rule[0] not in update or rule[1] not in update:
|
||||||
|
continue
|
||||||
|
# if the left side is before the right side then we can break out of the loop
|
||||||
|
if update.index(rule[0]) < update.index(rule[1]):
|
||||||
|
continue
|
||||||
|
# if the right side is before the left side then we can break out of the loop
|
||||||
|
if update.index(rule[0]) > update.index(rule[1]):
|
||||||
|
valid = False
|
||||||
|
break
|
||||||
|
if valid:
|
||||||
|
valid_updates.append(update)
|
||||||
|
|
||||||
|
print('The valid updates are',valid_updates)
|
||||||
|
|
||||||
|
numbers_to_sum = []
|
||||||
|
for update in valid_updates:
|
||||||
|
update_len = len(update)
|
||||||
|
# we need to find the middle number
|
||||||
|
middle = update_len // 2
|
||||||
|
numbers_to_sum.append(update[middle])
|
||||||
|
|
||||||
|
print('The numbers to sum are',numbers_to_sum)
|
||||||
|
print('The sum of the numbers is',sum(numbers_to_sum))
|
||||||
@@ -0,0 +1,106 @@
|
|||||||
|
testing = 0
|
||||||
|
if not testing:
|
||||||
|
with open(r"2024/05\input.txt", "r") as file:
|
||||||
|
input = file.read()
|
||||||
|
else:
|
||||||
|
input = """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"""
|
||||||
|
|
||||||
|
# first we split the input into the two parts
|
||||||
|
# the first part is the "rules" and the second part is the "updates"
|
||||||
|
rules, updates = input.split("\n\n")
|
||||||
|
# print(rules)
|
||||||
|
# print('^v^v^v^')
|
||||||
|
# print(updates)
|
||||||
|
# for each rule the left side is the page that must come before the right side
|
||||||
|
# to check the updates are correct we need to check that the left side of the update is before the right side
|
||||||
|
# if all updatesare correct then the rules are correct and we need to store the 'middle' number
|
||||||
|
|
||||||
|
# lets assign each update to a list of numbers
|
||||||
|
update_lists = []
|
||||||
|
for update in updates.split("\n"):
|
||||||
|
update_lists.append(list(map(int, update.split(","))))
|
||||||
|
#print(update_lists)
|
||||||
|
|
||||||
|
# lets also assign the rules to a list of tuples of numbers
|
||||||
|
rule_tuples = []
|
||||||
|
for rule in rules.split("\n"):
|
||||||
|
rule_tuples.append(tuple(map(int, rule.split("|"))))
|
||||||
|
#print(rule_tuples)
|
||||||
|
|
||||||
|
def check_and_rearrange(update, rule):
|
||||||
|
if rule[0] in update and rule[1] in update:
|
||||||
|
index_0 = update.index(rule[0])
|
||||||
|
index_1 = update.index(rule[1])
|
||||||
|
if index_0 > index_1:
|
||||||
|
# Swap the elements to follow the rule
|
||||||
|
update[index_0], update[index_1] = update[index_1], update[index_0]
|
||||||
|
return False # Indicate that a change was made
|
||||||
|
return True # No change needed
|
||||||
|
|
||||||
|
#first pass, any updates that pass the rules are valid
|
||||||
|
valid_updates = []
|
||||||
|
incorrectly_ordered_updates = []
|
||||||
|
for update in update_lists:
|
||||||
|
valid = True
|
||||||
|
# we need to check that the update is ordered correctly based on the rules
|
||||||
|
for rule in rule_tuples:
|
||||||
|
# if the update does not contain the any number in the rules we can ignore that rule
|
||||||
|
if rule[0] not in update or rule[1] not in update:
|
||||||
|
continue
|
||||||
|
# if the left side is before the right side then we can break out of the loop
|
||||||
|
if update.index(rule[0]) < update.index(rule[1]):
|
||||||
|
continue
|
||||||
|
# if the right side is before the left side then we can break out of the loop
|
||||||
|
if update.index(rule[0]) > update.index(rule[1]):
|
||||||
|
valid = False
|
||||||
|
incorrectly_ordered_updates.append(update)
|
||||||
|
break
|
||||||
|
if valid:
|
||||||
|
valid_updates.append(update)
|
||||||
|
|
||||||
|
# reorder the incorrectly-ordered updates
|
||||||
|
for update in incorrectly_ordered_updates:
|
||||||
|
changed = True
|
||||||
|
while changed:
|
||||||
|
changed = False
|
||||||
|
for rule in rule_tuples:
|
||||||
|
if not check_and_rearrange(update, rule):
|
||||||
|
changed = True
|
||||||
|
|
||||||
|
|
||||||
|
# Extract the middle number from each reordered update and sum them
|
||||||
|
numbers_to_sum = []
|
||||||
|
for update in incorrectly_ordered_updates:
|
||||||
|
update_len = len(update)
|
||||||
|
middle = update_len // 2
|
||||||
|
numbers_to_sum.append(update[middle])
|
||||||
|
|
||||||
|
print('The numbers to sum are', numbers_to_sum)
|
||||||
|
print('The sum of the numbers is', sum(numbers_to_sum))
|
||||||
Reference in New Issue
Block a user