From 0c1f1d0ac6bd3049f8a8abd5b9990aa7db152982 Mon Sep 17 00:00:00 2001 From: Kees van Kempen Date: Thu, 19 Dec 2024 12:04:41 +0100 Subject: [PATCH] 2024(5): not done, but this is a start --- 2024/5/puzzle1.py | 67 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 2024/5/puzzle1.py diff --git a/2024/5/puzzle1.py b/2024/5/puzzle1.py new file mode 100644 index 0000000..76ca2bd --- /dev/null +++ b/2024/5/puzzle1.py @@ -0,0 +1,67 @@ +verbose = False + +def indices(lst, element): + """ + See . + """ + + result = [] + offset = -1 + while True: + try: + offset = lst.index(element, offset+1) + except ValueError: + return result + result.append(offset) + +def load_input(filename="input"): + with open(filename, "r") as fp: + lines = fp.read().splitlines() + + # Find the empty line/separator. + sep = lines.index("") + + # Handle rules + rule_lines = lines[:sep] + rules = [tuple(map(int, l.split("|"))) for l in rule_lines] + + # Handle lines + update_lines = lines[sep + 1:] + updates = [list(map(int, l.split(","))) for l in update_lines] + + return rules, updates + +def is_update_legal(update, rules) -> bool: + for rule in rules: + # Find indices of left hand side and right hand side + lhs, rhs = rule + + if not lhs in update or not rhs in update: + continue + # This reminds me of limes inferior and limes superior. + # Thanks, Mueger. + if max(indices(update, lhs)) > min(indices(update, rhs)): + return False + return True + +def middle_page_num(update) -> int: + return len(update) // 2 + +if __name__ == "__main__": + rules, updates = load_input() + + indices_legal = [] + middle_sum = 0 + for idx, update in enumerate(updates): + if is_update_legal(update, rules): + if verbose: + print(update, " is legal") + indices_legal.append(idx) + middle_sum += middle_page_num(update) + else: + if verbose: + print(update, " is illegal") + + if verbose: + print(indices_legal) + print(f"The sum of middle page numbers of legal updates is {middle_sum}.")