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

  • Katzenmann@feddit.org
    link
    fedilink
    English
    arrow-up
    1
    ·
    edit-2
    20 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)