2

警告: プロジェクト オイラーの問題 1 ネタバレ

私は最近Project Eulerを発見し、いくつかの問題を試してみることにしました。最初の問題は、3 または 5 の倍数である 0 ~ 999 の数字を合計することでした。

私の最初の「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 を学ぶことに興味があるので、解決策が多ければ多いほど楽しくなります。

前もって感謝します。

4

2 に答える 2