Advent of code

 7 décembre 2024 

  Bridge Repair : «Le compte est bon», mais avec 3 opérations différentes et uniquement de gauche à droite.
27905293: 1 3 67 91 5 5 293
   
2656278: 383 3 7 99 1 8
   
5824995: 5 1 8 2 1 89 1 6 4 2 47 3
   
                 
Ajouté une petite optimisation : si un résultat intermédiaire est strictement plus grand que le résultat désiré, on sait déjà que c'est raté.
Attention, la comparaison doit être stricte ; si on finit avec un 1, alors le résultat peut rester constant.

Optimisation par utilisation des opérations à l'envers :
Énorme gain de temps (40 fois plus rapide et 150 fois moins d'appels de la fonction possible),
car on peut éviter plein de branches dès le moment où une opération de soustraction, division ou déconcaténation n'est pas possible.
  1. code.py
  2. code_optimReversedOperations.py
with open("input.txt", 'r', encoding='utf-8') as f:
    lines = [line[:-1] for line in f.readlines()]

def parse_ints(line: str) -> list[int]:
    return [ int(token) for token in line.replace(':', '').split() if token ]

def substract_test(a,b):
    if b >= a:
        return False
    return a - b

def divide_test(a,b):
    if a % b != 0:
        return False
    return a // b

def deconcat_test(a,b):
    f = 10 ** len(str(b))
    if a % f == b:
        return a // f
    return False

functions_part1 = [ substract_test, divide_test ]
functions_part2 = functions_part1 + [ deconcat_test ]

def possible(result, vals, functions):
    if len(vals) == 1:
        return result == vals[0]
    for f in functions:
        reduced_val = f(*vals[:2])
        if not reduced_val:
            continue
        if possible(result, [reduced_val] + vals[2:], functions):
            return True
    return False
    

nb1 = nb2 = 0

for line in lines:
    values = parse_ints(line)
    target = values.pop(0)
    values.append(target)
    values.reverse()
    result = values.pop()
    if possible(result, values, functions_part1):
        print("1", end='', flush=True)
        nb1 += target
        nb2 += target
    elif possible(result, values, functions_part2):
        print("2", end='')
        nb2 += target
    else:
        print(".", end='')
print()

print("Réponse partie 1:", nb1)
print("Réponse partie 2:", nb2)