Add 2023 day 08
This commit is contained in:
parent
b932fe0657
commit
26ba2304d9
67
2023/day08.py
Executable file
67
2023/day08.py
Executable file
@ -0,0 +1,67 @@
|
||||
#!/usr/bin/python3
|
||||
"""
|
||||
Jour 08 du défi Advent Of Code pour l'année 2023
|
||||
"""
|
||||
|
||||
def gcd(a, b):
|
||||
while b:
|
||||
a, b = b, a % b
|
||||
return a
|
||||
|
||||
def lcm(a, b):
|
||||
return (a * b) // gcd(a, b)
|
||||
|
||||
def lcm_of_list(numbers):
|
||||
result = 1
|
||||
for num in numbers:
|
||||
result = lcm(result, num)
|
||||
return result
|
||||
|
||||
|
||||
|
||||
def read_sample():
|
||||
"""récupère les entrées depuis le fichier texte correspondant"""
|
||||
with open('inputs/day08.txt', 'r') as f:
|
||||
sample = f.read().split('\n')
|
||||
sample = [ i for i in sample if i != '' ]
|
||||
return sample
|
||||
|
||||
def parse_sample(sample):
|
||||
instructions = sample[0]
|
||||
mappings = {
|
||||
i.split(" = ")[0]: (i.split(" = ")[1].split(", ")[0].replace("(", ""), i.split(" = ")[1].split(", ")[1].replace(")", ""))
|
||||
for i in (sample[1:]) if i != ""
|
||||
}
|
||||
return instructions, mappings
|
||||
|
||||
def number_steps(instructions, mappings, pos, untilZZZ=True):
|
||||
step = 0
|
||||
instr = {
|
||||
"R": 1, "L": 0
|
||||
}
|
||||
while (pos[-1] != 'Z') or (untilZZZ and pos != "ZZZ"):
|
||||
pos = mappings[pos][instr[instructions[step%len(instructions)]]]
|
||||
step += 1
|
||||
return step
|
||||
|
||||
def part1(sample):
|
||||
"""Partie 1 du défi"""
|
||||
instructions, mappings = parse_sample(sample)
|
||||
return number_steps(instructions, mappings, "AAA")
|
||||
|
||||
def part2(sample):
|
||||
"""Partie 2 du défi"""
|
||||
instructions, mappings = parse_sample(sample)
|
||||
a_ending = [i for i in mappings.keys() if i[-1] == 'A']
|
||||
steps = [number_steps(instructions, mappings, i, untilZZZ=False) for i in a_ending]
|
||||
return lcm_of_list(steps)
|
||||
|
||||
|
||||
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