http://www.perlmonks.org?node_id=1182083

Wasn't sure if this belongs here, or in Obfuscations.

Having once run:

```use strict;
use warnings;
use Storable;

my (%table);
foreach my \$i (0..9) {
foreach my \$j (\$i..9) {
\$table{\$i}{\$j} = \$table{\$j}{\$i} = \$i + \$j
}
}

```use strict;
use warnings;
use Storable;

my @problem = @ARGV;
my (%matrix);
foreach my \$number (@problem) {
my \$log = 0;
push @{\$matrix{\$log++}}, \$_ for reverse (split //, \$number);
}

my \$col = 0;
while (exists \$matrix{\$col}) {
my @column = @{\$matrix{\$col}};
my \$first = shift @column;
while(scalar @column > 0) {
my \$second = shift @column;
\$first = \$table{\$first}{\$second};
if (length(\$first) > 1) {
\$first = substr(\$first,-1,1);
push @{\$matrix{\$col + 1}}, 1;
}
}
\$matrix{\$col++} = \$first;
}
printf "%s",\$matrix{\$col - \$_} for (1..\$col);
print "\n";
```H:\perl>perl adder.pl 1
1

H:\perl>perl adder.pl 21 14 99 6 12
152

1000000000000000000000000000000000000000000

Addition tables for other number systems are left as an exercise for the (extremely bored) reader. Vaguely apropos of Multiply Hex values. I started to write a program to do multiplication and realized I needed to figure out how to add first.

But God demonstrates His own love toward us, in that while we were yet sinners, Christ died for us. Romans 5:8 (NASB)

Replies are listed 'Best First'.
by pryrt (Prior) on Feb 15, 2017 at 18:21 UTC

I had started down a similar path inspired by the same node, but focusing on hex -- and stopping abruptly when I got busy on more pressing (\$work-related) issues :-). I built the times and addition tables, and had started on my addition subroutine... but this is as far as I got. Posted for entertainment value only. :-)

```package HexMath;
my (%times, %sums);

BEGIN {    # create tables
for my \$x ( 0 .. 15 ) {
my \$hx = sprintf '%x', \$x;
for my \$y ( 0 .. 15 ) {
my \$hy = sprintf '%x', \$y;
next if exists \$times{\$hx}{\$hy};
\$times{\$hx}{\$hy} = \$times{\$hy}{\$hx} = sprintf '%x', \$x*\$y;
\$sums{\$hx}{\$hy} = \$sums{\$hy}{\$hx} = sprintf '%x', \$x+\$y;
}
}

printf "\n%4s: ", 'x ';
printf "%4x ", \$_ for 0..15;
for my \$x ( 0 .. 15 ) {
my \$hx = sprintf '%x', \$x;

printf "\n%4.4s: ", \$hx;

for my \$y ( 0 .. 15 ) {
my \$hy = sprintf '%x', \$y;
printf '%4.4s ', \$times{\$hx}{\$hy};
}
}
print "\n";

printf "\n%4s: ", '+ ';
printf "%4x ", \$_ for 0..15;
for my \$x ( 0 .. 15 ) {
my \$hx = sprintf '%x', \$x;

printf "\n%4.4s: ", \$hx;

for my \$y ( 0 .. 15 ) {
my \$hy = sprintf '%x', \$y;
printf '%4.4s ', \$sums{\$hx}{\$hy};
}
}
print "\n";

}

while( defined(my \$addend  = shift)) {

my \$c = 0;
for my \$hexit ( 1 .. length(\$addend) ) {
my \$x = lc substr(\$answer, -\$hexit, 1);
my \$y = lc substr(\$addend, -\$hexit, 1);
my \$s = \$sums{\$x}{\$y};
#my \$u =
printf "\n\t#%d: %s + %s = %s\n", \$hexit, \$x, \$y, \$s;
}