Day 7: Bridge Repair
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
What a horrible way to name variables
a
e
o
, Killer Tofu. That’s all I can think of reading this code.It’s not a long lived project, it’s a puzzle, and once solved never needs to run again. My objective here is to get the correct answer, not win a style contest.
Can you provide a link to your solution? I’d like to check it out.
My initial comment was a bit harsh, I’m sorry for that. It was meant to be a bit of a joke. Anyway here’s my code. Do note that I don’t do the challenges timed so I have a bit more time to name my variables accordingly. Takes 35 seconds to run on a pc with a AMD Ryzen 5 5600
import sys from tqdm import tqdm input = sys.stdin.read() def all_operator_permutations(operator_count): if operator_count == 0: return [[]] smaller_permutations = all_operator_permutations(operator_count-1) return [ *[['+', *ops] for ops in smaller_permutations], *[['*', *ops] for ops in smaller_permutations], *[['||', *ops] for ops in smaller_permutations], ] def test_operators(ops, values): res = values.pop(0) for op in ops: match op: case '*': res *= values.pop(0) case '+': res += values.pop(0) case '||': res = int(f"{res}{values.pop(0)}") return res total_calibration_result = 0 for line in tqdm(input.splitlines()[:]): target, *tail = line.split(':') target = int(target) values = [int(val) for val in tail[0].split()] all_perms = all_operator_permutations(len(values) - 1) ops = all_perms.pop() while True: res = test_operators(ops, values.copy()) if res == target: total_calibration_result += target break if not all_perms: break ops = all_perms.pop() print(total_calibration_result)