読者です 読者をやめる 読者になる 読者になる

初代Masteries

きっとモヒカンにもなれないお前たちに告げる!!!

Project Euler - Problem 28

Problem 28

どういう問題かを簡潔に説明するのがちょっと難しいので, 上記ページをご覧ください.

use strict;
use warnings;
use bigint;

my $answer = sum_diagonal(2) + sum_diagonal(4) + sum_diagonal(6) + sum_diagonal(8) + 1;
print "$answer\n";

sub sum_diagonal {
    my $diff = shift;

    my $sum = 0;
    my $i = 1 + $diff;

    for (1..500) {
        $sum += $i;
        $i += $_ * 8 + $diff;
    }
    return $sum;
}

例えば, 中央の1から斜め右上に伸びる数は1, 9, 25, 49... となります.
1と9の差は8, 9と25の差は16, 25と49の差は24... と, 8の倍数に従って増えています.
一方, 中央の1から斜め左下に伸びる数は1, 5, 17, 37... となります.
1と5の差は4, 5と17の差は12, 17と37の差は20... で, これは'8の倍数-4'に従って増えています.

斜め右下, 斜め左下に伸びる数も同様に'8の倍数-2', '8の倍数-6'に従って増えているので, これを用いて1から見て4方向の和を計算して, それを足し合わせて求めてみました.