miyaga50のお題に答えてみるテスト

一次元セルオートマトンをやってみるテスト。へぼいミスで動かなかったけど、うちに帰る間に考えてたら分かった。アホすぐる。

#!/usr/bin/perl
use strict;
use warnings;

my @list = (
    0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
    1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0
);
my @newlist = &convert_for_all_cell(@list);

for ( 1 .. 30 ) {
    print_array(@newlist);
    @newlist = &convert_for_all_cell(@newlist);
}

sub calc_three_cells {
    my ( $one, $two, $three ) = @_;
    my $count = 10 * $one + 11 * $two + 12 * $three;
    if ( $count == 0 or $count == 22 or $count == 21 or $count == 33 ) {
        $one   = 0;
        $two   = 0;
        $three = 0;
    }
    elsif ( $count == 12 or $count == 11 or $count == 23 or $count == 10 ) {
        $one   = 0;
        $two   = 1;
        $three = 0;
    }
    return ($two);
}

sub convert_for_all_cell {
    my @old = @_;
    my @newlist;
    my $value;
    for ( 1 .. $#old - 1 ) {
        push( @newlist,
            &calc_three_cells( @old[ ( $_ - 1 ), $_, ( $_ + 1 ) ] ) );
    }
    unshift( @newlist, 0 );
    push( @newlist, 0 );
    return (@newlist);
}

sub print_array {
    my @array = @_;
    foreach (@array) {
        if ( $_ == 0 ) {
            print "○";
        }
        else {
            print "●";
        }
    }
    print "\n";
}

できたのはこれ。

○●●○●●●○●●○●○●○●○●○●○○●○●○●●○●●○●●○●●○●○
○●○○●○○○●○○●○●○●○●○●●●●○●○●○○●○○●○○●○○●○
○●●●●●○●●●●●○●○●○●○●○○○○●○●●●●●●●●●●●●●○
○●○○○○○●○○○○○●○●○●○●●○○●●○●○○○○○○○○○○○○○
○●●○○○●●●○○○●●○●○●○●○●●●○○●●○○○○○○○○○○○○
○●○●○●●○○●○●●○○●○●○●○●○○●●●○●○○○○○○○○○○○
○●○●○●○●●●○●○●●●○●○●○●●●●○○○●●○○○○○○○○○○
○●○●○●○●○○○●○●○○○●○●○●○○○●○●●○●○○○○○○○○○
○●○●○●○●●○●●○●●○●●○●○●●○●●○●○○●●○○○○○○○○
○●○●○●○●○○●○○●○○●○○●○●○○●○○●●●●○●○○○○○○○
○●○●○●○●●●●●●●●●●●●●○●●●●●●●○○○○●●○○○○○○
○●○●○●○●○○○○○○○○○○○○○●○○○○○○●○○●●○●○○○○○
○●○●○●○●●○○○○○○○○○○○●●●○○○○●●●●●○○●●○○○○
○●○●○●○●○●○○○○○○○○○●●○○●○○●●○○○○●●●○●○○○
○●○●○●○●○●●○○○○○○○●●○●●●●●●○●○○●●○○○●●○○
○●○●○●○●○●○●○○○○○●●○○●○○○○○○●●●●○●○●●○●○
○●○●○●○●○●○●●○○○●●○●●●●○○○○●●○○○○●○●○○●○
○●○●○●○●○●○●○●○●●○○●○○○●○○●●○●○○●●○●●●●○
○●○●○●○●○●○●○●○●○●●●●○●●●●●○○●●●●○○●○○○○
○●○●○●○●○●○●○●○●○●○○○○●○○○○●●●○○○●●●●○○○
○●○●○●○●○●○●○●○●○●●○○●●●○○●●○○●○●●○○○●○○
○●○●○●○●○●○●○●○●○●○●●●○○●●●○●●●○●○●○●●●○
○●○●○●○●○●○●○●○●○●○●○○●●●○○○●○○○●○●○●○○○
○●○●○●○●○●○●○●○●○●○●●●●○○●○●●●○●●○●○●●○○
○●○●○●○●○●○●○●○●○●○●○○○●●●○●○○○●○○●○●○●○
○●○●○●○●○●○●○●○●○●○●●○●●○○○●●○●●●●●○●○●○
○●○●○●○●○●○●○●○●○●○●○○●○●○●●○○●○○○○○●○●○
○●○●○●○●○●○●○●○●○●○●●●●○●○●○●●●●○○○●●○●○
○●○●○●○●○●○●○●○●○●○●○○○○●○●○●○○○●○●●○○●○
○●○●○●○●○●○●○●○●○●○●●○○●●○●○●●○●●○●○●●●○

何か続けていくと収束してしまう感じなんだけど、ルールとか、初期値を変えると変わってくるんかね。めんどくてやってないけど。