◂ 5 décembre 2023 ▸
If You Give A Seed A Fertilizer : Faire des correspondances de nombres sur de larges intervalles qui se chevauchent
seeds: 364807853 408612163 302918330 …
seed-to-soil map:
2069473506 3732587455 1483883
3235691256 2348990120 6550341
⋮
soil-to-fertilizer map:
2700214958 2743391193 363795571
⋮
humidity-to-location map:
⋮
- code1.py
- code2.py
- code2_oo.py
- code2_oo_nonRecursif.py
- intervalle.py
import re
f = open("input.txt", 'r', encoding='utf-8')
lines = [line[:-1] for line in f.readlines()]
def parse_ints(line: str) -> list[int]:
return [ int(tok) for tok in re.split('[^0-9]+', line) if tok ]
seeds = parse_ints(lines[0])
""" Pour les règles de transformations entre les valeurs de
seed => soil => fertilizer => water => light => temperature => humidity => location """
Regle = tuple[int, int, int] # nouvelle valeur de base, ancienne valeur de base, nb de valeurs
Regles = list[Regle]
transformations: list[Regles] = []
for line in lines[1:]:
if not line:
continue
elif ':' in line:
print("Lecture des règles de " + line.split()[0])
transformations.append([])
continue
else:
transformations[-1].append( tuple(parse_ints(line)) )
def calculer_valeur_suivante(regles: Regles, value: int) -> int:
for new_val_base, old_val_base, size in regles:
if old_val_base <= value < old_val_base + size:
return value + new_val_base - old_val_base
return value
def seed_to_location(seed: int) -> int:
id = seed
for regles in transformations:
id = calculer_valeur_suivante(regles, id)
return id
reponse1 = min(seed_to_location(seed) for seed in seeds)
print("Réponse partie 1:", reponse1)