#!/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; sort_exps_reverse(); while($e = shift(@Exps)){ if(!is_enough($e) && exp_current($e)){ while($d = shift(@{$Exp[$$e[0]]})){ push(@rest,$d); } push(@tmp,$e) if $flag++; }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_exps_reverse{ @Exps = reverse 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; }