parent
9530c0c866
commit
2a88514e06
@ -0,0 +1,44 @@
|
||||
require 'digest/md5'
|
||||
|
||||
State = Struct.new(:location, :path)
|
||||
|
||||
Maze = Struct.new(:passcode, :size) do
|
||||
def walk
|
||||
return enum_for(__method__) unless block_given?
|
||||
|
||||
states = [State.new([0,0], '')]
|
||||
until states.empty?
|
||||
state = states.shift
|
||||
yield state
|
||||
|
||||
hash = Digest::MD5.hexdigest("#{passcode}#{state.path}")[0,4]
|
||||
open_doors = %i[ U D L R ].select.with_index {|_, index|
|
||||
'bcdef'.include?(hash[index])
|
||||
}
|
||||
|
||||
{
|
||||
U: [ 0, -1],
|
||||
D: [ 0, 1],
|
||||
L: [-1, 0],
|
||||
R: [ 1, 0],
|
||||
}.select {|door, _|
|
||||
open_doors.include?(door)
|
||||
}.map {|door, (dx, dy)|
|
||||
x = state.location[0] + dx
|
||||
y = state.location[1] + dy
|
||||
|
||||
location = [x, y]
|
||||
path = state.path + door.to_s
|
||||
State.new(location, path)
|
||||
}.select {|state|
|
||||
state.location.all? {|i| (0...size).cover?(i) }
|
||||
}.each do |state|
|
||||
states << state
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
p Maze.new('yjjvjgan', 4).walk.find {|state|
|
||||
state.location == [3, 3]
|
||||
}
|
Loading…
Reference in new issue