Perl6
Perl 6Day 9

Advent of Code day6をPerl 6で

More than 1 year has passed since last update.

こんにちは、9日目の投稿になります。
今日は投稿がなかったので、Advent of Code day6の私の回答を貼っておきます。

use v6;                                                                                                                                                

my Int @banks = $*IN.get.split("\t")>>.Int;                                                                                                            

my %visited;                                                                                                                                           

do until %visited{~@banks}:exists {                                                                                                                    
    %visited{~@banks} = True;                                                                                                                          

    my $max = @banks.max; # (#1)                                                                                                                              
    my $target-bank-idx = 0;                                                                                                                           
    my $num-redistribution-blocks = 0;                                                                                                                 
    for @banks.pairs -> (:key($idx),:value($v)){ # (#2)                                                                                                      
        if $v == $max {                                                                                                                                
            $target-bank-idx = $idx;                                                                                                                   
            $num-redistribution-blocks = $v;                                                                                                           
            last;                                                                                                                                      
        }                                                                                                                                              
    }                                                                                                                                                  
    @banks[$target-bank-idx] = 0;                                                                                                                      
    my $pos = ($target-bank-idx + 1) % +@banks;                                                                                                        
    while $num-redistribution-blocks-- > 0 {                                                                                                           
        @banks[$pos]++;                                                                                                                                
        $pos++;                                                                                                                                        
        $pos %= +@banks;                                                                                                                               
    }                                                                                                                                                  
    1                                                                                                                                                  
}.sum.say; 
  • ポイント
    • .max でリストの中の最大値を取り出すことができます。 (#1)
    • for @banks.pairs -> (:key($idx),:value($v))は下記のように型を指定して記述することもできます (#2) (参考: https://perl6advent.wordpress.com/2017/12/05/ ):
      • for @banks.pairs -> Pair $p (:key($idx),:value($v))
      • for @banks.pairs -> Pair $p (Int :key($idx), Int :value($v))

以上、9日目の投稿でした。