Skip to content

Instantly share code, notes, and snippets.

@jedisct1
Created April 17, 2011 11:33
Show Gist options
  • Save jedisct1/923958 to your computer and use it in GitHub Desktop.
Save jedisct1/923958 to your computer and use it in GitHub Desktop.
My simple "Escape from Zurg" solver
require "pp"
DUDES = [ { name: "Alice", time: 5 },
{ name: "Bob", time: 10 },
{ name: "Candace", time: 20 },
{ name: "Dave", time: 25 } ]
INITIAL_STATE = { left: [ ], right: (0...DUDES.length).to_a, time_left: 60 }
def backward(state, path)
time_left, left, right = state[:time_left], state[:left], state[:right]
return [path] if right.empty?
left_candidates = left.select { |x| DUDES[x][:time] <= time_left }
left_candidates.inject([ ]) do |acc, p|
time_for_p = DUDES[p][:time]
new_left, new_right = left - [p], right + [p]
acc + forward({ time_left: time_left - time_for_p,
left: new_left, right: new_right },
path + ["#{DUDES[p][:name]} goes backward"])
end
end
def forward(state, path)
time_left, left, right = state[:time_left], state[:left], state[:right]
right_candidates = right.select { |x| DUDES[x][:time] <= time_left }
right_candidates.inject([ ]) do |acc, p1|
time_for_p1 = DUDES[p1][:time]
right_without_p1 = (right - [p1]).select do |x|
DUDES[x][:time] <= time_for_p1
end
acc + right_without_p1.inject([ ]) do |acc, p2|
new_left, new_right = left + [p1, p2], right - [p1, p2]
acc + backward({ time_left: time_left - time_for_p1,
left: new_left, right: new_right },
path + ["#{DUDES[p1][:name]} and #{DUDES[p2][:name]} go forward"])
end
end
end
pp forward(INITIAL_STATE, [ ])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment