¿Qué tal?
explorer, creo que te complicaste un poco la solución. En general pues, ese problema es sencillo de resolverse utilizando
splice, puesto que
shift, pop, unshift, etc., están codificados utilizando splice() debajo de ellos.
Using perl Syntax Highlighting
#!/us/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @a = 1 .. 24;
my $tot = 5;
my $len = scalar @a / $tot;
my @AoA;
push @AoA, [ splice @a, 0, $len ] while $tot-- > 0;
push @{ $AoA[0] }, shift @a || shift @{ $AoA[ 1 + rand $#AoA ] } while @{ $AoA[0] } % 5;
print Dumper( \@AoA );
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Como está un poco críptico vamos a explicarlo:
Primero, para fines de ejemplo, generamos un
array de N cantidad de elementos, en este caso le puse 24. Después establecemos el tamaño de las particiones a crear y luego el tamaño de elementos exactos por cada una de ellas. Una vez hecho esto, declaramos el
array que almacenará cada partición como una referencia a otro
array, es decir un
Array of Arrays.
El primer
pop lo que hace es, ir tomando
$len cantidad de elementos de nuestro
array original e irlos poniendo en cada una de las particiones, como ya se mencionó pone cada partición como una referencia a un
array ( utilizando el constructor [] ).
Luego viene la parte interesante, la parte donde el autor original del mensaje requiere que al menos la primera partición sea múltiplo de 5. Esto se logra de la siguiente manera: Como se pudo observar, nunca vaciamos completamente nuestro
array original, solo generamos las particiones pedidas (5 para este caso) con una cantidad igual de elementos, los demás elementos quedaron en el
array original. Para esto lo que vamos a hacer es comprobar que mientras la primer partición no sea múltiplo de 5, vamos a tomar elementos de nuestro
array original mientras este contenga, en caso contrario, tomaremos algún elemento de manera aleatoria de otra de las particiones ya creadas.
Y con esto, solucionamos el problema propuesto.
Saludos,