Ruby 不实时输出

发布于 2024-11-05 22:11:44 字数 867 浏览 6 评论 0原文

我在 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)&&(Prime.prime?(i)))
        a << i
      end
    end
  a
  end
end

puts 13195.primeFactors

输出:

5
7
13
29

到目前为止一切顺利!现在,当我输入 600851475143 时,我的终端挂起(理所当然,它正在计算一大堆东西!)所以我试图做的是在循环/if 中放置一个 puts i ,这样我就可以实时捕获迭代时的输出。

但是,通过将 puts i 放入循环中,Ruby 不会在整个迭代过程中输出变量;相反,它保留某种缓冲区中的值,并在计算完成时将它们刷新出来。

这个特殊问题让 Ruby 花费了很长时间来计算(它已经运行了 10 分钟),我怀疑它是在浮点转换中。

为什么 Ruby(我的终端?)会保留这些值直到计算结束?我可以在找到值时实时查看它们吗?你有更好的方法吗?

I've started some problems on Project Euler. One of the questions:

The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?

I have some code written up...and it works:

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

Outputs:

5
7
13
29

So far so good! Now, when I put in 600851475143 instead, my terminal hangs up (rightfully so, it's computing a whole lot of stuff!) So what I attempted to do was to put a puts i within the loop/if, so that I capture the output as it iterated through...in real time.

But by putting this puts i into the loop, Ruby does not output the variable throughout the iteration; instead, it holds onto the values in some kind of buffer and flushes them out when the computation is complete.

This particular problem is taking forever for Ruby to compute (it's been running for 10 minutes), I suspect it is in the float conversions.

Why is Ruby (my Terminal?) holding onto the values until end of computation? Can I see the values in real time as it finds them instead? Do you have a better way of doing this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

风月客 2024-11-12 22:11:44

尝试添加 STDOUT.sync = true。您也可以在 puts 之后尝试 STDOUT.flush。更多信息请参见此处

Try adding a STDOUT.sync = true. You could also try STDOUT.flush after the puts. Some more info here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文