#!/usr/bin/perl -w

use 5.034;

# generación de proyectos y tope de inversión

my $c = 100;
my @proj;
for my $i (0 .. $c-1){
    $proj[$i][0] = 100_000 * rand();     # NPV_i
    $proj[$i][1] = int ( rand() * $proj[$i][0] );    # Inv_i
}
my $tope = 1_000_000;

# filtrar NPV < 0 y Inv > $tope

# Definir criterios en subrutinas

# main, bucle principal, jlm_shuffle

my ($maxnpv, $maxinv, $maxratio, $maxcontador, $maxidoneidad) = (0, 0, 0, 0, 0);
for (0 .. $c**3){       # límite arbitrariamente grande
    my $suminv = 0;
    my $sumnpv = 0;
    my $contador = 0;
    my $ratio = 0;
    my $idoneidad = 0;
    my $label = "";
    my @sol = jlm_shuffle( (0..$c-1) );
    for my $j ( @sol ){
	last if ($suminv + $proj[$j][1] > $tope);
	$suminv += $proj[$j][1];
	$sumnpv += $proj[$j][0];
	$contador++;
    }
    $ratio = $sumnpv / $suminv;
    
    if ($sumnpv > $maxnpv){
	$maxnpv = $sumnpv;
	$idoneidad++;
	$label = "NPV ";
    }
    if ($suminv > $maxinv){
	$maxinv = $suminv;
	$idoneidad++;
	$label .= "INV ";
    }
    if ($ratio > $maxratio){
	$maxratio = $ratio;
	$idoneidad++;
	$label .=  "RATE ";
    }
    if ($contador > $maxcontador){
	$maxcontador = $contador;
	$idoneidad++;
	$label .= "NUMP ";
    }
    
    if ($idoneidad > $maxidoneidad){
	$maxidoneidad = $idoneidad;
	$label .= "OVERALL=$idoneidad ";
	$label .= "(max) with $contador projects\n";
	say "-" x 60;
	say "$label";
	for (1 .. $contador){
	    print "$sol[$_-1] ";
	}
	say "";
    }
}

exit 2;



sub jlm_shuffle {
    my @deck = @_;
    my @deck2;
    my $n = scalar(@deck);
    while ($n){
	my $t = int $n*rand(); 
	push @deck2, splice(@deck,$t,1);
	--$n;
    }
    return @deck2;
}

