Advent of code

 25 décembre 2024 

  Code Chronicle : Matcher des clés et des serrures
#####
   
##.##
   
.#.#.
   
.#...
   
.#...
   
.#...
   
.....
   
  
   
.....
   
.....
   
..#..
   
.##..
   
.##..
   
.##.#
   
#####
   
  
  1. 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