#!/usr/local/bin/perl
# Arithmetic, GPL(C) http://www.cs.albany.edu/~mosh Mohsin Ahmed.
# Generate a set of arithmetic problems for children under eighty.

$col     = 40; # width.
$blk     = 6;  # blocks of numbers.

sub nl { print "\n"; }
sub hline { print "-"x ($col*2),"\n"; }
sub random { @_[0] + int(rand(@_[1])); } # random[min,max]

sub heading {
	my $now =scalar(localtime());
	substr($now,12,3)=''; # remove seconds from time.
	substr($now,0,4)= ''; # remove 'Sun'/'Mon'.
	
	print "Arithmetic, GPL(C) http://www.cs.albany.edu/~mosh, ",
		$now, " ($page).\n";
	hline;
}

sub newpage { 
	$page++;
	printf "%c",12;  
	nl;
	heading();
}

srand(time()^($$*$$<<16));

heading;
for $k (1..3){ one_addition(); } nl;
for $k (1..3){ one_substraction(); } nl;
for $kk (1..7){ three_horizontal($kk); } nl; 
newpage;
for $kk (1..3){ one_vert_multiplication(); } nl;
for $kk (1..8){ three_horizontal($kk); } nl;
for $kk (1..3){ two_vert_multiplication(); } nl;
newpage;
for $kk (1..28){ three_horizontal($kk); } nl;

# subroutines.

sub one_addition {
    for $i (1..3){
        print "+ ";
        for $j (1..$col-1){ 
            if( $j % $blk == $blk-1 ){
                print '  ';
            }else{
                printf "%d ", int(rand(10)); 
            }   
        }
        nl;
    }
    hline; nl; hline;
}

sub one_substraction {
    hline;
    printf(" %1d ",int(rand(9))+1); 
    for $j (1..$col-2){ 
        printf '%d ',int(rand(10));  
    }
    nl; print ' - ';
    for $j (1..$col-2){ 
        if( $j % $blk == $blk-1 ){
            print '  ';
        }else{
            printf '%d ',int(rand(10));  
        }
    }
    nl; hline; nl;  hline;
}

sub one_vert_multiplication {
    for $k (1..$col/2.1){ printf "---,"; }; nl; 
    for $k (1..$col/2.1){ printf " %2d|", int(rand(99)); }; nl;
    for $k (1..$col/2.1){ printf "x%2d|", int(rand( 9)+1); }; nl;
    for $k (1..$col/2.1){ printf "---|"; }; nl;
    for $k (1..$col/2.1){ printf "   |"; }; nl;
    for $k (1..$col/2.1){ printf "---'"; }; nl;
}

sub two_vert_multiplication {
    for $k (1..$col/3){ printf "-----,"; }; nl;
    for $k (1..$col/3){ printf " %3d |", int(rand(1000)); } nl;
    for $k (1..$col/3){ printf "x%3d |", int(rand(10)+1); } nl;
    for $k (1..$col/3){ printf "-----|"; }; nl;
    for $k (1..$col/3){ printf "     |"; }; nl;
    for $k (1..$col/3){ printf "-----'"; }; nl;
}


sub three_horizontal {
    my $level = shift;
    my( @oper ) = ('+','x','-','/');

    for $k (1..$col/3.5){  
        my $aa =    random(1,$level+5);
        my $bb =    random(1,9);
		my $oper =  $oper[ rand(@oper) ];


        # always $aa > $bb.
		if( $oper =~ m'/' ){ # == '/' doesnt work.
			$aa = int( $bb * random(1,9));            
		}elsif( $bb > $aa ){  
			($bb,$aa) = ($aa,$bb);
		}

        printf "%2d%s%d=  ",  $aa, $oper, $bb;  
    }; 
    nl; nl; 
}

# eof.

