aoc2025/day10/2.py
2025-12-10 11:07:46 +01:00

47 lines
1.5 KiB
Python

from tqdm import tqdm
with open(r'day10/input.txt', 'r') as input:
lines = input.read().split('\n')[:-1]
def add_joltage(config,button):
return tuple(config[i]+1 if i in button else config[i] for i in range(len(config)))
GLOBAL_MIN_PUSH = [10**6 for _ in lines]
def find_min_tries(target,buttons,current,current_total,GLOBAL_MIN_PUSH,i):
# On élimine les cas triviaux.
if current==target and GLOBAL_MIN_PUSH[i] > current_total :
GLOBAL_MIN_PUSH[i] = current_total
return None
if buttons == []:
return None
if current_total >= GLOBAL_MIN_PUSH[i]:
return None
# On compte combien de fois on peut presser le bouton en cours
max_push = 99999
for pos in buttons[0]:
max_push = min(max_push,target[pos]-current[pos])
# On cherche une solution pour chaque nombre de pressions
pushes = 0
new = current
for _ in range(max_push+1):
find_min_tries(target,buttons[1:],new,current_total+pushes,GLOBAL_MIN_PUSH,i)
new=add_joltage(new,buttons[0])
pushes+=1
return None
joltage = []
buttons = []
for line in lines:
split_line = line.split(' ')
buttons.append(list(map(lambda x: set(map(int,(x[1:-1]).split(','))),split_line[1:-1])))
joltage.append(tuple(map(lambda x:int(x),split_line[-1][1:-1].split(','))))
for i in tqdm(range(len(lines))):
find_min_tries(joltage[i],buttons[i],tuple(0 for _ in joltage[i]),0,GLOBAL_MIN_PUSH,i)
print(sum(GLOBAL_MIN_PUSH))