from puzzle1 import * verbose = True def swap(lst, idx_a, idx_b): temp = lst[idx_a] lst[idx_a] = lst[idx_b] lst[idx_b] = temp def fix_update(update, rules): """Fixes update according to rules by reference.""" # Allow the loop to be restared after a fix. i = 0 update_free = True while i < len(rules): lhs, rhs = rules[i] # NOTE: This is too verbose. #if verbose: # print(i, rules[i], end=" ") if not lhs in update or not rhs in update: i += 1 if i == len(rules) and not update_free: i = 0 update_free = True # NOTE: This is a copied condition from below. continue idx_lhs, idx_rhs = update.index(lhs), update.index(rhs) if idx_lhs > idx_rhs: if verbose: print(f"swapping as {lhs} < {rhs}") swap(update, idx_lhs, idx_rhs) update_free = False i += 1 if i == len(rules) and not update_free: if verbose: print("resetting") i = 0 update_free = True elif i == len(rules): print("stopping") if __name__ == "__main__": rules, updates = load_input() middle_sum = 0 # Let's assume numbers can only occur once (although the checker does not # make this assumption), and every update CAN be fixed. for idx, update in enumerate(updates): print(f"{idx:5d}/{len(updates)}:", update) if is_update_legal(update, rules): if verbose: print(update, " is legal") else: if verbose: print(update, " is illegal") fix_update(update, rules) middle_sum += middle_page_num(update) print(f"The sum of middle page numbers of legal updates is {middle_sum}.")