#!/usr/bin/perl @Users = ( # First column for the allowance pattern, Second is ID, and Third is unused column. ["1111011011", 0,0], ["1011010111", 1,0], ["0111110111", 2,0], # ["1011010010", 3,0], # ["1100010011", 4,0], #["1010010010", 5,0], #["1001000001", 6,0], #["0011001110", 7,0], #["0100111011", 8,0], #["1011111101", 9,0], #["0100101011",10,0], #["1110101011",11,0], #["0111101111",12,0], #["0010001111",13,0], #["1111010010",14,0], #["0010011001",15,0], #["1101011111",16,0], #["1000100001",17,0], #["0111000000",18,0], #["0110000110",19,0], #["0100000010",20,0], #["1011101101",21,0], #["0000110111",22,0], #["0111001111",23,0], #["1000101110",24,0], #["1111111000",25,0], #["1010101011",26,0], #["0010000001",27,0], #["1011011001",28,0], #["1111110101",29,0], #["0110100001",30,0], #["1111001111",31,0], #["0110010010",32,0], #["1001101010",33,0], #["1001111011",34,0], #["1101100011",35,0], #["1010111011",36,0], #["1100111110",37,0], #["1100101110",38,0], #["0110000101",39,0], #["1111011011",40,0], #["1011101111",41,0], #["0100011011",42,0], #["1011000101",43,0], #["0000001010",44,0], #["0010011111",45,0], #["0111110000",46,0], #["1100101000",47,0], #["1011001101",48,0], #["0000000101",49,0], #["0000110010",50,0], #["1111110010",51,0], #["1111110110",52,0], #["0001100001",53,0], #["1000010111",54,0], #["0000001101",55,0], #["0010101101",56,0], #["1011111011",57,0], #["1100101111",58,0], #["0001101101",59,0] ); @Exps = ( # First column is ID, Second is min_member and Third is max_member (unused). [0,3,5], [1,3,5], [2,3,5], [3,3,5], [4,3,5], [5,3,5], [6,3,5], [7,3,5], [8,3,5], [9,3,5]); @Exp = (); @users = @Users; while(-1){ while(@users){ sort_users_2(); $u = shift(@users); sort_exps(); foreach $e(@Exps){ if(is_allow($u,$e) && !is_enough($e)){ append_user($e,$u); last; } } } @tmp = (); @rest = (); $flag = 0; while($e = shift(@Exps)){ if(!is_enough($e) && exp_current($e)){ while($d = shift(@{$Exp[$$e[0]]})){ push(@rest,$d); } $flag = 1; }else{ push(@tmp,$e); } } @Exps = @tmp; @users = @rest; last unless $flag; } show(); exit 0; sub show{ foreach $e(@Exps){ print "$$e[0]: "; foreach(@{$Exp[$$e[0]]}){ print "$$_[1] "; } print "\n"; } print "Rest: "; foreach(@rest){ print "$$_[1] "; } print "\n"; } sub is_allow{ my ($user,$exp) = @_; return substr($$user[0],$$exp[0],1); } sub allownum{ return $$_[0][0] =~ tr/1//; } sub len{ my $n = 0; foreach(@{$_[0]}){ $n++ if $_; } return $n; } sub is_enough{ return exp_min($_[0])<=exp_current($_[0]); } sub is_full{ return exp_max($_[0])<=exp_current($_[0]); } sub exp_max{ return $_[0][2]; } sub exp_min{ return $_[0][1]; } sub exp_current{ return len($Exp[$_[0][0]]); } sub exp_rest{ return exp_min($_[0])-exp_current($_[0]); } sub append_user{ push(@{$Exp[$_[0][0]]},$_[1]); } sub sort_users{ @users = sort {allownum($a) <=> allownum($b)} @users; } sub sort_exps{ @Exps = sort { exp_rest($a)<=>exp_rest($b)}@Exps; } sub sort_users_2{ @users = sort {allownum_2($a) <=> allownum_2($b)} @users; } sub allownum_2{ my($list) = $$_[0][0]; my $i; foreach(@Exps){ my $n = ${$_}[0]; if ((!is_enough($_)) && substr($list,$n,1)){ $i++; } } return $i; }