#!/usr/bin/perl -w

use 5.032;

$|++;

# Random Data 3D written to find a minimum 

my @data;
for my $i (0..1000){
    for my $j (0..1000){
	for my $k (0..1000){
	    $data[$i][$j][$k] = rand();
	}
    }
}

say "Data readed";

# búsqueda MIN por retículas

my $t0 = time();

my $unit = 501*501*501;
my $c = 0;
my $min = 9e99;
my ($ii, $jj, $kk);
for (my $i=0; $i<=1000; $i += 2){
    for (my $j=0; $j<=1000; $j += 2){
	for (my $k=0; $k<=1000; $k += 2){
	    $c++;
	    next unless (defined $data[$i][$j][$k]);
	    print  "\r" . qw( · - o \ | / )[ $c % 6 ] 
	      . " |" . "=" x int(50*$c/$unit) . ">" .
	      " " x int( 50*($unit-$c)/$unit) . "| ".
	      int ( 100 * $c / $unit ) . "%  ";    
	    
	    if ($data[$i][$j][$k] < $min){
		$min = $data[$i][$j][$k];
		$ii = $i;
		$jj = $j;
		$kk = $k;
	    }
	}
    }
}
say "";
say "$ii $jj $kk -> $min";

say "Local search:";

my ($iii, $jjj, $kkk);
for my $i ($ii-1 .. $ii+1){
    for my $j ($jj-1 .. $jj+1){
	for my $k ($kk-1 .. $kk+1){
	    next unless (defined $data[$i][$j][$k]);
	    if ($data[$i][$j][$k] <= $min){
		$min = $data[$i][$j][$k];
		$iii = $i;
		$jjj = $j;
		$kkk = $k;
	    }
	}
    }
}
	    
say "$iii $jjj $kkk -> $min";

say "Elapsed time = ", time()-$t0, " seconds";

exit 1;

#        print  "\r" . qw( · - o \ | / )[ $c % 6 ] .
#            " |" . "=" x int(50*$c/$Bytes) . ">" .
#            " " x int(50*($Bytes-$c)/$Bytes) . "| " .
#            int(100*$c/$Bytes) . "%  ";    

__END__
  
Reticula search is used to make a brute force search over a 3D field
  

