我最近开始使用 Julia(来自 Python)进行编码。 为了练习我的 Julia 技能,我开始解决欧拉问题。 欧拉问题 12 (https://projecteuler.net/problem=12) 并不难解决。
为了让事情变得更困难,我尝试用一行代码解决每个问题,有时还使用辅助函数。
下面的代码给出了正确答案,但表现不佳(需要 3 分钟)。
function factors(n)
treshold = 500
counter = 0
s = sum(1:n)
for i in 1:s
if s%i == 0
counter += 1
end
end
if counter > treshold
return false
else
return true
end
end
sum(1:maximum(Iterators.takewhile(factors, Iterators.countfrom()))+1)
在 Julia 中加速这个 oneliner 的最佳选择是什么?
最简单的加速是只计数到
isqrt(s)
而不是 s
。与
function factors(n)
treshold = 500
counter = 0
s = sum(1:n)
for i in 1:isqrt(s)
if i*i == s
counter += 1
elseif s%i == 0
counter += 2
end
end
if counter > treshold
return false
else
return true
end
end
这只需要0.07秒。