File tree 2 files changed +28
-4
lines changed
2 files changed +28
-4
lines changed Original file line number Diff line number Diff line change 12
12
cxy = nodes . select { |k , v | !v [ :visited ] } . min_by { |k , v | v [ :dist ] } [ 0 ]
13
13
cv = grid [ *cxy ]
14
14
15
+ p nodes [ cxy ] [ :dist ] and break if cv == "E"
16
+
15
17
grid . each_neighbor ( *cxy , diags : false ) do |nxy , nv |
16
18
nodes [ nxy ] ||= { visited : false , dist : Float ::INFINITY }
17
19
21
23
end
22
24
23
25
nodes [ cxy ] [ :visited ] = true
24
-
25
- break if grid [ *cxy ] == "E"
26
26
end
27
-
28
- p nodes [ grid . index ( "E" ) ] [ :dist ]
Original file line number Diff line number Diff line change
1
+ require "set"
2
+ require_relative "../lib/grid"
3
+
4
+ grid = Grid . from_file ( "12/input.txt" )
5
+ nodes = { grid . index ( "E" ) => { visited : false , dist : 0 } }
6
+ heights =
7
+ { "S" => 0 , "E" => 25 } . tap do |h |
8
+ ( "a" .."z" ) . each_with_index { |v , i | h [ v ] = i }
9
+ end
10
+
11
+ loop do
12
+ cxy = nodes . select { |k , v | !v [ :visited ] } . min_by { |k , v | v [ :dist ] } [ 0 ]
13
+ cv = grid [ *cxy ]
14
+
15
+ p nodes [ cxy ] [ :dist ] and break if cv == "a"
16
+
17
+ grid . each_neighbor ( *cxy , diags : false ) do |nxy , nv |
18
+ nodes [ nxy ] ||= { visited : false , dist : Float ::INFINITY }
19
+
20
+ if heights [ cv ] - heights [ nv ] <= 1
21
+ nodes [ nxy ] [ :dist ] = [ nodes [ nxy ] [ :dist ] , nodes [ cxy ] [ :dist ] + 1 ] . min
22
+ end
23
+ end
24
+
25
+ nodes [ cxy ] [ :visited ] = true
26
+ end
You can’t perform that action at this time.
0 commit comments