こんにちは、6日目の投稿になります。
例によって、私のAdvent of Code day3の回答を貼っておきます。
use v6;
sub right(Int \n --> Int) {
4 * n ** 2 - 3 * n + 1
}
sub top(Int \n --> Int) {
4 * n ** 2 - 9 * n + 6
}
sub left(Int \n --> Int) {
4 * n ** 2 - 7 * n + 4
}
sub bottom(Int \n --> Int) {
4 * n ** 2 + 3 * n + 1
}
my $target = 277678;
say $_ + abs($target - right($_)) if right($_) - $_ <= $target <= right($_) + $_ for 2..2000;
say $_ + abs($target - top($_)) - 1 if top($_) - $_ - 1 <= $target <= top($_) + $_ - 1 for 2..2000;
say $_ + abs($target - left($_)) - 1 if left($_) - $_ - 1 <= $target <= left($_) + $_ - 1 for 2..2000;
say $_ + abs($target - bottom($_)) if bottom($_) - $_ <= $target <= bottom($_) + $_ for 2..2000;
- ポイント
- OEISで整数列いれて式調べました
-
\n
はsigilless variableです。ふつうは値の代入の際にコンテキストを変更させたくない場合に使います。が、今回はsigilがない方が若干式っぽく見えるので使いました。 -
bottom($_) - $_ <= $target <= bottom($_) + $_
Perl6ではこういう感じで不等号を書くことができます
もうちょっときれいに書けそう・・・
以上6日目の投稿でした。