интересная задача из moscow-pm рассылки
Dec. 23rd, 2009 03:05 amрандомная равномерная сортировка без повторений
возможно надо вставить рандомизацию вставки @rest в @main.
use List::Util qw( shuffle );
print @ARGV;
my $a = shift;
my ( @main,@rest );
foreach ( shuffle @ARGV ) {
if ( $a eq $_ ) { push @rest,$a } else { push @main,$a }
$a = $_;
}
push @rest,$a; @rest = shuffle @rest;
foreach (0..9) {
last unless ( @rest );
my @ary;
while (($a,$b) = splice @main,0,2) {
if ( defined $b ) {
push @ary,$a eq $rest[0] || $b eq $rest[0] ? ( $a,$b ) : ( $a,shift ( @rest ),$b );
}
else {
push @ary,$a eq $rest[0] ? ( $a ) : ( $a,shift ( @rest ) );
}
}
@main = @ary;
}
print @main;
# perl -l sh.pl a a a a a b b b c c c c d e e e e e e e e e e
aaaaabbbccccdeeeeeeeeee
aececeaebeabedaececebea
возможно надо вставить рандомизацию вставки @rest в @main.