Problem:
三目並べ

三目並べは，３ × ３のマス目の中に交互に ○ と × を入れていき、縦・横・斜めの何れかに一列 ○ か × が並んだときに、勝ちとなるゲームです（図1〜図3 を参照）

図１：○の勝ち

図２：× の勝ち

図３：引き分け

三目並べは、○と×が交互にマス目を埋めていき、どちらかが一列揃ったときにゲーム終了となります。そのため、図 4 のように、○と×が両方とも一列そろっている場合はありえない局面です。ありえない局面が入力されることはありません。

図４：ありえない局面

三目並べの盤面を読み込んで、勝敗の結果を出力するプログラムを作成して下さい。

Input

入力は複数のデータセットからなります。各データセットとして、盤面を表す１つの文字列が１行に与えられます。
盤面の文字列は、○、×、空白をそれぞれ半角英小文字の o、x、s であらわし、下図のマス目の順に並んでいます。

データセットの数は 50 を超えません。

Output

データセットごとに、○が勝ちなら半角英小文字の o を、×が勝ちなら半角英小文字の x を、引き分けならば半角英小文字の d を１行に出力してください。

Sample Input

ooosxssxs
xoosxsosx
ooxxxooxo

Output for the Sample Input

o
x
d

Solution in C# (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace mondai0066
{
	class Program
	{
		static void Main(string[] args)
		{
			var	s	= "";
			while( (s = Console.ReadLine()) != null ) {
				var	masu	= new char[ 3, 3 ];
				for( int i = 0; i < 9; i++ ) {
					masu[ i / 3, i % 3 ]	= s[ i ];
				}
				
				/*Console.WriteLine( "{0}{1}{2}", masu[ 0, 0 ], masu[ 0, 1 ], masu[ 0, 2 ] );
				Console.WriteLine( "{0}{1}{2}", masu[ 1, 0 ], masu[ 1, 1 ], masu[ 1, 2 ] );
				Console.WriteLine( "{0}{1}{2}", masu[ 2, 0 ], masu[ 2, 1 ], masu[ 2, 2 ] );*/

				Console.WriteLine( judge( masu ) );
			}
		}


		static char judge( char[,] masu )
		{
			// 横
			for( int i = 0; i < 3; i++ ) {
				var	m	= masu[ i, 0 ];
				if( (m == masu[ i, 1 ]) && (m == masu[ i, 2 ]) ) {
					return( m );
				}
			}
			// 縦
			for( int i = 0; i < 3; i++ ) {
				var	m	= masu[ 0, i ];
				if( (m == masu[ 1, i ]) && (m == masu[ 2, i ]) ) {
					return( m );
				}
			}
			// 斜め
			{
				var	m	= masu[ 0, 0 ];
				if( (m == masu[ 1, 1 ]) && (m == masu[ 2, 2 ]) ) {
					return( m );
				}
			}
			{
				var	m	= masu[ 0, 2 ];
				if( (m == masu[ 1, 1 ]) && (m == masu[ 2, 0 ]) ) {
					return( m );
				}
			}			
			
			return( 'd' );
		}
	}
}