Add 2023 day 11

This commit is contained in:
augustin64 2023-12-12 05:59:42 +01:00
parent c582f01f78
commit b28f4986a7

97
2023/day11.py Executable file
View File

@ -0,0 +1,97 @@
#!/usr/bin/python3
"""
Jour 11 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", "day11.txt")
with open(filename, 'r') as f:
sample = f.read().split('\n')
sample = [ [j for j in i] for i in sample if i != '' ]
return sample
def expansion(sample):
doubled_rows = []
for i in range(len(sample)):
empty = True
for j in range(len(sample[0])):
if sample[i][j] != ".":
empty = False
break
if empty:
doubled_rows.append(i)
doubled_cols = []
for j in range(len(sample[0])):
empty = True
for i in range(len(sample)):
if sample[i][j] != ".":
empty = False
break
if empty:
doubled_cols.append(j)
return (doubled_rows, doubled_cols)
def list_galaxies(sample):
galaxies = []
for i in range(len(sample)):
for j in range(len(sample[0])):
if sample[i][j] != '.':
galaxies.append((i, j))
return galaxies
def distance(g1, g2):
x1, y1 = g1
x2, y2 = g2
return abs((x2-x1))+abs((y2-y1))
def real(point, doubled_rows, doubled_cols, exp=1):
x, y = point
x1 = x + exp*len([i for i in doubled_rows if i < x])
y1 = y + exp*len([i for i in doubled_cols if i < y])
return x1, y1
def part1(sample):
"""Partie 1 du défi"""
orig = list_galaxies(sample)
doubled_rows, doubled_cols = expansion(sample)
galaxies = [real(point, doubled_rows, doubled_cols) for point in orig]
distances = []
for i in range(len(galaxies)):
for j in range(len(galaxies)):
if i < j:
distances.append(distance(galaxies[i], galaxies[j]))
return sum(distances)
def part2(sample):
"""Partie 2 du défi"""
orig = list_galaxies(sample)
doubled_rows, doubled_cols = expansion(sample)
galaxies = [real(point, doubled_rows, doubled_cols, exp=999999) for point in orig]
distances = []
for i in range(len(galaxies)):
for j in range(len(galaxies)):
if i < j:
distances.append(distance(galaxies[i], galaxies[j]))
return sum(distances)
def main():
"""Fonction principale"""
sample = read_sample()
print(f"part1: {part1(sample)}")
print(f"part2: {part2(sample)}")
if __name__ == "__main__":
main()