Compare commits

..

No commits in common. "12f0be2a5013c92f666dc48809c27a25e9c5000b" and "8ece48dc88f6ce94cab3656cc75d350e6c07e940" have entirely different histories.

5 changed files with 25 additions and 79 deletions

View File

@ -3,7 +3,7 @@
Jour 21 du défi Advent Of Code pour l'année 2023 Jour 21 du défi Advent Of Code pour l'année 2023
""" """
import os import os
from aoc_utils.decorators import timeit from tqdm import tqdm
def read_sample(): def read_sample():
"""récupère les entrées depuis le fichier texte correspondant""" """récupère les entrées depuis le fichier texte correspondant"""
@ -23,11 +23,10 @@ def do_steps(sample, steps=26501365, ext=False):
if sample[i][j] == 'S': if sample[i][j] == 'S':
return (i, j) return (i, j)
def valid(pos, ext=False): def valid(pos):
if ext:
return True
return pos[0] >= 0 and pos[1] >= 0 and pos[0] < len_sample and pos[1] < len_sample0 return pos[0] >= 0 and pos[1] >= 0 and pos[0] < len_sample and pos[1] < len_sample0
def is_point(pos, ext=False): def is_point(pos, ext=False):
if not ext and valid(pos): if not ext and valid(pos):
if sample[pos[0]][pos[1]] == '.' or sample[pos[0]][pos[1]] == 'S': if sample[pos[0]][pos[1]] == '.' or sample[pos[0]][pos[1]] == 'S':
@ -40,62 +39,43 @@ def do_steps(sample, steps=26501365, ext=False):
def voisins(pos, ext=False): def voisins(pos, ext=False):
i, j = pos i, j = pos
v = [] v = []
if valid((i, j-1), ext=ext) and is_point((i, j-1), ext=ext): if valid((i, j-1)) and is_point((i, j-1), ext=ext):
v.append((i, j-1)) v.append((i, j-1))
if valid((i-1, j), ext=ext) and is_point((i-1, j), ext=ext): if valid((i-1, j)) and is_point((i-1, j), ext=ext):
v.append((i-1, j)) v.append((i-1, j))
if valid((i, j+1), ext=ext) and is_point((i, j+1), ext=ext): if valid((i, j+1)) and is_point((i, j+1), ext=ext):
v.append((i, j+1)) v.append((i, j+1))
if valid((i+1, j), ext=ext) and is_point((i+1, j), ext=ext): if valid((i+1, j)) and is_point((i+1, j), ext=ext):
v.append((i+1, j)) v.append((i+1, j))
return v return v
i, j = find_S() i, j = find_S()
pos_ts = {(i, j)} pos_ts = {(i, j): [(0, 0)]}
for i in range(steps): for i in tqdm(range(steps)):
new_pos_ts = set() new_pos_ts = {}
for pos in pos_ts: for pos in pos_ts.keys():
for p in voisins(pos, ext=ext): for p in voisins(pos, ext=ext):
new_pos_ts.add(p) mp = (p[0]%len_sample, p[1]%len_sample0)
tile = (p[0]//len_sample, p[1]//len_sample0)
if mp not in new_pos_ts.keys():
new_pos_ts[mp] = []
for elem in pos_ts[pos]:
t = (tile[0]+elem[0], tile[1]+elem[1])
if t not in new_pos_ts[mp]:
new_pos_ts[mp].append(t)
pos_ts = new_pos_ts pos_ts = new_pos_ts
return pos_ts return pos_ts
def lagrange_interpolation(points, x0):
result = 0
for i in range(len(points)):
temp = points[i][1]
for j in range(len(points)):
if j != i:
temp *= (x0 - points[j][0]) / (points[i][0] - points[j][0])
result += temp
return int(result)
@timeit
def part1(sample): def part1(sample):
"""Partie 1 du défi""" """Partie 1 du défi"""
return len(do_steps(sample, steps=64, ext=False)) return sum([len(i) for i in do_steps(sample, steps=64, ext=False).values()])
@timeit
def part2(sample): def part2(sample):
"""Partie 2 du défi""" """Partie 2 du défi"""
def challenge(steps): print("WARNING, this will take a lot of time (and could not even work)")
return len(do_steps(sample, steps=steps, ext=True)) return sum([len(i) for i in do_steps(sample, ext=True).values()])
half_size = len(sample)//2
size = len(sample)
points = [
(half_size, challenge(half_size)),
(half_size+size, challenge(half_size+size)),
(half_size+2*size, challenge(half_size+2*size))
]
return lagrange_interpolation(points, 26501365)
def main(): def main():

View File

@ -7,7 +7,7 @@
2020: ***~..................... 2020: ***~.....................
2021: *******~~~............... 2021: *******~~~...............
2022: ***************~.*..*.... 2022: ***************~.*..*....
2023: **********************~.. 2023: **********...............
.: nothing .: nothing
~: 1 star ~: 1 star
@ -20,17 +20,9 @@ Add this to your `.bashrc`:
AOC_PATH=$HOME/path/to/this/repo/ AOC_PATH=$HOME/path/to/this/repo/
alias aoc="$AOC_PATH/utils/cli.py" alias aoc="$AOC_PATH/utils/cli.py"
aoc-new () { aoc-new () {
# To create a new day
cd $AOC_PATH cd $AOC_PATH
PATH="$PATH:$AOC_PATH" PATH="$PATH:$AOC_PATH"
$AOC_PATH/utils/new_day.sh $AOC_PATH/new_day.sh
export PYTHONPATH="$PYTHONPATH:$AOC_PATH" PS1="$PS1[aoc] "
}
aoc-env () {
# To load the AoC environment
cd $AOC_PATH
PATH="$PATH:$AOC_PATH"
export PYTHONPATH="$PYTHONPATH:$AOC_PATH"
} }
``` ```

View File

View File

@ -1,13 +0,0 @@
arrows_dir ={
'^': (-1, 0),
'v': (1, 0),
'<': (0, -1),
'>': (0, 1)
}
cardinal_dir = [
(1, 0),
(-1,0),
(0, 1),
(0, -1)
]

View File

@ -1,13 +0,0 @@
from functools import cache, wraps
import time
def timeit(func):
@wraps(func)
def timeit_wrapper(*args, **kwargs):
start_time = time.perf_counter()
result = func(*args, **kwargs)
end_time = time.perf_counter()
total_time = end_time - start_time
print(f'===== {func.__name__}: {total_time:.4f}s =====')
return result
return timeit_wrapper