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.util.*;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		ArrayDeque<String> ans = new ArrayDeque<String>();

		while(sc.hasNext()){
			String s = sc.next();
			int[][] map = new int[3][3];
			
			int n = 0;
			for(int i=0;i<3;i++){
				for(int j=0;j<3;j++){
					String t = s.substring(n,n+1);
					if(t.compareTo("o")==0){
						map[i][j]=1;
					}else if(t.compareTo("x")==0){
						map[i][j]=2;
					}
					n++;
				}	
			}
			n=0;
			int count=0;
			for(int i=1;i<=2;i++){
				for(int j=0;j<3;j++){
					count=0;
					for(int k=0;k<3;k++){
						if(map[j][k]==i)count++;
					}
					if(count==3){
						n=i;
						j=3;
					}
				}
				for(int j=0;j<3;j++){
					count=0;
					for(int k=0;k<3;k++){
						if(map[k][j]==i)count++;
					}
					if(count==3){
						n=i;
						j=3;
					}
				}
				if(map[1][1]==i){
					if((map[0][0]==i && map[2][2]==i) || (map[0][2]==i && map[2][0]==i))n=i;
				}
				if(n!=0)i=3;
			}

			if(n==0){
				ans.push("d");
			}else if(n==1){
				ans.push("o");
			}else{
				ans.push("x");
			}
		}
		int num = ans.size();
		for(int i=0;i<num;i++){
			System.out.println(ans.pollLast());
		}
	}
}