#!/usr/bin/perl

use 5.034;

$|++; 

my %antiop = (
#    "=" => "=",
    "+" => "-",
    "-" => "+",
    "*" => "/",
    "/" => "*",
    "**" => "**(1/",
    "**(1/" => "**",
    "**2" => "sqrt",     # <-- problema
    "exp" => "log",
    "log" => "exp",
    # aquí no puede figurar % porque destruye información y no tiene operación de reversión
);

my %op = reverse %antiop;

my $flag = 0;
my $r;
my %stats;
my %counter;
for (my $i = 0.001; $i <= 100; $i += 0.001){
    for my $j (values %op){
        for ($j){
	    if ($_ eq "+"){
		$r = eval ("2$_$i"); # fase 1) 2 + 3 = 5 fase 2) 5 - (5) -> 5 - ( 3 + 2 )
		$r = eval( "$r $antiop{$_} $i $antiop{$_} 2");
		last;
	    }
	    if ($_ eq "-"){
		$r = eval( "2 $_ $i" );  # fase 1) 2-3 = -1  fase 2) -1 + (1) -> -1 + (-1 + 2) 
		$r = eval( "$i $antiop{$_} $r $_ 2" );
		last;
	    }
	    if ($_ eq "*") {
		$r= eval ("2 $_ $i");
		$r = eval ("$r $antiop{$_} $i - 2");
		last;
	    }
	    if ($_ eq "/") {
		$r = eval ("2 $_ $i");
		$r = eval ("$r $antiop{$_} $i - 2");
		last;
	    }
	    if ($_ eq "**") {
		$r = eval (" 2 $_($i)");
		$r = eval ("$antiop{$_}$r) - 2");  # ojo
		last;
	    }
	    if ($_ eq "**(1/"){
		$r = eval ("2$_$i)");
		$r = eval ("$antiop{$_}($r) -2");
		last;
	    }
	    if ($_ eq "**2"){
		$r = eval ("$i$_");
		$r = eval ("$antiop{$_}($r) -$i");
		last;
	    }
	    if ($_ eq "exp"){
		$r = eval ("$_ $i");
		$r = eval ("$antiop{$_}($r) -$i");
		last;
	    }
	    if ($_ eq "log"){
		$r = eval ("$_ $i");
		$r = eval ("$antiop{$_}($r) -$i");
	    }else{
		die "Error gordo";
	    }
	    # 
	}
	
	if ($r !=0){
	    $flag = 1;
	    $stats{ $j } += abs($r);
	    $counter{ $j }++; #  $r Not OK";
#	    exit 2;
	}else{
	    $counter{ "OK" }++;
#	    say "OK";
	}
    }
    print "\r", qw(| / - \ o)[$i % 4]; 
}
say "OK" if $flag ==0;
for my $i (keys %counter){
    say "\n$i\t\t\t$counter{$i}\t\t\t", $stats{$i}/$counter{$i};
}
exit 3;

				    
