警告:Project Euler 问题 1 剧透
我最近发现了Project Euler,并决定尝试一些问题。第一个问题是将 0-999 中的数字相加,这些数字是 3 或 5 的倍数。
我的第一个“类 java”解决方案是:
print threeAndFive(1000)."\n";
# Returns the sum of the numbers less than $max that are multiples of 3 or 5
sub threeAndFive
{
my $max = shift;
my $sum = 0;
for (my $i=; $i < $max; $i++)
{
$sum+=$i if (validate($i));
}
return $sum;
}
sub validate
{
my $num = shift;
if ($num % 3 == 0 || $num % 5 == 0)
{
return 1;
}
return undef;
}
然后我以更糟糕的方式重写了它:
print eval(join ('+', map {($_ % 3 == 0 || $_ % 5 == 0) ? $_ : ()} (1 .. 999)));
虽然这显然比原始代码更简洁,但我觉得它可能会更短或以更好的方式完成。例如,在 Python 中,可以这样做:
print sum([i for i in range(1,1000) if i%3==0 or i%5==0])
是否有更简洁/更好/更清晰的方法来做到这一点?或者其他使用不同功能的等效方式?我有兴趣尽可能多地学习 perl,所以解决方案越多越好。
提前致谢。