2012-06-23 5 views
0
분사

의 이상한 사용이 나는 (많은 수의 심하게 수행) 내 자신의 솔루션을 작성 후 (here 설명) 평형 인덱스 문제루비 평형 지수 -

태클 오늘 약간의 시간을 보냈다, 나는 하나를 찾을하기로 결정 그것은 완벽한 점수가 될 것입니다. 내가 발견이 (which Codility scores as 100/100) :

def equi(a) 
    left, right = 0, a.inject(0, &:+) 
    indices = [] 
    a.each_with_index do |val, i| 
     right -= val 

     indices << i if right == left 

     left += val 
    end 
    indices 
    end 

내가 이해하지 못하는 것은 방법의 상단에 평행 할당 및 분사의 사용의 조각입니다. 누구가이 일을 설명 할 수 있습니까?

감사합니다. 스투 그것은 배열의 단순한 합이다

답변

2

left에 0을 할당하고 a의 요소 합계를 right으로 지정합니다. 그렇지 않으면 빈 배열이 nil을 반환하기 때문에 0 인수가 있습니다. 합계에 사용되는 속기는 Symbol#to_proc이며 inject은 직접 기호를 인수로 취하므로 (inject(0, :+)) 불필요합니다.

+0

설명을위한 많은 감사합니다 @Michael Kohl. 나는 평행 배정을 읽을 필요가있다. 이 이상한 일을 한 가지는 할당 선 뒤에 디버거를 꽂았을 때 '왼쪽'과 '오른쪽'의 값이 모두 0입니다. '오른쪽'이 값의 합이 될 것으로 예상해서는 안됩니다. 그 단계의 배열? 또는 나중에 평가됩니까? – Stu

+0

병렬 할당이 반드시 특별하지는 않습니다. 'right'는'a'가 비어있는 경우에만 0이어야합니다. –

0

는 :

>> ar = (1..10).to_a 
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>> ar.inject(0, &:+) 
=> 55 
# or a shorter version 
>> ar.inject(&:+) 
=> 55 

당신은 정말 Enumerable#inject 방법에 doc을 읽어야합니다. 그것은 모든 것을 설명합니다.

+1

'ar == []'이면 더 짧은 버전은'nil'을 반환합니다. –

+0

주입 부분에 대한 대답을 감사하십시오. 나는 주사에 대해서 읽었지만, 그것이 가장 혼란스럽게 만들었던 평행 배정 이었음이 밝혀졌습니다. – Stu