Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- tests = {
- "puzzle.txt" : [REDACTED, REDACTED]
- "test1_in.txt" : 11387
- }
- part1_operators = ["*", "+"]
- part2_operators = ["*", "+", "||"]
- ANSWER_INDEX = 0
- def read_puzzle(puzzle_file):
- with open(puzzle_file, 'r') as infile:
- puzzle_input = []
- for line in infile.read().splitlines():
- line = line.replace(": ", " ")
- puzzle_line = []
- for ch in line.split(" "):
- puzzle_line.append(int(ch))
- puzzle_input.append(puzzle_line)
- return puzzle_input
- def part1_can_solve(line):
- expected_answer = line[ANSWER_INDEX]
- line = line[ANSWER_INDEX + 1:]
- for operator in part1_operators:
- solve = False
- match operator:
- case "*":
- temp_answer = line[0] * line[1]
- 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:])
- case "+":
- temp_answer = line[0] + line[1]
- 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:])
- if solve:
- return True
- return False
- def recursive_part1(line, temp_answer, expected_answer) -> bool:
- if len(line) == 0:# base case
- if temp_answer == expected_answer:
- return True
- else:
- return False
- solve = False
- store_temp = temp_answer
- for operator in part1_operators:
- temp_answer = store_temp
- match operator:
- case "*":
- temp_answer *= line[0]
- solve |= recursive_part1(line[1:], temp_answer, expected_answer)
- case "+":
- temp_answer += line[0]
- solve |= recursive_part1(line[1:], temp_answer, expected_answer)
- if solve:
- return True
- return False
- def concat_numbers(num1:int, num2:int) -> int:
- return int(str(num1) + str(num2))
- def part2_can_solve(line):
- expected_answer = line[ANSWER_INDEX]
- line = line[ANSWER_INDEX + 1:]
- for operator in part2_operators:
- solve = False
- match operator:
- case "*":
- temp_answer = line[0] * line[1]
- solve |= recursive_part2(line[2:], temp_answer, expected_answer)
- case "+":
- temp_answer = line[0] + line[1]
- solve |= recursive_part2(line[2:], temp_answer, expected_answer)
- case "||":
- temp_answer = concat_numbers(line[0], line[1])
- solve |= recursive_part2(line[2:], temp_answer, expected_answer)
- if solve:
- return True
- return False
- def recursive_part2(line, temp_answer, expected_answer) -> bool:
- if len(line) == 0:# base case
- if temp_answer == expected_answer:
- return True
- else:
- return False
- solve = False
- store_temp = temp_answer
- for operator in part2_operators:
- temp_answer = store_temp
- match operator:
- case "*":
- temp_answer *= line[0]
- solve |= recursive_part2(line[1:], temp_answer, expected_answer)
- case "+":
- temp_answer += line[0]
- solve |= recursive_part2(line[1:], temp_answer, expected_answer)
- case "||":
- temp_answer = concat_numbers(temp_answer, line[0])
- solve |= recursive_part2(line[1:], temp_answer, expected_answer)
- if solve:
- return True
- return False
- def main():
- for test in tests:
- puzzle_input = read_puzzle(test)
- part1_answer = 0
- part2_answer_only = 0
- for line in puzzle_input:
- if part1_can_solve(line):
- part1_answer += line[ANSWER_INDEX]
- print(f"Can solve this line from puzzle in part1: {line}")
- continue # no need process this line as we can solve it for only + and *
- if part2_can_solve(line):
- part2_answer_only += line[ANSWER_INDEX]
- print(f"Can solve this line from puzzle in part2: {line}")
- print(f"Part1 puzzle answer is {part1_answer}")
- print(f"Part2 puzzle answer is {part2_answer_only + part1_answer}")
- if __name__ == "__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement