Ruby 将此方法重构为一行程序
找到完美正方形的简单代码Ruby 将此方法重构为一行程序,ruby,performance,refactoring,Ruby,Performance,Refactoring,找到完美正方形的简单代码 def perfect_square(num) (1..num).each {|n| return true if n*n == num } false end`` 有没有办法让第一行返回false,而不必使用下面只有false的新行?在Ruby中,换行符是可选的,因此您可以通过简单地删除所有换行符,潜在地用适当的可选分隔符替换换行符,轻松地将任何内容(无论多么复杂)实现为一行: def perfect_squarenum 1..num.each{n}
def perfect_square(num)
(1..num).each {|n| return true if n*n == num }
false
end``
有没有办法让第一行返回false,而不必使用下面只有false的新行?在Ruby中,换行符是可选的,因此您可以通过简单地删除所有换行符,潜在地用适当的可选分隔符替换换行符,轻松地将任何内容(无论多么复杂)实现为一行: def perfect_squarenum 1..num.each{n}如果n*n==num},则返回true;假端
在Ruby中,换行符是可选的,因此,只要删除所有换行符,并可能使用适当的可选分隔符替换它们,您就可以轻松地将任何内容(无论多么复杂)实现为一行: def perfect_squarenum 1..num.each{n}如果n*n==num},则返回true;假端
你可以这样做 def完美_平方数 !1..num.find{n}n*n==num}.nil? 终止
找到从1到num的任意一个数,并检查其平方是否为num。您可以这样做 def完美_平方数 !1..num.find{n}n*n==num}.nil? 终止 找到从1到num的任意一个数,其平方是num,检查它是否不是nil。Ruby从2.5版开始就有了
def perfect_square(num)
Integer.sqrt(num)**2 == num
end
Ruby从2.5版开始就有了
def perfect_square(num)
Integer.sqrt(num)**2 == num
end
由于完美正方形的乘积是完美正方形,因此使用:
由于完美正方形的乘积是完美正方形,因此使用:
为了好玩,这里有另一种方式:
def perfect_square(num)
(1..1+num/2).find { |n| n*n >= num }**2 == num
end
为了提高效率,手术线可以用
(1..1+num/2).bsearch { |n| n*n >= num }**2 == num
请参阅。为了好玩,这里有另一种方式:
def perfect_square(num)
(1..1+num/2).find { |n| n*n >= num }**2 == num
end
为了提高效率,手术线可以用
(1..1+num/2).bsearch { |n| n*n >= num }**2 == num
请参阅。我认为对各种方法进行基准测试可能会很有趣。有什么惊喜吗
require 'benchmark'
require 'prime'
如果arr的每个元素是一个完美的正方形,则该方法将其映射为true,否则为false,使用方法meth a symbol
def benchem(arr)
Benchmark.bm do |x|
x.report("enumerate") { test(arr, :duckets) }
x.report("integer_sqrt") { test(arr, :steenslag) }
x.report("prime_divisors") { test(arr, :iGian) }
x.report("bsearch") { test(arr, :cary) }
end
end
我认为对各种方法进行基准测试可能会很有趣。有什么惊喜吗
require 'benchmark'
require 'prime'
如果arr的每个元素是一个完美的正方形,则该方法将其映射为true,否则为false,使用方法meth a symbol
def benchem(arr)
Benchmark.bm do |x|
x.report("enumerate") { test(arr, :duckets) }
x.report("integer_sqrt") { test(arr, :steenslag) }
x.report("prime_divisors") { test(arr, :iGian) }
x.report("bsearch") { test(arr, :cary) }
end
end
Math.sqrtnum.moduleo1.zero?或者不优化代码1..num.find{| n | n*n==num}对于真实情况返回n,对于不完美情况返回nilsquare@SimpleLime还是使用存在?@maxpleaner我以为那是一个只有ActiveRecord的东西,找不到该方法的文档,而且在我的机器上似乎没有ruby版本:/找到它有什么有用的提示吗?@SimpleLime抱歉,你是对的,我是说有吗?啊,是的,有吗?如果需要true和false,而不仅仅是truthy和falseyMath.sqrtnum.ModuleO1.zero,那么会是一个更好的选择吗?或者不优化代码1..num.find{| n | n*n==num}对于真实情况返回n,对于不完美情况返回nilsquare@SimpleLime还是使用存在?@maxpleaner我以为那是一个只有ActiveRecord的东西,找不到该方法的文档,而且在我的机器上似乎没有ruby版本:/找到它有什么有用的提示吗?@SimpleLime抱歉,你是对的,我是说有吗?啊,是的,有吗?如果真与假都是必需的,而不仅仅是真与假,那将是一个更好的选择!这个论点似乎很简单,一个数是素数,当且仅当它的每一个素数因子都是偶数,我认为这很明显,而不是说PS的乘积是PS。不是吗?也许我误解了。嗨,谢谢@CarySwoveland!将平方根作为分数指数幂:n** 1/2,并考虑M************=m ** 6的幂的性质。现在如果n=m**6,那么n**1/2=m**6**1/2等于m**3。同时考虑H** 1/2*k** 1/2=h*k**1/2。所以我必须检查一个数的素因子的所有指数都可以除以2,这意味着平方根。如果这听起来很清楚,我会补充到帖子中。这里是一个正式的解释。每个正整数z都可以表示z=s*s*t,其中s等于x1*x2*…*xn和t等于y1*y2…ym或1,所有席是可能的重复的素数因子,所有的Yi都是不同的素数因子,尽管每个Yi都可以等于一些XJ。例如,当864=2**5*3**3、s=2*2*3 12和t=2*3 6 12*12*6=864……z的平方根因此等于s*sqrtt,这意味着z是一个完美的平方当且仅当sqrtt是一个整数时。然而,已知不同素数乘积的平方根是无理的。因此,z是一个完美的正方形,当且仅当它的每个素因子的数目为偶数时。@CarySwoveland,这听起来不错。也许这个说法应该是这样的:z是一个完美的平方,当且仅当它的每个素因子的指数是偶数!这个论点似乎很简单,一个数是素数,当且仅当它的每一个素数因子都是偶数,我认为这很明显,而不是说PS的乘积是PS。不是吗?也许我误解了。嗨,谢谢@CarySwoveland!将平方根作为分数指数幂:n** 1/2,考虑m**2的幂的性质。
m**2*m**2=m**6。现在如果n=m**6,那么n**1/2=m**6**1/2等于m**3。同时考虑H** 1/2*k** 1/2=h*k**1/2。所以我必须检查一个数的素因子的所有指数都可以除以2,这意味着平方根。如果这听起来很清楚,我会补充到帖子中。这里是一个正式的解释。每个正整数z都可以表示z=s*s*t,其中s等于x1*x2*…*xn和t等于y1*y2…ym或1,所有席是可能的重复的素数因子,所有的Yi都是不同的素数因子,尽管每个Yi都可以等于一些XJ。例如,当864=2**5*3**3、s=2*2*3 12和t=2*3 6 12*12*6=864……z的平方根因此等于s*sqrtt,这意味着z是一个完美的平方当且仅当sqrtt是一个整数时。然而,已知不同素数乘积的平方根是无理的。因此,z是一个完美的正方形,当且仅当它的每个素因子的数目为偶数时。@CarySwoveland,这听起来不错。也许应该这样说,z是一个完美的平方,当且仅当它的每个素因子的指数是偶数。?酷,谢谢。我不知道代码运行时这些行是无关的。当我发布时,我一直在寻找这样的解决方案,但从其他解决方案来看,我的原始代码似乎不是很有效。很酷,谢谢。我不知道代码运行时这些行是无关的。当我发布时,我一直在寻找这样的解决方案,但从其他解决方案来看,我的原始代码似乎不是很有效。我喜欢它。非常简洁,我喜欢。非常简洁。哇,这太棒了。我的意思是我排在最后,这很糟糕,因为我基本上是靠手指数的,我还在学习,但仍然很棒。在这样的视觉中看到时间和资源确实有助于强调各种方法之间的差异。哇,这太棒了。我的意思是我排在最后,这很糟糕,因为我基本上是靠手指数的,我还在学习,但仍然很棒。以这样的视觉方式查看时间和资源确实有助于强调各种方法之间的差异。
def test(arr, meth)
arr.map { |num| method(meth).call(num) }
end
def benchem(arr)
Benchmark.bm do |x|
x.report("enumerate") { test(arr, :duckets) }
x.report("integer_sqrt") { test(arr, :steenslag) }
x.report("prime_divisors") { test(arr, :iGian) }
x.report("bsearch") { test(arr, :cary) }
end
end
benchem([*2..100])
user system total real
enumerate 0.000244 0.000000 0.000244 ( 0.000229) #3
integer_sqrt 0.000049 0.000000 0.000049 ( 0.000048) #1
prime_divisors 0.000963 0.000000 0.000963 ( 0.000967) #4
bsearch 0.000086 0.000000 0.000086 ( 0.000086) #2
benchem([*101..1000])
user system total real
enumerate 0.018636 0.000000 0.018636 ( 0.018662) #4
integer_sqrt 0.000252 0.000000 0.000252 ( 0.000255) #1
prime_divisors 0.003402 0.000000 0.003402 ( 0.003407) #3
bsearch 0.000870 0.000000 0.000870 ( 0.000872) #2
benchem([*1001..10000])
user system total real
enumerate 1.345501 0.000000 1.345501 ( 1.345650) #4
integer_sqrt 0.004647 0.000000 0.004647 ( 0.004655) #1
prime_divisors 0.048204 0.000000 0.048204 ( 0.048226) #3
bsearch 0.010349 0.000000 0.010349 ( 0.010362) #2
benchem([*10001..100000])
user system total real
enumerate 147.814253 0.000000 147.814253 (147.833672) #4
integer_sqrt 0.036118 0.000000 0.036118 ( 0.036115) #1
prime_divisors 0.889245 0.000000 0.889245 ( 0.889367) #3
bsearch 0.127438 0.000000 0.127438 ( 0.127459) #2