### 抽選プログラム ### drawlist.txt は抽選対象者(1回戦勝者)のリスト。 ### 抽選対象者の多い作品順(同数ならば作品名の五十音順)に並べる。 ### 作品内では名前の五十音順に並べる。 ### random1.txt, random2.txt は数字のリスト。 ### 0〜10000くらいの範囲で、念のため抽選対象者数×3くらい用意する。 ### 「失敗」が出たら、random1.txt の上5つを取り除いて再度実行する。 ### 同率通過の追加分はE2d, F2d, G2d, H2d, E3d, F3d, G3d, H3d の順で入れる。 ### ブロック分け このブロック内に同一作品は入らない $block = 1; $s1 = 'E'; for($i=0; $i<4; $i++) { for($j=1; $j<5; $j++) { $s2 = 'a'; for($k=0; $k<3; $k++) { $str = $s1 . $j . $s2; $box{$str} = $block; $s2++; } $block++; } $s1++; } ### 追加分 $box{"E2d"} = 2; ### シードの読み込み %name = ("E1a" => "カルラ@うたわれるもの", "E4c" => "赤ずきん@おとぎ銃士 赤ずきん", "F1a" => "金城奈々穂@極上生徒会", "F4c" => "竜宮レナ@ひぐらしのなく頃に", "G1a" => "神尾観鈴@AIR IN SUMMER", "G4c" => "南都夜々@ストロベリー・パニック", "H1a" => "アリシア・フローレンス@ARIAシリーズ", "H4c" => "水銀燈@ローゼンメイデン トロイメント" ); ### 抽選 open(DL, "drawlist.txt"); open(RL1, "random1.txt.old"); open(RL2, "random2.txt.old"); 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"; }