Perl6
Perl 6Day 6

Advent of Code day3をPerl 6で

こんにちは、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日目の投稿でした。