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
    link
    1
    edit-2
    16 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.

    • @[email protected]
      link
      fedilink
      English
      1
      edit-2
      16 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)