### ----------------------------------------------------
### -- Automata::Cellular
### -- Licenses: NOASSERTION
### -- Authors: David Brunton, Tommy Brunton
### -- File: lib/Automata/Cellular.rakumod
### ----------------------------------------------------
role Rule {
    has Int $.number is required;
    has %.hash = [^8]>>.fmt("%03b") Z=> $!number.fmt("%08b").split("",:skip-empty).reverse;

    # Prettyprint the rule
    method Str(--> Str:D) {

        my $rulestring = sprintf("Rule %d subrules:\n", $!number);

        for %!hash.sort(*.key)>>.kv -> ($k, $v) {
            $rulestring ~= sprintf("%s => %s\n", $k, $v);
        }
        $rulestring;
    }

    method Numeric(--> Int:D) {
        $.number
    }
}

class Wolfram does Rule {
    has Rule $.rule .= new(:$!number);
    has Str @.format = <. X>;
    has Int $.width = 101;
    has Int $!steps = $!width div 2;
    has Int @!state = flat 0 xx $!steps, 1, 0 xx $!steps;

    method run() {
        for ^$!steps {
            say @!format[@!state].join;
            self.succ();
        }
    }

    method current() returns Str:D {
        @!format[@!state].join;
    }

    method succ() {
        @!state = map {
          +$!rule.hash{ @!state[($_-1) % $!width, $_, ($_+1) % $!width].join }
        }, ^$!width;
    }
}

=begin pod

=head1 NAME

Automata::Cellular - Cellular Automata in Raku

=head1 SYNOPSIS

=begin code :lang<raku>

use Automata::Cellular;

=end code

=head1 DESCRIPTION

Wolfram elementary cellular automata in Raku.

See L<https://mathworld.wolfram.com/ElementaryCellularAutomaton.html>.

This started out as an obfuscated Raku tweet some years ago. It
provides text output of Wolfram automata.

=head1 SCRIPTS

=head2 wolfram-rule

=begin output

