2010-12-01 9 views
0

나는 나 자신에게 더 나은 방법이 있어야한다고 말하고 있지만 지금은 그것을 볼 수 없다.더 우아한 방법이 있나요?

i = 0; lose = 0; win = 0 
while i < @array.size 
    results = @array[i].results 
    q = 0 
    while q < results.size 
    if results[q].to_i == 0 then 
     lose += 1 
    elsif results[q].to_i == 1 then 
     win += 1 
    else 
     puts results[q] 
     puts "false" 
    end 
    q += 1 
    end 
    i+=1 
end 
if win == lose then 
    puts "true" 
else 
    puts "false" 
end 

답변

5

while 루프 대신 array.each을 사용할 수 있습니다.

수동으로 각 배열을 검사 대신 array.count를 사용할 수 있습니다

lose = results.count { |r| r.to_i == 0 } 
win = results.count { |r| r.to_i == 1 } 

# or possibly if the array can only contain wins and losses 
win = results.count - lose 
+1

너무 우아! :) 그냥 내가 뭘 찾고 있었는지! 감사. – Skizit

+0

1. '0/1 '이 아닌 요소는 어디에 인쇄됩니까? 2.'count'는'select'없이 사용할 수 있습니다. 3. 초기 배열은 1 차원이 아닙니다. – Nakilon

+0

예'count'가'select'보다 낫습니다. 0/1이 아닌 대답은 OP가 알아낼 수 있다고 생각합니다. StackOverflow는 다른 사람들의 코드 작성을위한 것이 아니라 조언과 지침을위한 것입니다. –

0

이 값이 정확히 배열에있는 항목의 총 수의 절반 인 경우 이론적으로 간단하게 체크 한 후, 모든 .to_i 항목의 값을 추가 할 수 있습니다, 당신은 단지 당신의 배열에서 0과 1을 제공 . 더 많은 정보를 알지 못하면서 이것을하는 더 좋은 방법이 있는지 말하기가 어렵습니다. 나중에 어디에서나 승리하고 카운트를 잃어 버리십니까? 이 함수는 즉시 반환되는 함수입니까, 아니면 더 큰 함수에 내장 된 함수입니까? 모든 결과 배열이 정확히 같은 크기입니까? 건배와 행복한 코딩!

1
f = @array.flatten 
puts (f.count('0') == f.count('1')) 
puts f-%w{0 1} 
0

분할이 몇 가지 테스트에 따라 두 부분에 배열 할 수 Enumerable#partition를 사용하여 :

win, lose = results.partition {|r| r.to_i == 1}.map(&:size) 
관련 문제