solved day5
This commit is contained in:
parent
99b4a74c88
commit
f194574da4
1386
2024/day5/input.text
Normal file
1386
2024/day5/input.text
Normal file
File diff suppressed because it is too large
Load Diff
85
2024/day5/main.py
Normal file
85
2024/day5/main.py
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
with open('input.text', 'r') as file:
|
||||||
|
data: list[str] = file.readlines()
|
||||||
|
|
||||||
|
# Parse Data
|
||||||
|
|
||||||
|
class Rule:
|
||||||
|
subject: int
|
||||||
|
constraint: int
|
||||||
|
|
||||||
|
def __init__(self, n: int, other: int):
|
||||||
|
self.subject = n
|
||||||
|
self.constraint = other
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
return f'{self.subject}|{self.constraint}'
|
||||||
|
|
||||||
|
class Update:
|
||||||
|
nums: list[int]
|
||||||
|
|
||||||
|
def __init__(self, ns: list[int]):
|
||||||
|
self.nums = ns
|
||||||
|
|
||||||
|
def check_rule(self, rule: Rule) -> bool:
|
||||||
|
if rule.subject in self.nums and rule.constraint in self.nums:
|
||||||
|
if self.nums.index(rule.subject) > self.nums.index(rule.constraint):
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def check_ruleset(self, ruleset: list[Rule]) -> Rule:
|
||||||
|
for rule in ruleset:
|
||||||
|
if not self.check_rule(rule):
|
||||||
|
return rule
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
def fix_rule(self, rule: Rule) -> None:
|
||||||
|
if rule.subject not in self.nums and rule.constraint not in self.nums:
|
||||||
|
return None
|
||||||
|
|
||||||
|
si: int = self.nums.index(rule.subject)
|
||||||
|
ci: int = self.nums.index(rule.constraint)
|
||||||
|
|
||||||
|
self.nums[si] = rule.constraint
|
||||||
|
self.nums[ci] = rule.subject
|
||||||
|
|
||||||
|
def get_middle_num(self) -> int:
|
||||||
|
return self.nums[int(len(self.nums) / 2)]
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
return str(self.nums)
|
||||||
|
|
||||||
|
|
||||||
|
rules: list[Rule] = []
|
||||||
|
updates: list[Update] = []
|
||||||
|
|
||||||
|
for line in data:
|
||||||
|
if '|' in line:
|
||||||
|
n1, n2 = [int(n) for n in line.split('|')]
|
||||||
|
rules.append(Rule(n1, n2))
|
||||||
|
elif ',' in line:
|
||||||
|
nums = [int(n) for n in line.split(',')]
|
||||||
|
updates.append(Update(nums))
|
||||||
|
|
||||||
|
# Part 1
|
||||||
|
total = 0
|
||||||
|
for update in updates:
|
||||||
|
if update.check_ruleset(rules):
|
||||||
|
total += update.get_middle_num()
|
||||||
|
|
||||||
|
print(f'Part 1: {total}')
|
||||||
|
|
||||||
|
# Part 2
|
||||||
|
total = 0
|
||||||
|
for update in updates:
|
||||||
|
fixed = False
|
||||||
|
while r := update.check_ruleset(rules):
|
||||||
|
update.fix_rule(r)
|
||||||
|
fixed = True
|
||||||
|
|
||||||
|
if fixed:
|
||||||
|
total += update.get_middle_num()
|
||||||
|
|
||||||
|
print(f'Part 2: {total}')
|
||||||
|
|
||||||
28
2024/day5/test.text
Normal file
28
2024/day5/test.text
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
|
||||||
Loading…
x
Reference in New Issue
Block a user