ルーレットの最大値

さて、今まではawkを使ってパズルを解いてきましたが、今回はperlで解いてみたいと思います。
なかなかawkと違ってperlは汎用性のある分、覚えることが多いのですが、それだけ応用も効くということでしょうか。
では、早速やってみましょう。

ルーレットの数字の配置として有名なのが「ヨーロピアンスタイル」と
「アメリカンスタイル」です。  
ここでは、それぞれの配置から「連続するn個の数の和」が最大になる位置を考えます。  

例えば、n=3のとき、ヨーロピアンスタイルでは36,11,30の合計の77  
アメリカンスタイルでは24,36,13の合計の73が最大になります。  
2≦n≦36のそれぞれのnについて、連続する数の和が最大になる場合を求め、
ヨーロピアンスタイルでの和がアメリカンスタイルでの和よりも小さくなるnが
いくつあるかを求めてください。

ヨーロピアンスタイル
 (0, 32, 15, 19, 4, 21, 2, 25, 17, 34, 6, 27, 13, 36,
    11, 30, 8, 23, 10, 5, 24, 16, 33, 1, 20, 14, 31, 9, 22, 18,
    29, 7, 28, 12, 35 , 3, 26);

アメリカンスタイル
(0, 28, 9, 26, 30, 11, 7, 20, 32, 17, 5, 22, 34, 15,
    3, 24, 36, 13, 1, 00, 27, 10, 25, 29, 12, 8, 19, 31, 18, 6,
    21, 33, 16, 4, 23, 35, 14, 2);
#! /usr/bin/perl

use strict;
use warnings;

my @european = (0, 32, 15, 19, 4, 21, 2, 25, 17, 34, 6, 27, 13, 36,
    11, 30, 8, 23, 10, 5, 24, 16, 33, 1, 20, 14, 31, 9, 22, 18,
    29, 7, 28, 12, 35 , 3, 26);
my @american = (0, 28, 9, 26, 30, 11, 7, 20, 32, 17, 5, 22, 34, 15,
    3, 24, 36, 13, 1, 00, 27, 10, 25, 29, 12, 8, 19, 31, 18, 6,
    21, 33, 16, 4, 23, 35, 14, 2);

sub sum_max{
    my ($n,@rouletter) = @_;
    my $ans = 0;
    my @array = 0;
    my $rouletter_size = @rouletter;    # @rouletterのサイズ
    my $tmp;
    for (my $i = 0; $i < $rouletter_size; $i++){
        $tmp = 0;
        if($i + $n <= $rouletter_size){ # 配列の両端をまたがない
            foreach my $num($i .. $i + $n - 1){
                $tmp += $rouletter[$num] 
            }
        }else{                          # 配列の両端をまたぐ
            foreach my $num(0 .. ($i + $n - 1) % $rouletter_size){
                $tmp += $rouletter[$num];
            }
            foreach my $num($i .. $rouletter_size - 1){
                $tmp += $rouletter[$num];
            }
        }
        push @array,$tmp;
    }
    my $max = 0;
    foreach my $j (@array){
        if ($max < $j){
            $max = $j;
        }
    }
    return $max;
}

my $cnt = 0;
foreach my $i (2 .. 36){
    if(sum_max($i,@european) < sum_max($i,@american)){
        $cnt++;
    }
}
print "$cnt\n";

実行してみます。

perl q10.pl 
9

無事に答えが出ているようです。