Add 2023 day 11
This commit is contained in:
parent
c582f01f78
commit
b28f4986a7
97
2023/day11.py
Executable file
97
2023/day11.py
Executable 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()
|
Loading…
Reference in New Issue
Block a user