Advertisement
Guest User

Untitled

a guest
Dec 7th, 2024
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.43 KB | Source Code | 0 0
  1.  
  2. tests = {
  3.      "puzzle.txt" : [REDACTED, REDACTED]
  4.      "test1_in.txt" : 11387
  5. }
  6.  
  7. part1_operators = ["*", "+"]
  8. part2_operators = ["*", "+", "||"]
  9. ANSWER_INDEX = 0
  10.  
  11. def read_puzzle(puzzle_file):
  12.     with open(puzzle_file, 'r') as infile:
  13.         puzzle_input = []
  14.         for line in infile.read().splitlines():
  15.             line = line.replace(": ", " ")
  16.             puzzle_line = []
  17.             for ch in line.split(" "):
  18.                 puzzle_line.append(int(ch))
  19.             puzzle_input.append(puzzle_line)
  20.     return puzzle_input
  21.  
  22. def part1_can_solve(line):
  23.     expected_answer = line[ANSWER_INDEX]
  24.     line = line[ANSWER_INDEX + 1:]
  25.     for operator in part1_operators:
  26.         solve = False
  27.         match operator:
  28.             case "*":
  29.                 temp_answer = line[0] * line[1]
  30.                 solve |= recursive_part1(line[2:], temp_answer, expected_answer) # git first (0 index) operand and * on result of recursive call of recursive_part1(line[1:])
  31.  
  32.             case "+":
  33.                 temp_answer = line[0] + line[1]
  34.                 solve |= recursive_part1(line[2:], temp_answer, expected_answer)  # git first (0 index) operand and * on result of recursive call of recursive_part1(line[1:])
  35.  
  36.         if solve:
  37.             return True
  38.     return False
  39.  
  40. def recursive_part1(line, temp_answer, expected_answer) -> bool:
  41.     if len(line) == 0:# base case
  42.         if temp_answer == expected_answer:
  43.             return True
  44.         else:
  45.             return False
  46.     solve = False
  47.     store_temp = temp_answer
  48.     for operator in part1_operators:
  49.         temp_answer = store_temp
  50.         match operator:
  51.             case "*":
  52.                 temp_answer *= line[0]
  53.                 solve |= recursive_part1(line[1:], temp_answer, expected_answer)
  54.  
  55.             case "+":
  56.                 temp_answer += line[0]
  57.                 solve |= recursive_part1(line[1:], temp_answer, expected_answer)
  58.  
  59.         if solve:
  60.             return True
  61.     return False
  62.  
  63. def concat_numbers(num1:int, num2:int) -> int:
  64.     return int(str(num1) + str(num2))
  65.  
  66. def part2_can_solve(line):
  67.     expected_answer = line[ANSWER_INDEX]
  68.     line = line[ANSWER_INDEX + 1:]
  69.     for operator in part2_operators:
  70.         solve = False
  71.         match operator:
  72.             case "*":
  73.                 temp_answer = line[0] * line[1]
  74.                 solve |= recursive_part2(line[2:], temp_answer, expected_answer)
  75.  
  76.             case "+":
  77.                 temp_answer = line[0] + line[1]
  78.                 solve |= recursive_part2(line[2:], temp_answer, expected_answer)
  79.             case "||":
  80.  
  81.                 temp_answer = concat_numbers(line[0], line[1])
  82.                 solve |= recursive_part2(line[2:], temp_answer, expected_answer)
  83.  
  84.         if solve:
  85.             return True
  86.     return False
  87.  
  88. def recursive_part2(line, temp_answer, expected_answer) -> bool:
  89.     if len(line) == 0:# base case
  90.         if temp_answer == expected_answer:
  91.             return True
  92.         else:
  93.             return False
  94.     solve = False
  95.     store_temp = temp_answer
  96.     for operator in part2_operators:
  97.         temp_answer = store_temp
  98.         match operator:
  99.             case "*":
  100.                 temp_answer *= line[0]
  101.                 solve |= recursive_part2(line[1:], temp_answer, expected_answer)
  102.  
  103.             case "+":
  104.                 temp_answer += line[0]
  105.                 solve |= recursive_part2(line[1:], temp_answer, expected_answer)
  106.             case "||":
  107.  
  108.                 temp_answer = concat_numbers(temp_answer, line[0])
  109.                 solve |= recursive_part2(line[1:], temp_answer, expected_answer)
  110.  
  111.         if solve:
  112.             return True
  113.     return False
  114.  
  115. def main():
  116.     for test in tests:
  117.         puzzle_input = read_puzzle(test)
  118.         part1_answer = 0
  119.         part2_answer_only = 0
  120.         for line in puzzle_input:
  121.             if part1_can_solve(line):
  122.                 part1_answer += line[ANSWER_INDEX]
  123.                 print(f"Can solve this line from puzzle in part1: {line}")
  124.                 continue # no need process this line as we can solve it for only + and *
  125.             if part2_can_solve(line):
  126.                 part2_answer_only += line[ANSWER_INDEX]
  127.                 print(f"Can solve this line from puzzle in part2: {line}")
  128.  
  129.         print(f"Part1 puzzle answer is {part1_answer}")
  130.         print(f"Part2 puzzle answer is {part2_answer_only + part1_answer}")
  131.  
  132.  
  133.  
  134. if __name__ == "__main__":
  135.         main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement