#!/usr/bin/perl

use 5.040.3;

$|=1;

# init space to search in
say "Init...";
my $space = 38_000;
say "Space to search in = ", ($space+1)**2;
my $MAGIC = 9999973;       # este es un factor de rareza: no necesita ser un número primo

my @s;
my $total = 0;
for my $i (0 .. $space){
    for my $j (0 .. $space){
#	$s[$i][$j] = 0;
	if ( ($i * $j + ($i + $j)) % $MAGIC == 0 ){
	    $s[$i][$j] = 1000 * rand();                # beneficio        
	    $total += $s[$i][$j];
	}
    }
}

# call a sub search() until lunch
say "Search...";
my $t0 = time();
my $TIMEOUT = 15 * 60;  #   MINUTES * seconds

my ($x, $y) = ( int($space/2), int($space/2) );
my $collect = 0;
my $c = 0;

my $rand = 27;        # an attempt to reduce rand() calls

while ( time() - $t0 < $TIMEOUT ){               # 10 minutos
    print "\r$c";
    $collect += search(++$c);    
}

# Resultados de la búsqueda
say "\n[terminado después de $TIMEOUT segundos aprox.]\n";

say "\nEsta vez se ha recogido $collect de $total\n";
if ($collect > $total){
    say "Ha pasado varias veces por el mismo sitio\n";
    say "El porcentaje de eficacia es 100% (con eso se puede estar contento)\n";
    say "(Pero hay un cierto derroche en la búsqueda...)";
}else{
    say "El porcentaje de éxito es de ", 100 * $collect / $total, " %\n";
}    

exit 2;


sub search {                   # realmente esto es lo que importa. 
    if ($_[0] & 1){
	$rand = int (0.5+rand($space));           # trata de hacer cosa complicada la mitad de veces 
	$x = ($x == $space) ? 0 : ++$x;           # trata de moverse rápido
	$y = $rand;                               # trata de moverse lejos
    }else{
	$x = $rand;
	$y = ($y == $space) ? 0 : ++$y;
    }
    return 0 unless defined $s[$x][$y];
    return $s[$x][$y];
}

