#!/usr/bin/perl -w

# Dato: lista de opciones de menu, porcentaje de uso estimado y
# número de segundos para decirlo
# Se busca: menú óptimo -> mínima duración media

use 5.032;

# use experimental "postderef";
# no experimental;

# use experimental "declared_refs";

my $options = 100;   # lo único que importa es el número
my @lengths;              

my @use;
push @use, $_ for (1..100);  # el uso probable multiplicado por la longitud es idéntico al objetivo

# la diferencia en los niveles de menú es que el segundo menú suma toda la duración del primero (y un poco más de respuesta)

die "Bad data" if $options != scalar(@use);

my @ouse = sort { $b <=> $a } @use;
push @lengths, 4 + rand()*4 for (1..$options);     # esto se debería hacer en una misma estructura de datos $hash{nombre}{uso}{duración}

my $min = 9e99;
# posible número de niveles del menú
my $c=0;
my @group3;
my @tmp;
while (++$c < 10_000_000){
#    print "\r$c";
    @group3=();
    @tmp = @ouse;
	# el número de cortes en la lista en 1 menor que los trozos, además el último ya viene dado
	# agrupar según el corte
    my $k = 0;
loop:	
      my $p = 2 + int rand() * scalar(@tmp)/4;     # el menú mínimo tiene 2 opciones, el máximo tiene límite (10, en el ejemplo) 
     my @x = splice (@tmp, 0, $p);
    push @{$group3[$k]}, @x;
    if ($p >= scalar(@tmp)-2){
	push @{$group3[++$k]}, @tmp;
    }else{ 
	$k++; 
	goto loop; 
    }   

    my @sum;
    my $sumw;
    my $sumatotal = 0;
    my @lista = @lengths;
    my $cc = 0;   # línea menú  
    for my $i (@group3){
	$sum[$cc] = $sum[$cc-1] if (defined $sum[$cc-1]);     # +1 porque hay 1 segundo de respuesta
	for my $j (@{$i}){
	    $sumw += $lista[0];
	    $sum[$cc] += $j * shift (@lista) if (@lista);   # ??? Esto debería ser correcto porque se consume siempre @lista en el mismo, mismito, orden  
	    
	}
	$sumatotal += $sum[$cc]+1 if (defined $sum[$cc]);
	$cc++;
    }
    $sumatotal /= $sumw;
    
    # si se considera la suma total, se suma todo, y en realidad interesa mejorar la media 
	
    if ($sumatotal < $min){
	$min = $sumatotal;
	say "";
# RTFM:	
#           for $aref ( @AoA ) {
#	         say "\t [ @$aref ],";
#	    }
	
	say "$c) Objetivo = $sumatotal";
	for my $i (@group3){
	    say "@{$i}";
	}
    }
}    

exit 1;

__END__
El problema del robot o centralita para 10 extensiones es demasiado simple,
  por lo que lo extendemos a unas hipotéticas 100 exstensiones.
  

