#!/usr/bin/ruby # =begin = magic.rb 0.02 Copyright (c) 2003 Norimasa Matsumoto written by Norimasa Matsumoto This program is free software. You can re-distribute and/or modify this program under the same terms as Ruby itself, Ruby Distribute License or GNU General Public License. =end # チーム名定義、1文字である必要は無い # G: 巨人, S: ヤクルト, D: 中日, T: 阪神, C: 広島, B: 横浜 $team = [ "G", "S", "D", "T", "C", "B" ] # 勝ち、負け、分けを示す記号の定義 # o: 勝ち, x: 負け, =: 引き分け $wl = [ "o", "x", "=" ] # magic の計算対象チームの指定 # 本スクリプトでは、ある特定の球団についてのみマジックを計算する。 # 2003 年セリーグについては、$target="T" 以外では、意味無いよ。 $target = "T" # 全試合数 $ngame = 140 # 一チームあたりの試合数 $nteam = 140/5 # 各チームの勝ち、負け、分けのリスト # [ "Go", "Gx", "G=", ... "Bx", "B="] のような配列を作成する $idx = Array.new() $team.each{|t| $wl.each{|w| $idx << t+w } } # 対戦組合せのリスト # [ "GS", "GD", "GT", ... "BC" ] のようなリストを作成する。 # "TG" は阪神ホームでの阪神-巨人戦 # 本スクリプト中では "TG" と "GT" の違いに特に意味は無い $idxc = Array.new() $team.each{|h| $team.each{|a| $idxc << h+a if h != a } } # デバッグ用 # p $idx # p $idxc # 各チームの勝ち負け分け数のカウント用の変数の定義と初期化 # $ct["To"] がタイガースの勝ち数のカウント、 # $ct["Gx"] が巨人の負け数のカウント用 $ct = Hash.new $idx.each{ |k| $ct[k] = 0 } # 対戦数のカウント用変数の定義と初期化 # $ctc["TG"] + $ctc["GT"] が、巨人阪神戦の消化試合数。マジック計算に使用。 $ctc = Hash.new $idxc.each{ |k| $ctc[k] = 0 } line_no=0 # ファイルの行番号カウント用 $stdin.each_line{ |line| line_no += 1 var = line.split( /[\s\t]+/ ) # 1行をスーペース、タブで、切り分け # 配列 var に next if var.empty? # 空行ならスキップ date = var.delete_at(0) # 最初の項目は日付を示す var.each{|v| # 各 var の項目に付いて ck = v.delete("-ox=") # "To-Gx" なら ck = "TG" vs = v.split( /\-/ ) # vs[0] = "To", vs[1] = "Gx" に切分け if (! $ctc[ck]) || (! $ct[vs[0]]) || (! $ct[vs[1]]) then # 定義されていないチーム名記号や # 勝ち負け記号が使われていた $stderr.printf("format error in line %d\n%s",\ line_no, line ) exit(1) end $ctc[ck] += 1 # 対戦数のカウント $ct[vs[0]] += 1 # 勝ち負けのカウント $ct[vs[1]] += 1 # 同上 } # 日付を表示、日付は正しいフォーマットかどうかチェックしていない # のでデータファイル作成時に要注意。 print date # 各チームの、勝ち負け分け数を表示、順番は $idx の中身を見よ。 # 配列 $team, $wl の定義に依存する。 $idx.each{ |k| printf( " %3.1d", $ct[k] ) } # マジック計算対象チーム($target で指定) 以外で、自力で、$target # のチームに勝つ事が出来るチームがあるかどうかチェックする magicflag=true $team.each{ |t| next if t == $target # マジック計算対象チーム($target)は無視 wm = $ngame -$ct[$target+"x"] -$ct[$target+"="] \ -($nteam -$ctc[$target+t] -$ctc[t+$target]) wt = $ngame -$ct[t+"x"] -$ct[t+"="] # 変数 t で指定されたチームが残り試合全勝して、 # $target チームが t 以外のチームに全勝したとして # wm .. $target のチームの最終勝ち数 # wt .. 変数 t のチームの最終勝ち数 if (wt > wm) || \ (wt == wm && $ct[t+"="] > $ct[$target+"="]) then # この t チームは、自力で $target チームに # 勝つ事が可能 magicflag=nil # 1 チームでも $target に勝つチームが見付かれば # 他のチームと比較する必要は無いのでループを抜ける break end } if magicflag then # 各チームに勝つために必要な勝ち数のうち最大の物を求める。 magicno=0 $team.each{ |t| next if t == $target # t チームが残り全勝した時の勝ち数と等しく # なるために必要な勝ち数の計算 tmn = $ngame -$ct[t+"x"] -$ct[t+"="] -$ct[$target+"o"] # t チームの引き分け数が多いと勝率で負けるので、 # その分補正 tmn += 1 if $ct[t+"="] >= $ct[$target+"="] # ここで、 tmn が t で示すチームに対してのマジック magicno = tmn if tmn > magicno } print " ", magicno end print "\n" }