### 抽選プログラム ### drawlist.txt は抽選対象者(1回戦勝者)のリスト。 ### 抽選対象者の多い作品順(同数ならば作品名の五十音順)に並べる。 ### 作品内では名前の五十音順に並べる。 ### random1.txt, random2.txt は数字のリスト。 ### 0〜10000くらいの範囲で、念のため抽選対象者数×3くらい用意する。 ### 「失敗」が出たら、random1.txt の上5つを取り除いて再度実行する。 ### 同率通過の追加分はA2d, B2d, C2d, D2d, A3d, B3d, C3d, D3d の順で入れる。 ### ブロック分け このブロック内に同一作品は入らない $block = 1; $s1 = 'A'; for($i=0; $i<4; $i++) { for($j=1; $j<5; $j++) { if( $j == 3 ) { $block++; } $s2 = 'a'; for($k=0; $k<3; $k++) { $str = $s1 . $j . $s2; $box{$str} = $block; $s2++; } } $s1++; $block++; } ### 追加分 $box{"A2d"} = 1; ### シードの読み込み %name = ("A1a" => "翠星石@ローゼンメイデン トロイメント", "A4c" => "アオイ・セノー@舞-乙HiME", "B1a" => "アリス・キャロル@ARIAシリーズ", "B4c" => "水無灯里@ARIAシリーズ", "C1a" => "グレーテル@おとぎ銃士 赤ずきん", "C4c" => "藤岡ハルヒ@桜蘭高校ホスト部", "D1a" => "朝比奈みくる@涼宮ハルヒの憂鬱", "D4c" => "コトナ・エレガンス@ゾイドジェネシス" ); ### 抽選 open(DL, "drawlist.txt"); open(RL1, "random1.txt"); open(RL2, "random2.txt"); while(
) { chop; $name = $_; $title = $name; $title =~ s/.*@//; @blockcheck = (); ### ブロックに同作品が既にいたら1 foreach $b (keys(%name)) { $tmptitle = $name{$b}; $tmptitle =~ s/.*@//; if ( $title eq $tmptitle ) { $blockcheck[$box{$b}] = 1; } } print "$name\n 候補枠 "; @okbox = (); ### 入れる枠のリスト foreach $b (sort (keys(%box))) { if ( !$name{$b} && !$blockcheck[$box{$b}] ) { push @okbox, $b; print "$b "; } } $oknum = @okbox; print "\n合計 $oknum 枠 "; if ( !$oknum ) { print "失敗\n"; exit(0); } # 抽選 $lot1 = ; chop($lot1); $lot2 = ; chop($lot2); $lot = $lot1 + $lot2; print "$lot % $oknum + 1 = "; $lot %= $oknum; printf("$lot + 1 = %d 番目 => $okbox[$lot]\n", $lot + 1); $name{$okbox[$lot]} = $name; } close(RL2); close(RL1); close(DL); ### 最終結果表示 print "抽選結果\n"; foreach $b (sort (keys(%box))) { print "$b $name{$b}\n"; }