2011-05-10 7 views
3

Project Euler에서 몇 가지 문제를 시작했습니다. 질문 중 하나 :Ruby가 실시간으로 출력하지 않습니다.

13195의 기본 요소는 5, 7, 13 및 29입니다. 숫자 600851475143의 가장 큰 소수 요소는 무엇입니까?

나는 최대 기록 된 몇 가지 코드를 가지고 ... 그리고 그것은 작동합니다

class Integer 

    def primeFactors 
    load('/home/arseno/ruby/lib/prime.rb') 
    a = [] 

    for i in (1..self) 
     div = self.to_f/i.to_f 
     if((div==div.to_i)&&(Prime.prime?(i))) 
     a << i 
     end 
    end 
    a 
    end 
end 

puts 13195.primeFactors 

출력을 :

5 
7 
13 
29 

를 지금까지 너무 좋아! 자, 대신에 600851475143을 넣었을 때 터미널이 멈 춥니 다. (합법적으로 그렇게 많은 것을 계산합니다!) 그래서 내가 시도한 것은 puts i을 루프/if에 넣는 것이 었습니다. 그것은 실시간으로 반복되었습니다.

하지만이 puts i을 루프에 넣으면 Ruby는 반복되는 동안 변수를 출력하지 않습니다. 대신, 그것은 일종의 버퍼의 값을 유지하고 계산이 완료되면 플러시합니다.

이 특별한 문제는 루비가 (10 분 동안 실행되었습니다.) 계속해서 계산할 때 문제가되는데, 플로트 변환으로 의심되는 부분입니다.

루비 (내 터미널?)가 계산이 끝날 때까지 값을 보유하고있는 이유는 무엇입니까? 값을 대신 발견하면 실시간으로 값을 볼 수 있습니까? 이 일을 더 잘 수행 할 수 있습니까?

답변

11

STDOUT.sync = true을 추가하십시오. puts 뒤에 STDOUT.flush을 시도해 볼 수도 있습니다. 좀 더 자세한 정보 here.

+0

놀라운, 고마워! –

+0

정말 놀랍지는 않습니다. 많은 언어의 표준 부분입니다. Perl에서는 글로벌'$ | '이 될 것입니다. 속도면에서 볼 때 I/O는 디스크 또는 화면에 상관없이 버퍼링됩니다. 버퍼링은 부분 쓰기에 문제를 일으킬 수 있으므로 가능한 한 빨리 디스크 또는 대상에 데이터를 가져 오기 위해 자주 버퍼링을 해제합니다. –