base: reorganise code
authorMischa POSLAWSKY <perl@shiar.org>
Mon, 23 Apr 2012 00:29:14 +0000 (02:29 +0200)
committerMischa POSLAWSKY <perl@shiar.org>
Fri, 19 Apr 2013 15:10:13 +0000 (17:10 +0200)
base.plp

index ad6961b..0ba0613 100644 (file)
--- a/base.plp
+++ b/base.plp
@@ -19,41 +19,52 @@ Html({
 <:
 use Math::BigFloat;
 
-my @cols = (2, 6, 8, 9, 10, 12, 16, 18, 60);
+my @cols = (2, 6, 8, 9, 10, 12, 16, 18);
+my $count = 42;
 print '<tr><th>';
 print '<th>', $_ for @cols;
 
 my @char = (0..9, 'A'..'Z', 'a'..'z');
-my $places = 48;
+my $places = $count<<1;
 
-for my $n (2 .. 25) {
+sub shownum {
+       my ($num, $radix) = @_;
+
+       my $out = '';
+       my $class = '';
+       my $zeros = 0;
+
+ADD_DIGITS:
+       for my $place (1 .. $places) {
+               $out .= $char[ $num->blsft(1, $radix) ];
+               $num->bmod(1) or do {
+                       $class = $out eq '1' ? 'l5' : $place == 1 ? 'l4' : 'l3';
+                       last;
+               };
+               $zeros++ if $out =~ /^0+$/;
+
+               for my $check ($zeros .. length($out)>>1) {
+                       if (substr($out, -$check) eq substr($out, -$check*2, $check)) {
+                               $class = $check == 1 ? 'l2' : 'l1';
+                               substr($out, -$check) = '';
+                               substr($out, -$check, 0) = '<span style="text-decoration:overline">';
+                               $check .= '</span>';
+                               last ADD_DIGITS;
+                       }
+               }
+       }
+       printf '<td%s style="text-align:left">%s', $class && qq( class="$class"), $out;
+}
+
+for my $n (2 .. $count) {
        print '<tr>';
        print '<th>', $n;
        for my $radix (@cols) {
                my $accuracy = int($places * log($radix) / log(10));
                Math::BigFloat->accuracy($accuracy);
-               my $frac = Math::BigFloat->new(1)->bdiv($n, $accuracy+1);
-               my $out = '';
-               my $class = '';
-ADD_DIGITS:
-               for my $place (1 .. $places) {
-                       $out .= $char[ $frac->blsft(1, $radix) ];
-                       $frac->bmod(1) or do {
-                               $class = $n == $radix ? 'l5' : $place == 1 ? 'l4' : 'l3';
-                               last;
-                       };
-                       for my $check (log($n)/log($radix) .. length($out)>>1) {
-                               if ($out =~ /[^0]/ and substr($out, -$check) eq substr($out, -$check*2, $check)) {
-                                       $class = $check == 1 ? 'l2' : 'l1';
-                                       substr($out, -$check) = '';
-                                       substr($out, -$check, 0) = '(';
-                                       last ADD_DIGITS;
-                               }
-                       }
-               }
-               printf '<td%s>%s', $class && qq( class="$class"), $out;
+               shownum(scalar Math::BigFloat->new(1)->bdiv($n, $accuracy+1), $radix);
        }
-#      \x{305}
 }
+
 :></table>