2014-09-25 6 views
0

가치를 변환 :루비,이 같은 간단한 어레이가 배열 키

stops = ["red_stop", "green_stop", "blue_stop", "yellow_stop", "purple_stop"] 

난 둘 사이의 거리 (정지의 수)를 결정하려는을 '정지'. 내가 이해 :

stops.index("purple_stop") 

4를 반환합니다,하지만 난 인수로 두 정거장을 가지고 그들 사이의 정지의 수를 (계산합니다 루비 방법을 작성하는 방법을 이해하지 않습니다 예를 들어 "red_stop은"3 은 "yellow_stop"

+3

'stops.index ("purple_stop")을 계산하는 방법을 의미합니까? stops.index ("red_stop")'? –

+0

예, a = stop.index ("purple_stop) b = stop.index ("red_stop ")는 a - b를 넣습니다 (그러나 Ruby 메서드로 쓰고 싶습니다) – mdror

답변

2

그것은 단순히 다음과 같습니다

class Array 
    def dist(a,b) 
    (index(b) - index(a)).abs 
    end 
end 

stops = ["red_stop", "green_stop", "blue_stop", "yellow_stop", "purple_stop"] 
stops.dist('red_stop', 'blue_stop') #=> 2 

그러나 배열에 중복이있는 경우에는 작동하지 않습니다.

+0

다른 사람이 Array # index와 Array #find_index, 나는 하나라는 것을 알 수 없습니다. 그들은 동일하게 보입니다. http://www.ruby-doc.org/core-2.1.3/Array.html#method-i-index – thohl

+2

@thohl Array.instance_method (: index) == Array.instance_method (: find_index) # => true' – Stefan

1

사용 중지이 :

stops = ["red_stop", "green_stop", "blue_stop", "yellow_stop", "purple_stop"] 

def getdiff(source, destination, stops) 
(stops.index(destination) - stops.index(source)).abs 
end 

getdiff("red_stop", "yellow_stop", stops) 
+0

무엇을 설명하니, 신경 써야합니까? – aelor

+0

아마도 당신이 당신의 대답을 편집하기 전에, 당신의 방법은 너무 적은 인수를 취했기 때문에. 내가 입력하는 동안 실수였던 – Jesper

+1

이 지금 편집되었습니다. 희망에 따라 그는 그의 downvote를 제거합니다 – aelor

0

당신은 모든 조합이 필요하면 다음과 같이

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} 

단계

은을 :

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]]] 
: 우리는 배열에 열거 b을 변환 할 수 있습니다
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)> 

는 요소를 볼 수

각 쌍의 거리를 사용하여 해시를 만듭니다 (블록 변수의 분해가 아님). : 당신의 항목이 양방향으로 간주하는 경우 stops 당신의 예에서

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} 
0

는, 그 가정은 stops.dist(a,b) == stops.dist(b,a)입니다. 그렇다면 위의 @BroiSatse와 같이 이미 좋은 답변을 얻고 있습니다.

stops 배열이 방향을 전환하는 노드 또는 상태를 나타내는 경우 (예 : 루프 또는 자필로) dist 메소드를 사용해야 할 수도 있습니다. 다시 말해, 배열은 랩 어라운드를 암시합니다.

class Array 
    def dist(a,b) 
    (index(b)-index(a)) % self.size 
    end 
end 

stops = ["red_stop", "green_stop", "blue_stop", "yellow_stop", "purple_stop"] 
stops.dist('red_stop', 'blue_stop') #=> 2 (as expected) 
stops.dist('blue_stop', 'red_stop') #=> 3 (not 2, since it's directional) 

(전환 방향이다) 신호등 상태의 예 :

이것은 당신이 인코딩하려는 도메인에 따라
lights = ['green', 'yellow', 'red'] 
lights.dist('green', 'red')  #=> 2 
lights.dist('red', 'green')  #=> 1 (green light follows a red light) 

. 방향이 중요하지 않다면이 대답을 무시하십시오! ;-) 행운을 빕니다.