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

    • TunaCowboy@lemmy.world
      link
      fedilink
      arrow-up
      1
      ·
      edit-2
      17 days ago

      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.

      • Katzenmann@feddit.org
        link
        fedilink
        English
        arrow-up
        1
        ·
        edit-2
        17 days ago

        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)