avoid use of global variables; it is more rubyish to represent a graph as a class

This commit is contained in:
TimoSci
2019-12-08 13:07:44 +01:00
parent 70ddf46cb3
commit 1f6cf7d460

View File

@@ -2,35 +2,38 @@ def person_is_seller?(name)
name[-1] == "m"
end
@graph = {}
class Graph < Hash
def search(name)
search_queue = []
search_queue += self[name]
# This array is how you keep track of which people you've searched before.
searched = {}
# %w(string1 string2 ...) is a shorter way to define arrays of strings
@graph["you"] = %w(alice bob claire)
@graph["bob"] = %w(anuj peggy)
@graph["alice"] = %w(peggy)
@graph["claire"] = %w(thom jonny)
@graph["anuj"] = []
@graph["peggy"] = []
@graph["thom"] = []
@graph["jonny"] = []
until search_queue.empty?
pp searched
person = search_queue.shift
# Only search this person if you haven't already searched them.
next if searched[person]
return person if yield person
search_queue += self[person]
# Marks this person as searched
searched[person] = true
end
def search(name)
search_queue = []
search_queue += @graph[name]
# This array is how you keep track of which people you've searched before.
searched = {}
until search_queue.empty?
person = search_queue.shift
# Only search this person if you haven't already searched them.
next if searched[person]
return person if yield person
search_queue += @graph[person]
# Marks this person as searched
searched[person] = true
false
end
false
end
search("you"){|person| person_is_seller?(person) }.tap{|person| puts "#{person} is a mango seller!" if person}
# %w(string1 string2 ...) is a shorter way to define arrays of strings
graph = Graph.new
graph["you"] = %w(alice bob claire)
graph["bob"] = %w(anuj peggy)
graph["alice"] = %w(peggy)
graph["claire"] = %w(thom jonny)
graph["anuj"] = []
graph["peggy"] = []
graph["thom"] = []
graph["jonny"] = []
graph.search("you"){|person| person_is_seller?(person) }.tap{|person| puts "#{person} is a mango seller!" if person}