機能追加。
#!/bin/perl -w
# 残り試合の勝率計算、現状の勝率・ゲーム差計算
use Getopt::Long;
use Data::Dumper;
$blanks = 0;
GetOptions('i' => \$interleague, # 交流戦
'd' => \$no_draw, # 引き分けを含めない
's' => \$not_sort, # 勝率で並べ替えない
'f' => \$future, # 残試合の勝率の表示
'c' => \$color, # 色付け
'g' => \$gb, # ゲーム差表示 games behind
'a' => \$all, # 全試合数表示
'o' => \$order, # 勝率順にゲーム差表示
'ol' => \$lines, # ゲーム差を広げて表示
'--b=i' => \$blanks # 最後に表示する空行数
);
$order = 1 if ($lines);
# 勝率の1の位の0を削る
sub dotave
{
$avestr = sprintf("%.4f", $_[0]);
$avestr =~ s/0\././;
$avestr =~ s/1\.0000/1.000/; # 100%の場合は桁を変更
return $avestr;
}
# 空行を表示
sub blanks
{
for ($i = 0; $i < $blanks; $i++) {
print "\n";
}
exit 0;
}
# 色の設定
if ($color) {
%bg = (
"H" => "3",
"B" => "4",
"F" => "6",
"E" => "1",
"L" => "4",
"M" => "7",
"G" => "7",
"T" => "3",
"C" => "1",
"S" => "7",
"D" => "6",
"BS" => "4",
);
%fg = (
"H" => "3;1",
"B" => "7;1",
"F" => "0",
"E" => "7",
"L" => "7",
"M" => "0",
"G" => "0",
"T" => "0;1",
"C" => "7;1",
"S" => "0;1",
"D" => "6;1",
"BS" => "6;1",
);
}
open(DATAFILE, "< $ARGV[0]") or die("指定ファイルエラー\n");
if ($interleague) {
$games = 24; # 交流戦試合数
}
else {
$games = 144; # リーグ戦試合数
}
while ($line = ) { # 読み込み
chomp($line); # 行末の改行を削る
next if ($line =~ /^\s*$/); # 空行は無視
# 要素で分割
($team, $win, $loss, $draw) = split(/\t/, $line);
if ($order) { # ゲーム差表用の数値をまとめる
$elems_cur = { # 現時点の値
team => $team, # チーム名
win => $win, # 勝ち
loss => $loss, # 負け
draw => $draw, # 引き分け
ave => $win / ($win + $loss), # 勝率
};
push(@cur, $elems_cur);
}
else { # 以降の勝率計算
$left = $games - $win - $loss - $draw; # 残り試合
for ($w = $left; $w >= 0; $w--) { # 勝ち数
for ($l = 0; $l <= $left - $w; $l++) { # 負け数
$l = $left - $w if ($no_draw); # 引き分け数を加味しない
$d = $left - $w - $l; # 引き分け数
# 計算結果の要素をまとめる
$elems = {
team => $team, # チーム名
win => $w, # 今後の勝ち
loss => $l, # 今後の負け
draw => $d, # 今後の引き分け
win_all => $win + $w, # 通算の勝ち
loss_all => $loss + $l, # 通算の負け
draw_all => $draw + $d, # 通算の引き分け
ave => ($win + $w) / ($win + $w + $loss + $l), # 今後の勝率
};
push(@elem_set, $elems);
}
}
}
}
if ($order) { # 現状の順位表の表示
@cur = sort {$b->{ave} <=> $a->{ave}} @cur; # 勝率で並べ替え
$zero = $cur[0]{win} - $cur[0]{loss}; # 首位チームの貯金
$prev = $zero; # 直近上位チームの貯金
print "チ 勝 負 分 勝率 差 差 貯金 残\n";
foreach $e (@cur) {
$behind = ($prev - @$e{win} + @$e{loss}) / 2; # 直近とのゲーム差
$prev = @$e{win} - @$e{loss};
if ($lines) { # ゲーム差分行を開けて表示
$diff = $behind / 0.5 - 1;
for ($i = 0; $i < $diff; $i++) {
for ($j = 0; $j < 18; $j++) {
print " |";
}
print "\n";
}
}
# 色付き
printf("\e[4%s;3%sm", $bg{@$e{team}}, $fg{@$e{team}}) if ($color);
printf("%-2s %3d %3d %2d", @$e{team}, @$e{win}, @$e{loss}, @$e{draw});
printf(" %s", &dotave(@$e{ave}));
printf(" %4.1f", ($zero - $prev) / 2); # 首位との差
printf(" %4.1f", $behind); # 直近との差
printf(" %3d", $prev); # 貯金
printf(" %3d", $games - @$e{win} - @$e{loss} - @$e{draw}); # 残り試合
print "\e[m" if ($color); # 色消し
print "\n";
}
&blanks; # ゲーム差表を表示したら終了
}
unless ($not_sort) { # 勝率で降順並べ替え
@elem_set = sort {$b->{ave} <=> $a->{ave}} @elem_set;
# 並べ替えた場合はヘッダ表示
print "チ 勝 - 負";
print " 分" unless ($no_draw);
print " 勝 - 負 分" if ($all);
print " 勝率";
print " 残勝率" if ($future);
print " 差" if ($gb);
print "\n";
}
else {
$gb = 0; # 並べ替えをしない時にはゲーム差を非表示
}
# 首位チームの貯金
$zero = $elem_set[0]->{win_all} - $elem_set[0]->{loss_all} if ($gb);
# 結果表示
foreach $e (@elem_set) {
printf("\e[4%s;3%sm", $bg{@$e{team}}, $fg{@$e{team}}) if ($color); # 色付き
printf("%-2s", @$e{team});
if (@$e{win_all} - @$e{win} +
@$e{loss_all} - @$e{loss} +
@$e{draw_all} - @$e{draw} == $games) { # 全試合終了
print "*"; # 戦績が確定したチームには"*"を付ける
}
else {
print " ";
}
printf(" %2d - %2d", @$e{win}, @$e{loss});
printf(" %2d", @$e{draw}) unless ($no_draw); # 引き分けを加味しない
if ($all) { # 全試合の戦績も表示
printf(" %2d - %2d", @$e{win_all}, @$e{loss_all});
unless ($no_draw) {
printf(" %2d", @$e{draw_all}); # 引き分けを加味しない
}
else {
printf(" %2d", @$e{draw_all} - @$e{draw}); # 現状の引き分けを表示
}
}
printf(" %s", &dotave(@$e{ave}));
if ($future) { # 残試合での勝率
if (@$e{win} + @$e{loss} == 0) { # 0除算回避
print " .0000";
}
else {
printf(" %s", &dotave(@$e{win} / (@$e{win} + @$e{loss})));
}
}
printf(" %4.1f", ($zero - @$e{win_all} + @$e{loss_all}) / 2) if ($gb);
print "\e[m" if ($color); # 色消し
print "\n";
}
&blanks; # 空行表示