Add 2022 day 09
This commit is contained in:
parent
09be1324f2
commit
19ef7c6b94
159
2022/day09.py
Executable file
159
2022/day09.py
Executable file
@ -0,0 +1,159 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
"""
|
||||||
|
Jour 09 du défi Advent Of Code pour l'année 2022
|
||||||
|
"""
|
||||||
|
|
||||||
|
directions = {"R": (0, 1), "L": (0, -1), "U": (-1, 0), "D": (1, 0)}
|
||||||
|
|
||||||
|
def read_sample():
|
||||||
|
"""récupère les entrées depuis le fichier texte correspondant"""
|
||||||
|
with open('inputs/day09.txt', 'r') as f:
|
||||||
|
sample = f.read().split('\n')
|
||||||
|
sample = [ (i[0], int(i.split(" ")[1])) for i in sample if i != '' ]
|
||||||
|
return sample
|
||||||
|
|
||||||
|
def unique(liste):
|
||||||
|
liste2 = []
|
||||||
|
for i in liste:
|
||||||
|
if i not in liste2:
|
||||||
|
liste2.append(i)
|
||||||
|
|
||||||
|
return liste2
|
||||||
|
|
||||||
|
def print_vis(visited, vis_2, head=None):
|
||||||
|
max_i = max(i[0] for i in vis_2)
|
||||||
|
max_j = max(i[1] for i in vis_2)
|
||||||
|
for i in range(max_i):
|
||||||
|
for j in range(max_j):
|
||||||
|
if head is not None and head[0]==i and head[1]==j:
|
||||||
|
print('H', end='')
|
||||||
|
if f"{i}:{j}" in visited:
|
||||||
|
print('#', end='')
|
||||||
|
else:
|
||||||
|
print(".", end='')
|
||||||
|
print()
|
||||||
|
print()
|
||||||
|
|
||||||
|
def part1(sample):
|
||||||
|
"""Partie 1 du défi"""
|
||||||
|
visited = ['0:0']
|
||||||
|
vis_2 = [(0,0)]
|
||||||
|
pos_h = (0, 0)
|
||||||
|
pos_t = (0, 0)
|
||||||
|
for line in sample:
|
||||||
|
for i in range(line[1]):
|
||||||
|
if line[0] == "L":
|
||||||
|
pos_h = (pos_h[0]-1, pos_h[1])
|
||||||
|
elif line[0] == "R":
|
||||||
|
pos_h = (pos_h[0]+1, pos_h[1])
|
||||||
|
elif line[0] == "U":
|
||||||
|
pos_h = (pos_h[0], pos_h[1]+1)
|
||||||
|
elif line[0] == "D":
|
||||||
|
pos_h = (pos_h[0], pos_h[1]-1)
|
||||||
|
|
||||||
|
dx = abs(pos_h[0]-pos_t[0])
|
||||||
|
dy = abs(pos_h[1]-pos_t[1])
|
||||||
|
if (dx+dy==2 and dy != 1):
|
||||||
|
if line[0] == "L":
|
||||||
|
pos_t = (pos_t[0]-1, pos_t[1])
|
||||||
|
elif line[0] == "R":
|
||||||
|
pos_t = (pos_t[0]+1, pos_t[1])
|
||||||
|
elif line[0] == "U":
|
||||||
|
pos_t = (pos_t[0], pos_t[1]+1)
|
||||||
|
elif line[0] == "D":
|
||||||
|
pos_t = (pos_t[0], pos_t[1]-1)
|
||||||
|
elif (dx==2 and dy==1):
|
||||||
|
if line[0] == "L":
|
||||||
|
pos_t = (pos_t[0]-1, pos_t[1])
|
||||||
|
elif line[0] == "R":
|
||||||
|
pos_t = (pos_t[0]+1, pos_t[1])
|
||||||
|
elif line[0] == "U":
|
||||||
|
pos_t = (pos_t[0], pos_t[1]+1)
|
||||||
|
elif line[0] == "D":
|
||||||
|
pos_t = (pos_t[0], pos_t[1]-1)
|
||||||
|
pos_t = (pos_t[0], pos_h[1])
|
||||||
|
elif (dx==1 and dy==2):
|
||||||
|
if line[0] == "L":
|
||||||
|
pos_t = (pos_t[0]-1, pos_t[1])
|
||||||
|
elif line[0] == "R":
|
||||||
|
pos_t = (pos_t[0]+1, pos_t[1])
|
||||||
|
elif line[0] == "U":
|
||||||
|
pos_t = (pos_t[0], pos_t[1]+1)
|
||||||
|
elif line[0] == "D":
|
||||||
|
pos_t = (pos_t[0], pos_t[1]-1)
|
||||||
|
pos_t = (pos_h[0], pos_t[1])
|
||||||
|
|
||||||
|
visited.append(f"{pos_t[0]}:{pos_t[1]}")
|
||||||
|
vis_2.append(pos_t)
|
||||||
|
|
||||||
|
return len(unique(visited))
|
||||||
|
|
||||||
|
|
||||||
|
def follow(pos, j):
|
||||||
|
a = pos[j-1]
|
||||||
|
b = pos[j]
|
||||||
|
|
||||||
|
dx = abs(a[0]-b[0])
|
||||||
|
dy = abs(a[1]-b[1])
|
||||||
|
|
||||||
|
if dy <= 1 and dx <= 1:
|
||||||
|
return # Rope already touching
|
||||||
|
|
||||||
|
if dx == 0:
|
||||||
|
if a[1] > b[1]:
|
||||||
|
pos[j] = (b[0], b[1]+1)
|
||||||
|
return
|
||||||
|
pos[j] = (b[0], b[1]-1)
|
||||||
|
return
|
||||||
|
if dy == 0:
|
||||||
|
if a[0] > b[0]:
|
||||||
|
pos[j] = (b[0]+1, b[1])
|
||||||
|
return
|
||||||
|
pos[j] = (b[0]-1, b[1])
|
||||||
|
return
|
||||||
|
|
||||||
|
if a[0] > b[0] and a[1] > b[1]:
|
||||||
|
pos[j] = (b[0] + 1, b[1] + 1)
|
||||||
|
return
|
||||||
|
if a[0] > b[0] and a[1] < b[1]:
|
||||||
|
pos[j] = (b[0] + 1, b[1] - 1)
|
||||||
|
return
|
||||||
|
if a[0] < b[0] and a[1] > b[1]:
|
||||||
|
pos[j] = (b[0] - 1, b[1] + 1)
|
||||||
|
return
|
||||||
|
if a[0] < b[0] and a[1] < b[1]:
|
||||||
|
pos[j] = (b[0] - 1, b[1] - 1)
|
||||||
|
return
|
||||||
|
|
||||||
|
print(f"Situation non prise en compte: head:{a}, tail:{b}")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def part2(sample):
|
||||||
|
"""Partie 2 du défi"""
|
||||||
|
visited = ['0:0']
|
||||||
|
tail = 10
|
||||||
|
positions = [(0, 0) for i in range(tail)]
|
||||||
|
|
||||||
|
for line in sample:
|
||||||
|
for i in range(line[1]):
|
||||||
|
positions[0] = (positions[0][0]+directions[line[0]][0], positions[0][1]+directions[line[0]][1])
|
||||||
|
|
||||||
|
for j in range(1, tail):
|
||||||
|
follow(positions, j)
|
||||||
|
|
||||||
|
if f"{positions[tail-1][0]}:{positions[tail-1][1]}" not in visited:
|
||||||
|
visited.append(f"{positions[tail-1][0]}:{positions[tail-1][1]}")
|
||||||
|
|
||||||
|
return len(visited)
|
||||||
|
|
||||||
|
|
||||||
|
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