#!/usr/local/bin/perl -w

$demanda = 10_000;             # en unidades
print "Se demandan $demanda unidades.\n";
  
# FASE 1: Recepción de ofertas

$tiempo_de_recepcion = 1;    # en segundos
$t0 = time;
$deadline = $t0+$tiempo_de_recepcion;

$count = 0;
while (time <= $deadline){
    $oferta[$count][0]=$count;
    $oferta[$count][1]=(A, B, C, D, E, F, G, H, I, J, K, L)[int rand(12)];
    $oferta[$count][2]=100+10*int rand(51);  # tamaño del lote
    $importe = sprintf("%.2f", (1000+rand()*10000));
    $oferta[$count][3]=$importe/$oferta[$count][2];  # precio unitario
    $count++;
}
print "Se han recibido $count lotes de ofertas...\n";

# FASE 2: Ordenación

@sorted = sort {
    $a->[3] <=> $b->[3] ||
      $a->[0] <=> $b->[0]
} @oferta;


# FASE 3: Selección

$sum=$sumprecio=0;
for $aoaref ( @sorted ){
    @lote = @$aoaref;
    if ($lote[2]+$sum  <= $demanda ){
	$sum += $lote[2];
	$precio = $lote[2]*$lote[3];
	print "Lote $lote[0] de $lote[1]: $lote[2] u. por $precio\n";
	$sumprecio += $precio;
	last if $sum == $demanda;
    }else{
	$cantidad = $demanda-$sum;
	die "Error" if $cantidad > $lote[2];
	$sum += $cantidad;
	$precio = sprintf("%.2f", $cantidad*$lote[3]);
	print "Lote parcial $lote[0] de $lote[1]: $cantidad u. por $precio\n";
	$sumprecio += $precio;
	last;
    }
}
print "Se pueden contratar $sum unidades.\n";
$preciomedio = $sumprecio/$demanda; 
print "Se paga $sumprecio en total, a un precio medio de $preciomedio\n";
$tiempo = time-$t0;
print "Fin de $0: se tardó $tiempo segundos.\n";

__END__
