68 lines
1.8 KiB
Python
68 lines
1.8 KiB
Python
|
#!/usr/bin/python3
|
||
|
"""
|
||
|
Jour 15 du défi Advent Of Code pour l'année 2023
|
||
|
"""
|
||
|
import os
|
||
|
|
||
|
def read_sample():
|
||
|
"""récupère les entrées depuis le fichier texte correspondant"""
|
||
|
filename = os.path.join(os.path.dirname(__file__ ), "inputs", "day15.txt")
|
||
|
with open(filename, 'r') as f:
|
||
|
sample = f.read().split('\n')
|
||
|
sample = [ [j for j in i.split(",")] for i in sample if i != '' ][0]
|
||
|
return sample
|
||
|
|
||
|
def hash(s):
|
||
|
cur_val = 0
|
||
|
for i in s:
|
||
|
cur_val += ord(i)
|
||
|
cur_val *= 17
|
||
|
cur_val = cur_val % 256
|
||
|
return cur_val
|
||
|
|
||
|
def print_boxes(boxes):
|
||
|
print("===")
|
||
|
for i in boxes.keys():
|
||
|
if boxes[i] != []:
|
||
|
print(f"Box {i}: ", end="")
|
||
|
for a, b in boxes[i]:
|
||
|
print(f"[{a}={b}] ", end="")
|
||
|
print()
|
||
|
|
||
|
def part1(sample):
|
||
|
"""Partie 1 du défi"""
|
||
|
return sum(hash(i) for i in sample)
|
||
|
|
||
|
def part2(sample):
|
||
|
"""Partie 2 du défi"""
|
||
|
boxes = {i: [] for i in range(256)}
|
||
|
for i in sample:
|
||
|
if '=' in i:
|
||
|
label = i.split("=")[0]
|
||
|
box = hash(label)
|
||
|
lens = int(i.split("=")[1])
|
||
|
found = False
|
||
|
for i in range(len(boxes[box])):
|
||
|
if boxes[box][i][0] == label:
|
||
|
boxes[box][i] = (label, lens)
|
||
|
found = True
|
||
|
break
|
||
|
if not found:
|
||
|
boxes[box].append((label, lens))
|
||
|
else:
|
||
|
label = i.split("-")[0]
|
||
|
box = hash(label)
|
||
|
boxes[box] = [(a, b) for (a, b) in boxes[box] if a != label]
|
||
|
|
||
|
print_boxes(boxes)
|
||
|
return sum([sum([(1+i)*(1+j)*boxes[i][j][1] for j in range(len(boxes[i]))]) for i in boxes.keys()])
|
||
|
|
||
|
|
||
|
def main():
|
||
|
"""Fonction principale"""
|
||
|
sample = read_sample()
|
||
|
print(f"part1: {part1(sample)}")
|
||
|
print(f"part2: {part2(sample)}")
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|