$ wolfram-rule --rule=30
..................................................X..................................................
.................................................XXX.................................................
................................................XX..X................................................
...............................................XX.XXXX...............................................
..............................................XX..X...X..............................................
.............................................XX.XXXX.XXX.............................................
............................................XX..X....X..X............................................
...........................................XX.XXXX..XXXXXX...........................................
..........................................XX..X...XXX.....X..........................................
.........................................XX.XXXX.XX..X...XXX.........................................
........................................XX..X....X.XXXX.XX..X........................................
.......................................XX.XXXX..XX.X....X.XXXX.......................................
......................................XX..X...XXX..XX..XX.X...X......................................
.....................................XX.XXXX.XX..XXX.XXX..XX.XXX.....................................
....................................XX..X....X.XXX...X..XXX..X..X....................................
...................................XX.XXXX..XX.X..X.XXXXX..XXXXXXX...................................
..................................XX..X...XXX..XXXX.X....XXX......X..................................
.................................XX.XXXX.XX..XXX....XX..XX..X....XXX.................................
................................XX..X....X.XXX..X..XX.XXX.XXXX..XX..X................................
...............................XX.XXXX..XX.X..XXXXXX..X...X...XXX.XXXX...............................
..............................XX..X...XXX..XXXX.....XXXX.XXX.XX...X...X..............................
.............................XX.XXXX.XX..XXX...X...XX....X...X.X.XXX.XXX.............................
............................XX..X....X.XXX..X.XXX.XX.X..XXX.XX.X.X...X..X............................
...........................XX.XXXX..XX.X..XXX.X...X..XXXX...X..X.XX.XXXXXX...........................
..........................XX..X...XXX..XXXX...XX.XXXXX...X.XXXXX.X..X.....X..........................
.........................XX.XXXX.XX..XXX...X.XX..X....X.XX.X.....XXXXX...XXX.........................
........................XX..X....X.XXX..X.XX.X.XXXX..XX.X..XX...XX....X.XX..X........................
.......................XX.XXXX..XX.X..XXX.X..X.X...XXX..XXXX.X.XX.X..XX.X.XXXX.......................
......................XX..X...XXX..XXXX...XXXX.XX.XX..XXX....X.X..XXXX..X.X...X......................
.....................XX.XXXX.XX..XXX...X.XX....X..X.XXX..X..XX.XXXX...XXX.XX.XXX.....................
....................XX..X....X.XXX..X.XX.X.X..XXXXX.X..XXXXXX..X...X.XX...X..X..X....................
...................XX.XXXX..XX.X..XXX.X..X.XXXX.....XXXX.....XXXX.XX.X.X.XXXXXXXXX...................
..................XX..X...XXX..XXXX...XXXX.X...X...XX...X...XX....X..X.X.X........X..................
.................XX.XXXX.XX..XXX...X.XX....XX.XXX.XX.X.XXX.XX.X..XXXXX.X.XX......XXX.................
................XX..X....X.XXX..X.XX.X.X..XX..X...X..X.X...X..XXXX.....X.X.X....XX..X................
...............XX.XXXX..XX.X..XXX.X..X.XXXX.XXXX.XXXXX.XX.XXXXX...X...XX.X.XX..XX.XXXX...............
..............XX..X...XXX..XXXX...XXXX.X....X....X.....X..X....X.XXX.XX..X.X.XXX..X...X..............
.............XX.XXXX.XX..XXX...X.XX....XX..XXX..XXX...XXXXXX..XX.X...X.XXX.X.X..XXXX.XXX.............
............XX..X....X.XXX..X.XX.X.X..XX.XXX..XXX..X.XX.....XXX..XX.XX.X...X.XXXX....X..X............
...........XX.XXXX..XX.X..XXX.X..X.XXXX..X..XXX..XXX.X.X...XX..XXX..X..XX.XX.X...X..XXXXXX...........
..........XX..X...XXX..XXXX...XXXX.X...XXXXXX..XXX...X.XX.XX.XXX..XXXXXX..X..XX.XXXXX.....X..........
.........XX.XXXX.XX..XXX...X.XX....XX.XX.....XXX..X.XX.X..X..X..XXX.....XXXXXX..X....X...XXX.........
........XX..X....X.XXX..X.XX.X.X..XX..X.X...XX..XXX.X..XXXXXXXXXX..X...XX.....XXXX..XXX.XX..X........
.......XX.XXXX..XX.X..XXX.X..X.XXXX.XXX.XX.XX.XXX...XXXX.........XXXX.XX.X...XX...XXX...X.XXXX.......
......XX..X...XXX..XXXX...XXXX.X....X...X..X..X..X.XX...X.......XX....X..XX.XX.X.XX..X.XX.X...X......
.....XX.XXXX.XX..XXX...X.XX....XX..XXX.XXXXXXXXXXX.X.X.XXX.....XX.X..XXXXX..X..X.X.XXX.X..XX.XXX.....
....XX..X....X.XXX..X.XX.X.X..XX.XXX...X...........X.X.X..X...XX..XXXX....XXXXXX.X.X...XXXX..X..X....
...XX.XXXX..XX.X..XXX.X..X.XXXX..X..X.XXX.........XX.X.XXXXX.XX.XXX...X..XX......X.XX.XX...XXXXXXX...
..XX..X...XXX..XXXX...XXXX.X...XXXXXX.X..X.......XX..X.X.....X..X..X.XXXXX.X....XX.X..X.X.XX......X..
.XX.XXXX.XX..XXX...X.XX....XX.XX......XXXXX.....XX.XXX.XX...XXXXXXXX.X.....XX..XX..XXXX.X.X.X....XXX.

=end output

=head1 AUTHORS

=item David Brunton
=item Tommy Brunton

=head1 COPYRIGHT AND LICENSE

Copyright 2006 - 2016 David Brunton, Tommy Brunton

Copyright 2024 Raku Community

This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.

=end pod

# vim: expandtab shiftwidth=4


