#!/usr/bin/perl #=============================================================================== # # FILE: 1.pl # # USAGE: ./1.pl # # DESCRIPTION: j # # OPTIONS: --- # REQUIREMENTS: --- # BUGS: --- # NOTES: --- # AUTHOR: Andrey Kostenko (), # COMPANY: Rambler Internet Holding # VERSION: 1.0 # CREATED: 22.12.2009 22:18:40 MSK # REVISION: --- #=============================================================================== use 5.010; use strict; sub a { my @a = @_; my $v = int rand scalar @a; my %a = (); $a{$_} = ( $a{$_} || 0 ) + 1 foreach @a; my @b = (undef) x scalar(@a); my $i; while ( grep { ! defined $_ } @b ) { my @d = grep { (( $v == 0 || $_ ne $b[$v - 1]) && ($v == scalar( @a ) - 1 || $_ ne $b[$v + 1])) } keys %a; warn "@b\n", return a(@a) unless @d; $_ = $d[ int rand scalar @d ]; --$a{$_} or delete $a{$_}; $b[$v] = $_; my @v = grep {! defined $b[$_]} (0..$#a); last unless @v; $v = $v[ int rand scalar @v]; } return @b; } my @a = ( ('a') x 100, ('b') x 100, ('c') x 100, ('d') x 100 ); say join " ", a(@a);