Skip to content

Instantly share code, notes, and snippets.

@toniher
Created April 10, 2018 13:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save toniher/91b60f680bc84b1ee02244084c8279cd to your computer and use it in GitHub Desktop.
Save toniher/91b60f680bc84b1ee02244084c8279cd to your computer and use it in GitHub Desktop.
Simple script for putting in groups in a random way
#!/usr/bin/env perl
use Data::Dumper;
use Text::Trim;
use POSIX;
use List::Util qw(shuffle);
my $file = shift;
my @struct;
my @groups;
my @pending;
my $ngroups = 10;
my $count = 0;
open( FILE, $file ) || die "Cannot open $file";
while (<FILE>) {
my ($name, $group) = split( /\t/, $_ );
my $entry;
$entry->{"name"} = trim( $name );
$entry->{"group"} = trim( $group );
push( @struct, $entry );
$count++;
}
close( FILE );
@struct = shuffle @struct;
my $floor = floor( ( $#struct + 1 ) / $ngroups );
my $try = 0;
foreach my $person ( @struct ) {
@groups = iterate( $ngroups, $person, \@groups, $try );
}
$try = 1;
foreach my $person ( @pending ) {
@groups = iterate( $ngroups, $person, \@groups, $try );
}
my $iter = 1;
foreach my $group ( @groups ) {
print "* GRUP $iter", "\n";
print "* ".join( ", ", @{$group->{"groups"}} ). "\n";
print "\n";
foreach my $name ( sort( @{$group->{"names"} } ) ) {
print $name, "\n";
}
print "\n\n";
$iter++;
}
sub iterate {
my $ngroups = shift;
my $person = shift;
my $pregroups = shift;
my @groups = @{$pregroups};
my $name = $person->{"name"};
my $group = $person->{"group"};
my $not = 0;
for ( my $i = 0; $i < $ngroups; $i++ ) {
$fgroup = $groups[$i];
if ( defined( $fgroup->{"groups"} ) ) {
my $sgroup = $#{$fgroup->{"groups"}} + 1;
if ( grep( /^$group$/, @{$fgroup->{"groups"}} ) && $try == 0 ) {
$not = 1;
} else {
if ( $sgroup < $floor + $try ) {
push( @{$fgroup->{"groups"}}, $group );
push( @{$fgroup->{"names"}}, $name );
$groups[$i] = $fgroup;
$not = 0;
last;
}
}
} else {
push( @{$fgroup->{"groups"}}, $group );
push( @{$fgroup->{"names"}}, $name );
$groups[$i] = $fgroup;
$not = 0 ;
last;
}
}
if ( $not > 0 ) {
push( @pending, $person );
}
return @groups;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment