challenge ビンゴの結果を整形表示

重複無し乱数」の続編です。

「重複無し乱数」で作ったbingo関数の結果を下のように「何番目の乱数か」とセットにして10個ずつ折り返して表示するコードを書いてください。

>>> bingo(30)
  1  2  3  4  5  6  7  8  9 10
 29 14 16 13 30 15 22 11 25  9

 11 12 13 14 15 16 17 18 19 20
 23  4 18  5 28 17  8 12 21 20

 21 22 23 24 25 26 27 28 29 30
 26  6  2 19  1  7 10 27  3 24

>>> bingo(35)
  1  2  3  4  5  6  7  8  9 10
  7 15  3 32  1 16 17 28  6 29

 11 12 13 14 15 16 17 18 19 20
 19 23 30 26 20  5 12  2 25 31

 21 22 23 24 25 26 27 28 29 30
 35 13 24 18 11  8 10 34 22 21

 31 32 33 34 35
  9  4 27 33 14

Posted feedbacks - Perl

出力用の関数を追加。
ちょっとドロくさいかな?
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
sub bingo($;)
{
    my $x = shift ;
    my @num = (1 .. $x);
    my $r;
    for( my $n = $x; $n>0; $n --)
    {
        $r = rand; $r *= 1000;
        push(@num, splice(@num, $r % $n, 1) );
    }
    return @num;
}

sub printTable(@)
{
    my @T = @_;
    my $N, $K;

    printf("[%d] => \n", $#T+1);
    for( $N=0; $N<=$#T; $N = $K + 1)
    {
        # 番号
        for( $K=$N; $K<$#T; $K ++ )
        {
            last if ($K-$N) >= 9;
            printf("%2d ", $K+1);
        }
        printf("%2d\n", $K+1);

        # 乱数
        for( $K=$N; $K<$#T; $K ++ )
        {
            last if ($K-$N) >= 9;
            printf("%2d ", $T[$K]);
        }
        printf("%2d\n", $T[$K]);

        printf("\n");
    }
}

my @table;

srand;
@table = bingo(30); ::printTable(@table);
@table = bingo(35); ::printTable(@table);

10個ずつspliceすれば綺麗に書けると思ったんだけど、なんかごちゃごちゃしてしまった。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
use List::Util qw/shuffle/;
sub bingo {p(shuffle(1..$_[0]));}

sub p {
 my $i = 1;
 while(my @sublist = splice(@_,0,10)){
   for my $seq ($i..$i+scalar(@sublist)-1){printf "%3d", $seq;};
   print "\n";
   for my $num (@sublist){printf "%3d", $num;};
   print "\n\n";
   $i = $i + scalar(@sublist);
 }
}

perlで書いてみた
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
sub bingo()
{
    my @array = ( 1 .. shift );
    my @out   = ();
    while ( my $x = splice( @array, int(rand(scalar @array)) , 1 ) )
    {
        push @out , $x ;
    }
    return [ @out ];
}

sub out()
{
    my @array = @{ $_[0] };
    my $i=1;
    while ( my @x = splice( @array, 0 , 10  )  )
    {
        my $n    = scalar @x ;
        my $comp = (int($i/$n)+1) * $n;
        while ( $i <= $comp )
        {
            printf "%3d", $i++;
        }
        print  "\n";
        while(my $a = shift @x )
        {
            printf "%3d" , $a ;
        }
        print  "\n\n";
    }
}

&out( &bingo(35) );

Index

Feed

Other

Link

Pathtraq

loading...