{ '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