Advertisement
Guest User

Untitled

a guest
Dec 6th, 2024
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.23 KB | None | 0 0
  1. def get_data(test=False):
  2.     filename = "day5.input" if not test else "day5.test"
  3.     rules, to_produce_sequence = [
  4.         part for part in open(filename).read().split("\n\n") if part != ""
  5.     ]
  6.  
  7.     rules = [rule.split("|") for rule in rules.splitlines()]
  8.     to_produce_sequence = [seq.split(",") for seq in to_produce_sequence.splitlines()]
  9.  
  10.     return rules, to_produce_sequence
  11.  
  12.  
  13. def get_index(lst, val) -> None or int:
  14.     try:
  15.         return lst.index(val)
  16.     except ValueError:
  17.         return None
  18.  
  19.  
  20. def get_part1_output(rules, to_produce_sequence, return_incorrect_seqs_for_part2=False):
  21.     middle_vals = []
  22.     for_part2_incorrect_seqs = []
  23.  
  24.     for seq in to_produce_sequence:
  25.         rules_passed = []
  26.         for rule_before, rule_after in rules:
  27.             rule_bef_idx = get_index(seq, rule_before)
  28.             rule_aft_idx = get_index(seq, rule_after)
  29.  
  30.             # continue if rule is not in it
  31.             if None in (rule_bef_idx, rule_aft_idx):
  32.                 continue
  33.  
  34.             if rule_bef_idx < rule_aft_idx:
  35.                 rules_passed.append(True)
  36.             else:  # skip if any rule fails
  37.                 rules_passed.append(False)
  38.                 break
  39.  
  40.         if all(rules_passed):  # Append here to avoid multiple same seq middle in it
  41.             middle_vals.append(int(seq[len(seq) // 2]))
  42.         else:
  43.             for_part2_incorrect_seqs.append(seq)
  44.  
  45.     if return_incorrect_seqs_for_part2:
  46.         return middle_vals, for_part2_incorrect_seqs
  47.     print("middle_vals: ", middle_vals)
  48.     return sum(middle_vals)
  49.  
  50.  
  51. test_rules, test_to_produce_sequence = get_data(test=True)
  52. rules, to_produce_sequence = get_data()
  53.  
  54. # Part 2
  55. print("=== Part 1 ===")
  56. TEST_OUT_SHOULD_BE = 143
  57.  
  58. print("=> Test <=")
  59. out = get_part1_output(test_rules, test_to_produce_sequence)
  60. print("Test passes: ", out == TEST_OUT_SHOULD_BE, " value: ", out)
  61.  
  62. print("=> Run <=")
  63. out = get_part1_output(rules, to_produce_sequence)
  64. print("Result: ", out)
  65.  
  66.  
  67. # Part 2
  68. def fix_seq(seq, rules):
  69.     new_seq = seq.copy()
  70.     for val in seq:
  71.         curr_rules = [rule for rule in rules if rule[0] == val]
  72.         for rule_before, rule_after in curr_rules:
  73.             rule_bef_idx = get_index(new_seq, rule_before)  # same as index of "val"
  74.             rule_aft_idx = get_index(new_seq, rule_after)
  75.  
  76.             if rule_aft_idx is not None and rule_bef_idx > rule_aft_idx:
  77.                 new_seq.remove(val)
  78.                 new_seq.insert(rule_aft_idx, val)
  79.  
  80.     return new_seq
  81.  
  82.  
  83. def get_part2_output(rules, to_produce_sequence):
  84.     out, incorrect_seqs = get_part1_output(
  85.         rules, to_produce_sequence, return_incorrect_seqs_for_part2=True
  86.     )
  87.  
  88.     new_fixed_seqs = []
  89.     for seq in incorrect_seqs:
  90.         new_seq = fix_seq(seq, rules)
  91.         new_fixed_seqs.append(new_seq)
  92.  
  93.     if len(new_fixed_seqs) == 0:
  94.         return None
  95.  
  96.     return get_part1_output(rules, new_fixed_seqs)
  97.  
  98.  
  99. print("=== Part 2 ===")
  100. PART2_TEST_OUT_SHOULD_BE = 123
  101.  
  102. print("=> Test <=")
  103. out = get_part2_output(test_rules, test_to_produce_sequence)
  104. print("Test passes: ", out == PART2_TEST_OUT_SHOULD_BE, " value: ", out)
  105.  
  106. print("=> Run <=")
  107. out = get_part2_output(rules, to_produce_sequence)
  108. print("Result: ", out)
  109.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement