◂ 25 décembre 2024
Code Chronicle : Matcher des clés et des serrures
#####
##.##
.#.#.
.#...
.#...
.#...
.....
.....
.....
..#..
.##..
.##..
.##.#
#####
⋮
- code.py
from itertools import batched
with open("input.txt", 'r', encoding='utf-8') as f:
lines = [line[:-1] for line in f.readlines()]
NB_LINES = lines.index('') # 7
NB_COLS = len(lines[0]) # 5
keys = []
locks = []
for line_set in batched(lines, NB_LINES + 1):
# transpose lines into columns and get rid of last empty line
cols = [ ''.join([line_set[y][x] for y in range(NB_LINES)]) for x in range(NB_COLS)]
if line_set[0][0] == '.': # It's a key !
keys.append(tuple([col[::-1].index('.') for col in cols]))
else:
locks.append(tuple([col.index('.') for col in cols])) # ou index('.', 1)
nb = 0
for lock in locks:
for key in keys:
if all(sum(values) <= NB_LINES for values in zip(lock, key)): # voir alternative à la fin
nb += 1
print("Réponse partie 1:", nb)
# if all(lock[i] + key[i] <= NB_LINES for i in range(5)): # plus rapide mais moins joli