jour 20
This commit is contained in:
144
day20.py
Normal file
144
day20.py
Normal file
@ -0,0 +1,144 @@
|
||||
l = ["###############",
|
||||
"#...#...#.....#",
|
||||
"#.#.#.#.#.###.#",
|
||||
"#S#...#.#.#...#",
|
||||
"#######.#.#.###",
|
||||
"#######.#.#...#",
|
||||
"#######.#.###.#",
|
||||
"###..E#...#...#",
|
||||
"###.#######.###",
|
||||
"#...###...#...#",
|
||||
"#.#####.#.###.#",
|
||||
"#.#...#.#.#...#",
|
||||
"#.#.#.#.#.#.###",
|
||||
"#...#...#...###",
|
||||
"###############"]
|
||||
|
||||
with open('day20.txt') as f:
|
||||
l = f.read().splitlines()
|
||||
|
||||
|
||||
|
||||
def neighbours(l,x,y):
|
||||
neighb = []
|
||||
if l[x-1][y] == "." or l[x-1][y] == "E" :
|
||||
neighb.append((x-1,y))
|
||||
if l[x+1][y] == "." or l[x+1][y] == "E":
|
||||
neighb.append((x+1,y))
|
||||
if l[x][y-1] == "." or l[x][y-1] == "E":
|
||||
neighb.append((x,y-1))
|
||||
if l[x][y+1] == "." or l[x][y+1] == "E":
|
||||
neighb.append((x,y+1))
|
||||
return neighb
|
||||
|
||||
def in_bound(l,x,y):
|
||||
if x >= 1 and x <= len(l) - 2 :
|
||||
if y >= 1 and y <= len(l[0]) - 2 :
|
||||
return True
|
||||
return False
|
||||
|
||||
def is_wall(l,x,y):
|
||||
if (in_bound(l,x-1,y) and l[x-1][y]=="#") or (in_bound(l,x+1,y) and l[x+1][y]=="#"):
|
||||
if (in_bound(l,x,y-1) and l[x][y-1]=="#") or (in_bound(l,x,y+1) and l[x][y+1]=="#"):
|
||||
# print(x,y)
|
||||
return False
|
||||
if in_bound(l,x,y):
|
||||
return True
|
||||
|
||||
|
||||
|
||||
start = None
|
||||
end = None
|
||||
walls = []
|
||||
path = []
|
||||
|
||||
for i in range(len(l)):
|
||||
for j in range(len(l[0])):
|
||||
if l[i][j] == "S":
|
||||
start = (i,j)
|
||||
elif l[i][j] == "E":
|
||||
end = (i,j)
|
||||
elif l[i][j] == "#" and is_wall(l,i,j):
|
||||
walls.append((i,j))
|
||||
|
||||
# print(in_bound(l,0,0))
|
||||
# print(walls)
|
||||
|
||||
|
||||
path.append(start)
|
||||
# premier parcours
|
||||
print(end)
|
||||
while path[-1]!=end:
|
||||
x,y = path[-1]
|
||||
neighb = neighbours(l,x,y)
|
||||
# print(x,y)
|
||||
for v in neighb:
|
||||
if v not in path:
|
||||
path.append(v)
|
||||
# print(path)
|
||||
print(len(path))
|
||||
print(len(walls))
|
||||
|
||||
# dmax = len(path)
|
||||
shortcuts = {}
|
||||
|
||||
# for wall in walls:
|
||||
# xw,yw = wall
|
||||
# print(wall)
|
||||
# if (xw-1,yw) in path and (xw+1,yw) in path:
|
||||
# a,b = path.index((xw-1,yw)), path.index((xw+1,yw))
|
||||
# if a < b:
|
||||
# save = len(path[a:b]) - 2
|
||||
# else :
|
||||
# save = len(path[b:a]) - 2
|
||||
# if save not in shortcuts.keys():
|
||||
# shortcuts[save] = 1
|
||||
# else :
|
||||
# shortcuts[save] += 1
|
||||
|
||||
# # print(save)
|
||||
# elif (xw,yw-1) in path and (xw,yw+1) in path:
|
||||
# a,b = path.index((xw,yw-1)), path.index((xw,yw+1))
|
||||
# if a < b:
|
||||
# save = len(path[a:b]) - 2
|
||||
# else :
|
||||
# save = len(path[b:a]) - 2
|
||||
# if save not in shortcuts.keys():
|
||||
# shortcuts[save] = 1
|
||||
# else :
|
||||
# shortcuts[save] += 1
|
||||
cnt = 0
|
||||
for i in range(len(path)):
|
||||
x1,y1 = path[i]
|
||||
for j in range(i+1,len(path)):
|
||||
x2,y2 = path[j]
|
||||
d = abs(x2-x1) + abs(y2-y1)
|
||||
if d <= 20:
|
||||
save = j-i -d
|
||||
# if save not in shortcuts.keys():
|
||||
# shortcuts[save] = 1
|
||||
# else :
|
||||
# shortcuts[save] += 1
|
||||
if save >= 100 :
|
||||
cnt+=1
|
||||
|
||||
# print(save)
|
||||
# print(shortcuts[50],shortcuts[52],shortcuts[54],shortcuts[76])
|
||||
# print(shortcuts)
|
||||
# cnt = 0
|
||||
# for short in shortcuts.keys():
|
||||
# if short >= 100:
|
||||
# cnt += shortcuts[short]
|
||||
print(cnt)
|
||||
|
||||
# queue = [(start, 0)]
|
||||
# visited = set()
|
||||
|
||||
# while queue:
|
||||
# curr, dist = queue.pop()
|
||||
# x, y = curr
|
||||
|
||||
# for xn, yn in neighbours(x, y):
|
||||
# if (xn, yn) in visited or not in_bound(xn, yn):
|
||||
# continue
|
||||
# queue.append(((xn,yn),dist+1))
|
||||
Reference in New Issue
Block a user