47 lines
1.5 KiB
Python
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))
|