{ 'c', 'i', 'o', 'p' }
####
S -> Sp
op -> i
ip -> c
oc -> io
ic -> co
cS -> ioS
##
##
$S = 'o';
for (1..16) {
$S .= 'p'; # S -> Sp
@processing = ($S);
$S =~ s/op/i/; # op -> i
$S =~ s/ip/c/; # ip -> c
push @processing, $S;
while ($S =~ /c/) {
$S =~ s/oc/io/; # oc -> io
$S =~ s/ic/co/; # ic -> co
$S =~ s/^c/io/; # cS -> ioS
push @processing, $S;
}
@out = map { sprintf ("%6s", $_) } @processing;
printf ("%-44s == %6s\n", join (" ->", @out), $S);
}
##
##
op -> i == i
ip -> c -> io == io
iop -> ii == ii
iip -> ic -> ioo == ioo
ioop -> ioi == ioi
ioip -> ioc -> iio == iio
iiop -> iii == iii
iiip -> iic -> ico -> iooo == iooo
iooop -> iooi == iooi
iooip -> iooc -> ioio == ioio
ioiop -> ioii == ioii
ioiip -> ioic -> ioco -> iioo == iioo
iioop -> iioi == iioi
iioip -> iioc -> iiio == iiio
iiiop -> iiii == iiii
iiiip -> iiic -> iico -> icoo -> ioooo == ioooo
##
##
$S = 'opppppppp'; # (S -> Sp) x 8
while ($S =~ /p/) {
@processing = ($S);
$S =~ s/op/i/; # op -> i
push @process, $S;
$S =~ s/ip/c/; # ip -> c
push @processing, $S;
while ($S =~ /c/) {
$S =~ s/oc/io/; # oc -> io
$S =~ s/ic/co/; # ic -> co
$S =~ s/^c/io/; # cS -> ioS
push @processing, $S;
}
@out = map { sprintf ("%9s", $_) } @processing;
print join (" ->", @out), "\n";
}
##
##
opppppppp -> ippppppp -> cpppppp -> iopppppp
iopppppp -> iippppp -> icpppp -> ioopppp
ioopppp -> ioippp -> iocpp -> iiopp
iiopp -> iiip -> iic -> ico -> iooo
##
##
8 -> iooo