If you need all combinations:
stops = ["red_stop", "green_stop", "blue_stop", "yellow_stop", "purple_stop"]
stops.map.with_index { |s,i| [s,i] }
.combination(2).each_with_object({}) { |((s1,d1),(s2,d2)),h|
h[[s2,s1]] = h[[s1,s2]] = (d1-d2).abs }
#=> {["red_stop", "green_stop"] =>1, ["green_stop", "red_stop"] =>1,
# ["red_stop", "blue_stop"] =>2, ["blue_stop", "red_stop"] =>2,
# ["red_stop", "yellow_stop"]=>3, ["yellow_stop", "red_stop"] =>3,
# ["red_stop", "purple_stop"]=>4, ["purple_stop", "red_stop"] =>4,
# ["green_stop", "blue_stop"] =>1, ["blue_stop", "green_stop"] =>1,
# ["green_stop", "yellow_stop"]=>2, ["yellow_stop", "green_stop"] =>2,
# ["green_stop", "purple_stop"]=>3, ["purple_stop", "green_stop"] =>3,
# ["blue_stop", "yellow_stop"]=>1, ["yellow_stop", "blue_stop"] =>1,
# ["blue_stop", "purple_stop"]=>2, ["purple_stop", "blue_stop"] =>2,
# ["yellow_stop", "purple_stop"]=>1, ["purple_stop", "yellow_stop"]=>1}
The steps are as follows:
a = stops.map.with_index { |s,i| [s,i] }
#=> [["red_stop", 0], ["green_stop", 1], ["blue_stop", 2],
# ["yellow_stop", 3], ["purple_stop", 4]]
b = a.combination(2)
#=> #<Enumerator: [["red_stop", 0], ["green_stop", 1], ["blue_stop", 2],
# ["yellow_stop", 3], ["purple_stop", 4]]:combination(2)>
We can convert the enumerator b to an array to see its elements:
b.to_a
#=> [[["red_stop", 0], ["green_stop", 1]],
# [["red_stop", 0], ["blue_stop", 2]],
# [["red_stop", 0], ["yellow_stop", 3]],
# [["red_stop", 0], ["purple_stop", 4]],
# [["green_stop", 1], ["blue_stop", 2]],
# [["green_stop", 1], ["yellow_stop", 3]],
# [["green_stop", 1], ["purple_stop", 4]],
# [["blue_stop", 2], ["yellow_stop", 3]],
# [["blue_stop", 2], ["purple_stop", 4]],
# [["yellow_stop", 3], ["purple_stop", 4]]]
Create a hash with the distances for each pair (not the decomposition of the block variables):
b.each_with_object({}) { |((s1,d1),(s2,d2)),h|
h[[s2,s1]] = h[[s1,s2]] = (d1-d2).abs }
#=> {["red_stop", "green_stop"]=>1, ["green_stop", "red_stop"]=>1,
# ...
# ["yellow_stop", "purple_stop"]=>1, ["purple_stop", "yellow_stop"]=>1}
stops.index("purple_stop") - stops.index("red_stop")?