From b28f4986a7d4c8a543c36993d18952f304732b06 Mon Sep 17 00:00:00 2001 From: augustin64 Date: Tue, 12 Dec 2023 05:59:42 +0100 Subject: [PATCH] Add 2023 day 11 --- 2023/day11.py | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100755 2023/day11.py diff --git a/2023/day11.py b/2023/day11.py new file mode 100755 index 0000000..072fd87 --- /dev/null +++ b/2023/day11.py @@ -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() \ No newline at end of file