
Untitled
By: a guest on
Jun 8th, 2010 | syntax:
Perl | size: 1.66 KB | hits: 109 | expires: Never
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)};
}
}