2014-03-05 4 views
2

다른 사람의 솔루션을 확인한 후 여기에 내 코드는 정답과 매우 유사하게 보입니다. 유일한 차이점은 내가 ab을 정의하는 방식이라고 생각합니다. 웬일인지, 그들은 그들이 NilClass ...에있다라고 말한다?이 코드에서 NilClass는 어디에 있습니까? (프로젝트 오일러 # 8)

def product(num) 
    i = 0 
    j = 4 
    arr = num.to_s.scan(/d/).map {|e| e.to_i} #can use .split('') vs .scan 
    a = (arr[i]..arr[j]).inject(:*) # vs (1) {|product, n| product * n} 

    while j <= arr.length 
    b = (arr[i+1]..arr[j+1]).inject(:*) 

    a = b if b > a 
    i+=1 
    j+=1 
    end 
    puts a 
end 

답변

3

정규 표현식 리터럴 /d/ 일치 d litearlly.

숫자와 일치 시키려면, 대신 \d을 사용해야합니다.

그렇지 않으면 일치하는 항목이 없습니다. arr은 빈 배열이됩니다. 빈 배열을 인덱싱하면 항상 nil이 생성됩니다.

arr = [] 
arr[0] # => nil 
+0

작동하지만 이제 if 문에서 'undefined method'> 'for nil : NilClass'가 표시됩니다. – funfuntime

+0

@KevinC, 나는 망치고 싶지 않습니다. 힌트 :'arr [i + 1] .. arr [j + 1]' – falsetru

+1

아, 알아 냈어. 'arr [i + 1] .. arr [j + 1]'은 인덱스의 값을 취하므로 '7..1'과 같이 반복됩니다. 대신, 나는'arr [i..j]'할 필요가 있었다. (또한 'i + = 1'과 'j + = 1'을 while 루프의 맨 위로 이동해야했습니다.) – funfuntime

0

또한 배열 색인에 문제가 있습니다. 배열 arr의 마지막 인덱스는 arr.length - 1입니다. 그러나 코드는 :

while j <= arr.length b = (arr[i+1]..arr[j+1]).inject(:*)

인덱스 arr.length + 1까지 배열에 액세스하려고합니다.