#!/usr/bin/perl

use 5.038.2;

# Simulación residencia de estudiantes

# hay alguna similitud con precios de primera y turista en avión

my $tam = 80;  # número de habitaciones

my $lejanos = 0.10;    # porcentaje destinado a no correspondientes a la región

my $m = int ($tam * $lejanos);  # pequeño 
my $n = $tam - $m;              # grande

my (@p1, @p2);         # precio mayoría y minoría

my $c = 0;

my $coste = 1_000;     # mínimo por periodo

my ($d1, $d2);         # demandas *simuladas* curso, cuatrimestre, etc.

my ($r1, $r2);         # diferencia de rentas simulada entre mayoría y minoría  
                       # supuesto razonable $r2 > $r1, pero *simuladas*
                       # No mucha diferencia

                       # hmm

                       # supuesto medio razonable: se pone $p1 y $p2 a la primera 
                       # habitación asignada de cada tipo, y se va bajando

my ($max, $min) = ( -9e99, 9e99 );
my ($c1, $c2, $sum1, $sum2, $vacio) = ( 0, 0, 0, 0, 0 );

while (++$c < 10_000){

    # la demada simulada + sencilla es una recta de pendiente negativa 
    # q_i = M - b * p_i       (suposición razonable b=1)
    # tonces, p_i = (q_i - M) / -b  ... pero b=1 para no liarse de mano  
    
    # la demanda que se necesita para arrancar es el exceso sobre la
    # capacidad de cada tipo. Suposición razonable exceso >= 0

    $c1 = $c2 = $sum1 = $sum2 = $vacio = 0;
    
    # el factor $coste y 8 es q se supone que 4 habitaciones dobles financian
    # una persona de personal
    
    $r1 = ( 1 + rand() / 2 ) * 8 * $coste;   # intentar hacerlo todo según la misma escala
    $r2 = (1 + rand() /2) * $r1; 

    $d1 = int( ( 1 + rand ) * $n );
    $d2 = $d1 * $lejanos + rand() * $m;
    
    # probar precios máximos
    
    $p2[1] = $coste/8 + ($d2 + $r2) * ($r2 / $r1) * (1 + $lejanos);
    
    # p_max_lejanos depende de + demanda suya, + renta suya, dif. relativa renta
    # y que paguen el espacio reservado

    $p1[1] = $coste/8 + $p2[1] * ($r1 / $r2) * (1 - $lejanos);
    
    $p2[$_] = $p2[$_-1] * ($m - $_ + 3*$m) / (4*$m) for ( 2 .. $m ); 
    
    $p1[$_] = $p1[$_-1] * ($n - $_ + 8*$n) / (9*$n) for ( 2 .. $n );
    
    $p1[$_] = coin($p1[$_]) for (1 .. $n);
    $p2[$_] = coin($p2[$_]) for (1 .. $m);

    # desarrollar: si se gestionan o no posibles vacíos

    for my $i (1 .. $n ){
	if (++$c1 <= $d1){
	    $sum1 += $p1[$i];
	}else { $vacio++; }
    }
    for my $i (1 .. $m ){
	if (++$c2 <= $d2){
	    $sum2 += $p2[$i];
	}else{ $vacio++; }
    }
    my $total = $sum1 + $sum2;
    print "mayoría = $sum1   minioría = $sum2   total = $total   ";
    $max = $total if $total > $max;
    $min = $total if $total < $min;
    say "MAX = $max   MIN = $min";     
}

say "\nListado de ejemplo de precios del último caso";
say "Demanda tipo 1 = $d1   tipo2 = $d2";
$c1 = $c2 = $sum1 = $sum2 = 0;
for my $i (1 .. $n ){
    if (++$c1 <= $d1){
	say "Tipo 1, $i)   ", coin($p1[$i]); 
	$sum1 += $p1[$i];
    }else { $vacio++; }
}
for my $i (1 .. $m ){
    if (++$c2 <= $d2){
	say "Tipo 2, $i)   ", coin($p2[$i]);
	$sum2 += $p2[$i];
    }else{ $vacio++; }
}

exit 3;

sub coin {
    return sprintf "%.02f", $_[0];
}

