#!/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__