リロード 新規 編集 凍結 差分 添付 トップ 一覧 単語検索 最終更新 バックアップ ヘルプ |
メモ表作成&発言数解析 †print "<html><head><style>td{font-size:x-small;}</style></head><table><tr><td>\n"; @data = <DATA>; chomp @data; $i = $#data; while($i-- > 0){ last if $data[$i] eq 'ブラウザの更新ボタンは押さないでください'; } while(1){ # last if $data =~ m/◆ アナ\x83\^の情報/; $i++; last if $data[$i] =~ m/◆ 出来事/; last if $data[$i] =~ m/◆ 行動設定/; next unless $data[$i] =~ m/ [\t ](.*)/; next if $1 eq ''; $who = $1; $id++; $who[$id] = $1; $id{$who} = $id; $tmp1 .= "占CO\x81\@$1さん○<br />\n"; $tmp2 .= "_/$1\x81\@<br />\n"; unless($id % 5){ $tmp1 .= "<br />\n"; $tmp2 .= "<br />\n"; } $i++; $data[$i] =~ m/\x81\x69(.*)\x81\x6a/; if($1 eq '生存中'){ # print STDERR "【$1/$data[$i]】\n"; $say{$who} = 0; $time{$who} = 0; }else{ # print STDERR "■$1/$data[$i]■\n"; } } &print_menbers(); $who='?'; while($i++ <= $#data){ if($data[$i] =~ /^◆(.*?)さん\t「(.*)」$/){ $who = $1; $time{$who}++; $say{$who} += length $2; $text{$who} .= "$2\n"; }elsif($data[$i] =~ /^◆(.*?)さん\t「(.*)/){ $who = $1; $time{$who}++; $say{$who} += length $2; $text{$who} .= "$2\n"; }elsif($data[$i] =~ m#^\s*\d+日目の朝となりました。\(\d+/\d+/\d+ \d+:\d+:\d+\)#){ $say{$who} -= 3; last; }elsif($data[$i] eq ' 戻る '){ $say{$who} -= 3; last; }else{ if($data[$i+1] =~ /^◆(.*?)さん\t「/ and $data[$i] =~ /(.*)」/){ $say{$who} += length $1; $text{$who} .= "$1\n"; }else{ $say{$who} += length $data[$i]; $text{$who} .= "$data[$i]"; } } } delete $say{'?'},$time{'?'},$text{'?'}; foreach$id(1..$#who){ $who = $who[$id]; print STDOUT "◆$say{$who}/$time{$who}=".int($time{$who} and $say{$who}/$time{$who}).".$who<br />"; $kansute .= " $who" if $time{$who} == 0; $ohasute .= " $who" if $time{$who} == 1; $other .= " $who" if $time{$who} > 2; print "<br />\n" unless $id % 5; } print STDOUT "</td></tr></table>\n"; #print STDOUT "\n寡黙順 ", (join ' ', reverse @who), "◆完ステ◆$kansute", "◆おはステ◆$ohasute", "◆他◆\n"; #print STDOUT "\n寡黙順 ", "◆完ステ◆$kansute ◆おはステ◆$ohasute ◆他◆\n\n"; foreach$id(1..$#who){ print "<h5>$id $who[$id]</h5>\n<pre>$text{$who[$id]}</pre>"; } sub print_menbers{ print STDOUT "$tmp1</td><td>"; print STDOUT "$tmp2</td><td>"; } print STDOUT "</ul></html>\n"; __DATA__ 投票分析 †$wolves = 3; @data = <DATA>; chomp @data; $i = $#data; open TEST, ">./test.txt"; while($i-- > 0){ last if $data[$i] eq ''; } while(1){ $i++; # last until($data =~ /(.*?)さん \d 票 投票先 → (.*)さん/; # last until($data[$i] =~ /^(.*?)さん \d+ \x95\[ 投\x95\[先 → (.*)さん/); last until($data[$i] =~ /^(.*?)さん\t\d+ \x95\[\t投\x95\[先 → (.*)さん/); ($a, $b) = ($1, $2); $gyaku{$b} .= ($hyou{$a} eq '' ? "$a ": "■$a ") if $hyou{$a} ne $b; $hyou{$a} = $b; $time{$b}++; $flag{$a}->{$b} = $flag{$b}->{$a} = 1; # push @all, $a; } @all = sort keys %hyou; @who = sort {($time{$b} <=> $time{$a}) or ($hyou{$a} cmp $hyou{$b})} keys %gyaku; map{print STDOUT "▼$_ ← $gyaku{$_}<br />\n"}@who; sub think{ my $number; my $commer; my $wolf; my @all; my $select; my @select; ($number, $commer, $wolf, @all) = @_; while(-1 < $#all){ my $select = shift @all; unless($flag{$commer}->{$select}){ push @select, $select; } } # print STDOUT "\ns/@select"; while(-1 < $#select){ my $select = (shift @select); unless($flag{$commer}->{$select}){ if(0 < $number){ &think($number - 1, $select, [@$wolf, $select], @select); }else{ # print TEST "\n@{$wolf} $select"; map{$wolf{$_}++;}(@$wolf, $select); } } } } &think($wolves - 1, '', '', @all); print STDOUT "\n"; map{print STDOUT "◆$wolf{$_} $_"} sort {$wolf{$b} <=> $wolf{$a}}@all; print STDOUT "\n";exit; __DATA__ 投票分析の解説 †$wolvesに人狼の残頭数、__DATA__以降にグレラン投票の結果をぶち込むと、「人狼が身内票を入れていないという仮定で」人狼の組み合わせが何通り当てはまるか計算します。 例えば/27 トマト/15 メロン/と出力されたとしましょう。すると、トマトが人狼である組み合わせは27通り、メロンが人狼である組み合わせは15通りと推測されます。ですから、メロンに投票するよりはトマトに投票したほうがいいのでは…ということになります。 自分に無残な姿や共有者など、確定白の人はグレランから除いていった方が、精度は高くなっていきます。また対抗同士が人狼の組み合わせも殆ど見られませんから、仮想対抗票を入れるのもいいです。 弱点は3つ、身内票、人狼の残頭数の見誤り、本当に白い村人を人狼認定しやすいこと。まあどんな道具も振り回されすぎてはいけないということですね。 |
最終更新日: 2007-11-08 (木) 14:49:29 (6011d)
|