我现在有一些时间,我在Ruby中用SPOJ做了一些挑战。有人认为困扰我的是我如何更快地阅读用户输入。
例如,此问题:http://www.spoj.com/problems/TEST/
我尝试了很多解决方案,都基于获取:
while ((i=STDIN.gets.to_i) != 42) do
puts i
end
$stdin.each_line do |line|
exit if line.strip! == "42"
puts line
end
def input
while (true)
gets
exit if ($_.chomp == "42")
puts $_.chomp
end
end
input
以及其他与gets的变化。我得到的最佳时间是0.01秒,内存占用量为7.2 Mb。但是,使用Ruby语言查看最佳提交的前5页都是0.00s和3.1Mb的内存。
知道如何更快地获得输入吗? 此外,所有测试都使用STDIN将测试用例传递给应用程序,有些非常大(数百Mb),我怀疑获取这种输入的速度太慢(或者可能是chomp)。还有其他方式比获取更快吗?
答案 0 :(得分:0)
我可以通过保持代码简单并知道什么是更快的方式来获得0.0倍。我不会展示我的代码,因为人们应该自己解决问题:
while ((i=STDIN.gets.to_i) != 42) do puts i end
唉。不要将检索到的字符串转换为整数,只是为了将其与42
进行比较。相反,与'42'
进行比较,请记住,可以在字符串上获得尾随行结尾。
$stdin.each_line do |line| exit if line.strip! == "42" puts line end
同样,不要strip
,而是使用更智能的比较。此外,如果字符串中没有任何更改,strip!
可以咬你,返回nil而不是您期望的字符串。我会改用strip
,因为它可以保证返回预期值。
def input while (true) gets exit if ($_.chomp == "42") puts $_.chomp end end input
两个chomp
代价很高。你应该$_.chomp!
分开。
要知道的是,Ruby的正则表达式引擎非常快,并且锚定的正则表达式模式将超过常规的字符串搜索。
使用Ruby的Benchmark类测试您的代码变体,您可以缩小哪些差异有所帮助。
我有一个版本使用循环,非常类似于您的中间解决方案,另一个版本是一行代码。两者都是0.0秒。