Comment detail

ライフゲーム (Nested Flatten)

Perlがなかったので投稿。C#のほぼそのままなので、あまり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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/usr/bin/perl
use strict;
use warnings;

sub print_matrix($$) {
    my $turn = shift;
    my $matrix = shift;

    print "t={$turn}\n";
    foreach my $row(@$matrix) {
        foreach my $cell(@$row) {
            print '[', print_cell($cell), ']';
        }
        print "\n";
    }
    print "\n";
}
sub print_cell($) {
    return ($_[0]?'*':' ');
}

sub next_step($$) {
    my $turn = shift;
    my $matrix = shift;
    my $result = [];

    $turn++;
    for (my $y=0; $y<@$matrix; $y++) {
        push(@$result, []);
        for (my $x=0; $x<@{$matrix->[$y]}; $x++) {
            my $count = count_alive_cell($matrix, $y, $x);
            #print "($y,$x) = $count\n";
            push(@{$result->[-1]}, 
                ($count == 3)? 1:
                ($count == 2)? $matrix->[$y][$x]:
                0
            );
        }
    }
    return $turn, $result;
}
sub count_alive_cell($$$) {
    my $matrix = shift;
    my $y = shift;
    my $x = shift;
    return cell_value($matrix, $y-1, $x-1) + cell_value($matrix, $y-1, $x) + cell_value($matrix, $y-1, $x+1)
         + cell_value($matrix, $y  , $x-1) +                               + cell_value($matrix, $y  , $x+1)
         + cell_value($matrix, $y+1, $x-1) + cell_value($matrix, $y+1, $x) + cell_value($matrix, $y+1, $x+1)
}
sub cell_value($$$) {
    my $matrix = shift;
    my $y = shift;
    my $x = shift;
    $y -= @$matrix if ($y >= @$matrix);
    $x -= @{$matrix->[$y]} if ($x >= @{$matrix->[$y]});
    return $matrix->[$y][$x];
}


sub main($) {
    my $max_turn = shift;

    my $turn = 1;
#    my $matrix = [
#            [qw/0 1 0 0 0 0 1 1 1 0/],
#            [qw/0 0 0 0 1 0 0 1 1 0/],
#            [qw/0 0 0 1 0 0 1 0 1 0/],
#            [qw/1 0 1 1 0 0 1 0 0 0/],
#            [qw/0 1 0 0 0 0 0 0 1 0/],
#            [qw/1 0 0 0 1 0 1 1 0 1/],
#            [qw/0 1 0 0 0 0 1 0 0 0/],
#            [qw/0 0 0 0 0 0 0 0 0 1/],
#            [qw/1 0 0 0 0 0 1 0 0 1/],
#            [qw/0 0 0 0 1 1 0 0 1 0/],
#        ];
    my $matrix = [
            [qw/0 0 0 0 0 0 0 1 0 0/],
            [qw/0 0 0 0 0 0 1 0 0 0/],
            [qw/0 0 0 0 0 0 1 1 1 0/],
            [qw/0 0 0 0 0 0 0 0 0 0/],
            [qw/0 0 0 0 0 0 0 0 0 0/],
            [qw/0 0 0 0 0 0 0 0 0 0/],
            [qw/0 0 0 0 0 0 0 0 0 0/],
            [qw/0 0 0 0 0 0 0 0 0 0/],
            [qw/0 0 0 0 0 0 0 0 0 0/],
            [qw/0 0 0 0 0 0 0 0 0 0/],
        ];

    print_matrix($turn, $matrix);
    for (my $i=1; $i<$max_turn; $i++) {
        ($turn, $matrix) = next_step($turn, $matrix);
        print_matrix($turn, $matrix);
    }
}

main(41);

Index

Feed

Other

Link

Pathtraq

loading...