Add 2023 day 10
This commit is contained in:
parent
aa2c1012c9
commit
689eb31357
159
2023/day10.py
Executable file
159
2023/day10.py
Executable file
@ -0,0 +1,159 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
"""
|
||||||
|
Jour 10 du défi Advent Of Code pour l'année 2023
|
||||||
|
"""
|
||||||
|
|
||||||
|
def read_sample():
|
||||||
|
"""récupère les entrées depuis le fichier texte correspondant"""
|
||||||
|
with open('inputs/day10.txt', 'r') as f:
|
||||||
|
sample = f.read().split('\n')
|
||||||
|
sample = [ [j for j in i] for i in sample if i != '' ]
|
||||||
|
return sample
|
||||||
|
|
||||||
|
|
||||||
|
directions = {
|
||||||
|
"nw": "J",
|
||||||
|
"ns": "|",
|
||||||
|
"ne": "L",
|
||||||
|
"ws": "7",
|
||||||
|
"we": "-",
|
||||||
|
"se": "F"
|
||||||
|
}
|
||||||
|
|
||||||
|
def find_S(sample):
|
||||||
|
for i in range(len(sample)):
|
||||||
|
for j in range(len(sample[0])):
|
||||||
|
if sample[i][j] == 'S':
|
||||||
|
return i, j
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
|
||||||
|
def next_move(pos, sample, prev_move):
|
||||||
|
match sample[pos[0]][pos[1]]:
|
||||||
|
case '.':
|
||||||
|
print("Out of circuit !", prev_move, pos)
|
||||||
|
raise NotImplementedError
|
||||||
|
case '|':
|
||||||
|
return prev_move
|
||||||
|
case '-':
|
||||||
|
return prev_move
|
||||||
|
case 'L':
|
||||||
|
if prev_move == (1, 0):
|
||||||
|
return (0, 1)
|
||||||
|
elif prev_move == (0, -1):
|
||||||
|
return (-1, 0)
|
||||||
|
print("I am lost (0) !", prev_move, pos)
|
||||||
|
raise NotImplementedError
|
||||||
|
case 'J':
|
||||||
|
if prev_move == (1, 0):
|
||||||
|
return (0, -1)
|
||||||
|
elif prev_move == (0, 1):
|
||||||
|
return (-1, 0)
|
||||||
|
print("I am lost (1) !", prev_move, pos)
|
||||||
|
raise NotImplementedError
|
||||||
|
case '7':
|
||||||
|
if prev_move == (-1, 0):
|
||||||
|
return (0, -1)
|
||||||
|
elif prev_move == (0, 1):
|
||||||
|
return (1, 0)
|
||||||
|
print("I am lost (2) !", prev_move, pos)
|
||||||
|
raise NotImplementedError
|
||||||
|
case 'F':
|
||||||
|
if prev_move == (-1, 0):
|
||||||
|
return (0, 1)
|
||||||
|
elif prev_move == (0, -1):
|
||||||
|
return (1, 0)
|
||||||
|
print("I am lost (3) !", prev_move, pos)
|
||||||
|
raise NotImplementedError
|
||||||
|
case 'S':
|
||||||
|
if pos[0] > 0 and (sample[pos[0]-1][pos[1]] in ['|', 'F', '7']): # Up
|
||||||
|
return (-1, 0)
|
||||||
|
if pos[1] > 0 and (sample[pos[0]][pos[1]-1] in ['-', 'L', 'F']): # Left
|
||||||
|
return (0, -1)
|
||||||
|
if pos[0] < len(sample) and (sample[pos[0]+1][pos[1]] in ['|', 'L', 'J']): # Down
|
||||||
|
return (1, 0)
|
||||||
|
if pos[1] < len(sample[0]) and (sample[pos[0]][pos[1]+1] in ['-', '7', 'J']): # Right
|
||||||
|
return (0, 1)
|
||||||
|
print("I am lost (4) !", prev_move, pos)
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
|
||||||
|
def find_circuit(starting_point, sample):
|
||||||
|
elems = []
|
||||||
|
pos = starting_point
|
||||||
|
prev_move = None
|
||||||
|
while pos not in elems:
|
||||||
|
elems.append(pos)
|
||||||
|
prev_move = next_move(pos, sample, prev_move)
|
||||||
|
pos = (pos[0] + prev_move[0], pos[1] + prev_move[1])
|
||||||
|
|
||||||
|
return elems
|
||||||
|
|
||||||
|
|
||||||
|
def simplify(sample, circuit):
|
||||||
|
for i in range(len(sample)):
|
||||||
|
for j in range(len(sample[0])):
|
||||||
|
if (i, j) not in circuit:
|
||||||
|
sample[i][j] = '.'
|
||||||
|
return sample
|
||||||
|
|
||||||
|
|
||||||
|
def find_enclosed(sample):
|
||||||
|
down = ['|', '7', 'F']
|
||||||
|
enclosed = []
|
||||||
|
|
||||||
|
for i in range(len(sample)):
|
||||||
|
up = False
|
||||||
|
for j in range(len(sample[0])):
|
||||||
|
if sample[i][j] in down:
|
||||||
|
up = not up
|
||||||
|
if up and sample[i][j] == '.':
|
||||||
|
enclosed.append((i, j))
|
||||||
|
|
||||||
|
return enclosed
|
||||||
|
|
||||||
|
|
||||||
|
def find_s_type(sample, pos):
|
||||||
|
it = []
|
||||||
|
if pos[0] > 0 and (sample[pos[0]-1][pos[1]] in ['|', 'F', '7']): # Up
|
||||||
|
it.append('n')
|
||||||
|
if pos[1] > 0 and (sample[pos[0]][pos[1]-1] in ['-', 'L', 'F']): # Left
|
||||||
|
it.append('w')
|
||||||
|
if pos[0] < len(sample) and (sample[pos[0]+1][pos[1]] in ['|', 'L', 'J']): # Down
|
||||||
|
it.append('s')
|
||||||
|
if pos[1] < len(sample[0]) and (sample[pos[0]][pos[1]+1] in ['-', '7', 'J']): # Right
|
||||||
|
it.append('e')
|
||||||
|
|
||||||
|
return directions[it[0]+it[1]]
|
||||||
|
|
||||||
|
|
||||||
|
def part1(sample):
|
||||||
|
"""Partie 1 du défi"""
|
||||||
|
pos_S = find_S(sample)
|
||||||
|
circuit = find_circuit(pos_S, sample)
|
||||||
|
|
||||||
|
return int(len(circuit)/2)
|
||||||
|
|
||||||
|
|
||||||
|
def part2(sample):
|
||||||
|
"""Partie 2 du défi"""
|
||||||
|
pos_S = find_S(sample)
|
||||||
|
circuit = find_circuit(pos_S, sample)
|
||||||
|
|
||||||
|
S_type = find_s_type(sample, pos_S)
|
||||||
|
sample[pos_S[0]][pos_S[1]] = S_type
|
||||||
|
|
||||||
|
sample2 = simplify(sample, circuit)
|
||||||
|
enclosed = find_enclosed(sample2)
|
||||||
|
|
||||||
|
return len(enclosed)
|
||||||
|
|
||||||
|
|
||||||
|
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