day 12, at last, some graph algorithm

This commit is contained in:
setop 2022-12-13 01:03:06 +01:00
parent 6a9d3da725
commit cfb99d24f4
8 changed files with 85 additions and 0 deletions

BIN
d12/P.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

BIN
d12/Q.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

BIN
d12/R.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

BIN
d12/S.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

BIN
d12/T.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

1
d12/cmd.txt Normal file
View File

@ -0,0 +1 @@
pandoc -o fail.pdf -t pdf fail.md

34
d12/fail.md Normal file
View File

@ -0,0 +1,34 @@
I have only on patch of P
![](P.png)
\newpage
So I have to choose this patch of Q
![](Q.png)
\newpage
Then this patch of R
![](R.png)
\newpage
then this patch of S
![](S.png)
\newpage
But then, this patch of S is not connected to the patch of T
![](T.png)
I feel like i'm stucked :(
But actually, [not](https://www.reddit.com/r/adventofcode/comments/zjqz5y/2022_day_12_is_my_input_invalid_or/)

50
d12/run.py Normal file
View File

@ -0,0 +1,50 @@
import sys
import networkx as netx
M = [ list(l) for l in sys.stdin.read().splitlines() ]
H = len(M)
W = len(M[0])
START = tuple()
END = tuple()
G = netx.DiGraph()
for x in range(H):
for y in range(W):
k = (x,y)
v = M[x][y]
if v == 'S':
START = k
v = 'a'
if v == 'E':
END = k
v = 'z'
v = ord(v)
for dx,dy in [(-1,0),(1,0),(0,-1),(0,1)]:
nx, ny = (x+dx, y+dy)
if nx>=0 and nx<H and ny>=0 and ny<W:
nk = (nx,ny)
nv = M[nx][ny]
if nv == 'S':
nv = 'a'
if nv == 'E':
nv = 'z'
nv = ord(nv)
dv = nv - v
if dv <=1: # can go down !
G.add_edge(k,nk)
print(G)
# part 1
S = netx.shortest_path(G, START, END)
print(len(S), "=>", len(S)-1)
for (x,y) in S:
M[x][y] = "\033[30;43m"+M[x][y].upper()+"\033[0m"
print("\n".join("".join(l) for l in M))
# part 2
R = []
for x in range(H):
S = netx.shortest_path(G, (x,0), END)
R.append(len(S)-1)
print(min(R))