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