我在做傻事...Perl 矩阵创建....计数不正确或测试不正确

  • 本文关键字:不正确 创建 测试 Perl perl
  • 更新时间 :
  • 英文 :


代码:

use strict;
use warnings;
use Data::Dumper;
use List::Util qw(shuffle);
my @range = (1..16);
@range = shuffle(@range);
# lets make a cool grid
my $count = 0;
my $row = 1;
my $grid = {};
my @tmp;
my $c = @range;
print "Found: $c entries.nn";
foreach my $num ( @range ) {
   if ( $count == 4 ) {
        $grid->{$row} = [@tmp];
        $row++;
        $count = 0;
        undef @tmp;
        next;
   }
   $count++;
   push @tmp, $num;
   print "ROW $row, COUNT: $countn";
}
print Dumper $grid;

输出:

Found: 16 entries.
ROW 1, COUNT: 1
ROW 1, COUNT: 2
ROW 1, COUNT: 3
ROW 1, COUNT: 4
ROW 2, COUNT: 1
ROW 2, COUNT: 2
ROW 2, COUNT: 3
ROW 2, COUNT: 4
ROW 3, COUNT: 1
ROW 3, COUNT: 2
ROW 3, COUNT: 3
ROW 3, COUNT: 4
ROW 4, COUNT: 1
$VAR1 = {
          '1' => [
                   9,
                   12,
                   4,
                   2
                 ],
          '3' => [
                   14,
                   3,
                   1,
                   6
                 ],
          '2' => [
                   15,
                   7,
                   16,
                   5
                 ]
        };

我正在寻找一个4乘4矩阵

只需几项更改,您就可以获得:

use strict;
use warnings;
use Data::Dumper;
use List::Util qw(shuffle);
my @range = (1..16);
@range = shuffle(@range);
# lets make a cool grid
my $count = 0;
my $row = 0;     # start this at 0 instead of 1
my $grid = [];   # make this an array instead of a hash
my @tmp;
my $c = @range;
print "Found: $c entries.nn";
foreach my $num ( @range ) {
   $count++;
   push @tmp, $num;
   print "ROW $row, COUNT: $countn";
   if ( $count == 4 ) {                  # move this to the end of the loop
        $grid->[$row] = [@tmp];
        $row++;
        $count = 0;
        undef @tmp;
   }
}
print Dumper $grid;

部分输出:

$VAR1 = [
          [
            8,
            3,
            12,
            4
          ],
          [
            1,
            10,
            14,
            15
          ],
          [
            6,
            16,
            2,
            5
          ],
          [
            7,
            13,
            11,
            9
          ]
        ];

使用splice:可以简单一点

use strict;
use warnings;
use List::Util qw(shuffle);
my @array = shuffle(1..16);
my @AofA;
while (@array) {
    push @AofA, [splice @array, 0, 4];
}
use Data::Dump;
dd @AofA;

输出:

[[5, 13, 8, 4], [15, 9, 6, 3], [12, 7, 16, 14], [10, 1, 11, 2]]

如果我理解你想要什么,这应该可以做到:

my @range = (1..16);
# lets make a cool grid
my $grid = {};
for (my $i = 1; $i <= 4; $i++) {
    @range = shuffle(@range);
    print qq|Doing: $i n|;
    $grid->{$i} = [splice(@range,0,4)]; # get the first 4 element, as we have it shuffled now
}
print Dumper $grid;

其想法是,您只需循环遍历4个值(1-4),然后对其中的每个值,shuffle数组,最后获取数组中的前4个元素。这应该会给你从你提供的范围中随机选择4个,同时仍然很好和有效:)

相关内容

最新更新