#!/usr/bin/ruby
#
=begin

= magic.rb 0.02

Copyright (c) 2003 Norimasa Matsumoto

written by Norimasa Matsumoto <matsu@netfort.gr.jp>

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"
}
