Ruby не выводит данные в режиме реального времени

#ruby #primes #irb #computation

#ruby #простые числа #irb #вычисление

Вопрос:

У меня начались некоторые проблемы с Project Euler. Один из вопросов:

Простые множители 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)amp;amp;(Prime.prime?(i)))
        a << i
      end
    end
  a
  end
end

puts 13195.primeFactors
  

Выводит:

 5
7
13
29
  

Пока все хорошо! Теперь, когда я вместо этого ввожу 600851475143, мой терминал зависает (это справедливо, он вычисляет целую кучу вещей!) Итак, что я попытался сделать, так это поместить puts i в цикл / if, чтобы я фиксировал вывод по мере его повторения through…in в режиме реального времени.

Но, помещая это puts i в цикл, Ruby не выводит переменную на протяжении всей итерации; вместо этого он сохраняет значения в каком-то буфере и удаляет их, когда вычисление завершено.

Для вычисления этой конкретной проблемы Ruby требуется вечность (она выполняется в течение 10 минут), я подозреваю, что это связано с преобразованиями с плавающей запятой.

Почему Ruby (мой терминал?) сохранение значений до конца вычисления? Могу ли я видеть значения в режиме реального времени, когда он их находит? У вас есть лучший способ сделать это?

Ответ №1:

Попробуйте добавить STDOUT.sync = true . Вы также могли бы попробовать STDOUT.flush после puts . Еще немного информации здесь.

Комментарии:

1. На самом деле это не удивительно, это стандартная часть многих языков. В Perl это было бы глобальным $| . Для повышения скорости ввод-вывод буферизуется, будь то на диск или на экран. Такая буферизация может вызвать проблемы с частичной записью, поэтому часто мы отключаем ее, чтобы как можно быстрее доставить данные на диск или по назначению.