79 lines
2.4 KiB
Python
Executable File
79 lines
2.4 KiB
Python
Executable File
#!/usr/bin/python3
|
|
"""
|
|
Jour 03 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", "day03.txt")
|
|
with open(filename, 'r') as f:
|
|
sample = f.read().split('\n')
|
|
sample = [ i for i in sample if i != '' ]
|
|
return sample
|
|
|
|
def get_numbers(sample):
|
|
numbers = []
|
|
cur_number = 0
|
|
cur_number_start = -1
|
|
for i in range(len(sample)):
|
|
if (cur_number_start != -1):
|
|
numbers.append((cur_number, i-1, cur_number_start, len(sample[0])))
|
|
cur_number = 0
|
|
cur_number_start = -1
|
|
for j in range(len(sample[i])):
|
|
if (sample[i][j] <= '9' and sample[i][j] >= '0'):
|
|
if cur_number_start == -1:
|
|
cur_number_start = j
|
|
cur_number = cur_number*10 + int(sample[i][j])
|
|
elif cur_number_start != -1:
|
|
numbers.append((cur_number, i, cur_number_start, j-1))
|
|
cur_number = 0
|
|
cur_number_start = -1
|
|
return numbers
|
|
|
|
def is_symbol_adjacent(number, sample):
|
|
for i in range(max(0, number[1]-1), min(number[1]+2, len(sample)-1)):
|
|
for j in range(max(0, number[2]-1), min(len(sample[0])-1, number[3]+2)):
|
|
if sample[i][j] != '.' and not (sample[i][j] <= '9' and sample[i][j] >= '0'):
|
|
return True, (sample[i][j], i, j)
|
|
return False, ('.', 0, 0)
|
|
|
|
def part1(sample):
|
|
"""Partie 1 du défi"""
|
|
numbers = get_numbers(sample)
|
|
not_adj = []
|
|
for number in numbers:
|
|
if is_symbol_adjacent(number, sample)[0]:
|
|
not_adj.append(number[0])
|
|
return sum(not_adj)
|
|
|
|
|
|
|
|
def part2(sample):
|
|
"""Partie 2 du défi"""
|
|
numbers = get_numbers(sample)
|
|
geared = {}
|
|
for number in numbers:
|
|
val, symb = is_symbol_adjacent(number, sample)
|
|
if symb[0] == '*':
|
|
if (symb[1], symb[2]) not in geared.keys():
|
|
geared[(symb[1], symb[2])] = []
|
|
geared[(symb[1], symb[2])].append(number[0])
|
|
|
|
mults = []
|
|
for key in geared.keys():
|
|
if len(geared[key]) >= 2:
|
|
mults.append(geared[key][0]*geared[key][1])
|
|
|
|
return sum(mults)
|
|
|
|
|
|
def main():
|
|
"""Fonction principale"""
|
|
sample = read_sample()
|
|
print(f"part1: {part1(sample)}")
|
|
print(f"part2: {part2(sample)}")
|
|
|
|
if __name__ == "__main__":
|
|
main() |