Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use strict;
- use warnings;
- my $NUM_RULES = 8;
- my $NUM_LINES = 15;
- my %rule_table = ();
- sub log2($)
- {
- return log($_[0]) / log(2);
- }
- sub int2bitvec($$)
- {
- my ($l, $n) = @_;
- my @s = ();
- unshift @s, ($n >> $l) & 1 while $l--;
- return @s;
- }
- sub bitvec2str($)
- {
- return join '', reverse @{$_[0]};
- }
- sub build_rules($)
- {
- my @v = int2bitvec($NUM_RULES, $_[0]);
- for (my $i = 0; $i < $NUM_RULES; ++$i)
- {
- my @t = int2bitvec(log2($NUM_RULES), $i);
- $rule_table{bitvec2str(\@t)} = $v[$i];
- }
- }
- sub print_rules()
- {
- print "\n";
- foreach my $key (sort keys %rule_table)
- {
- print "$key = $rule_table{$key}\n";
- }
- }
- sub line_length($)
- {
- return 2 * $_[0] + 1;
- }
- print "Enter a rule: ";
- my $n = <STDIN>;
- ($n =~ /^\d+$/ and $n < 2 ** $NUM_RULES)
- or die "Please specify a positive integer less than " .(2 ** $NUM_RULES). "\n";
- build_rules($n);
- #print_rules();
- print "\n";
- my $prev_line = "";
- my $curr_line = "1";
- my $pad_print = "";
- my $line_print = "";
- my $pad = "";
- for (my $i = 0; $i < $NUM_LINES; ++$i)
- {
- $prev_line = $curr_line;
- $curr_line = "";
- $pad = 0 x (((line_length($NUM_LINES) + 2) - line_length($i)) / 2);
- $pad_print = $pad;
- $pad_print =~ s/0/ /g;
- $line_print = $prev_line;
- $line_print =~ s/0/ /g;
- $line_print =~ s/1/x/g;
- print $pad_print . $line_print . $pad_print . "\n";
- for (my ($c, $j) = (0, (line_length($NUM_LINES) - line_length($i)) / 2 - 1);
- $c < line_length($i + 1); ++$c, ++$j)
- {
- $curr_line .= $rule_table{substr($pad . $prev_line . $pad, $j, 3)};
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement