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 JAVA (judge verdict: Accepted)

import java.io.*;

class Researcher {
	int mat[][] = new int[3][3];
	String index = "oxs";

	Researcher(String s) {
		for (int i=0;i<9;i++) {
			mat[i/3][i%3] = index.indexOf(s.charAt(i)); 
		}
	}

	char Research() {
		if (mat[1][1]<=1) {
			if (mat[0][0]==mat[1][1]&&mat[1][1]==mat[2][2]) return index.charAt(mat[0][0]);
			else if (mat[2][0]==mat[1][1]&&mat[1][1]==mat[0][2]) return index.charAt(mat[2][0]);
		}

		for (int i=0;i<3;i++) {
			if (mat[i][0]<=1) {
				if (mat[i][0]==mat[i][1]&&mat[i][1]==mat[i][2]) return index.charAt(mat[i][0]);
			}
			if (mat[0][i]<=1) {
				if (mat[0][i]==mat[1][i]&&mat[1][i]==mat[2][i]) return index.charAt(mat[0][i]);
			}
		}
		return 'd';
	}
}

class Main {
	public static void main(String args[]) {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String buf;

		try {
			while ((buf = br.readLine())!=null) {
				System.out.println(new Researcher(buf).Research());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}