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: Accepted)

using System;

namespace AOJ0066
{
    class Program
    {
        char[,] table;

        public void Proc()
        {
            while (true)
            {
                string input = Console.ReadLine();
                if (string.IsNullOrEmpty(input)) break;
                this.table = new char[3, 3];
                int result = 0;
                for (int i = 0; i < 9; i++)
                {
                    this.table[i / 3, i % 3] = char.Parse(input.Substring(i, 1));
                }

                result += checkColumn();
                result += checkRow();
                result += checkCross();

                if (result == 1) Console.WriteLine("o");
                if (result == 0) Console.WriteLine("d");
                if (result == -1) Console.WriteLine("x");
            }
        }
        static void Main(string[] args)
        {
            Program prg = new Program();
            prg.Proc();
        }

        public int checkColumn()
        {
            for (int i = 0; i < 3; i++)
            {
                if (this.table[i,0] == this.table[i,1] && this.table[i,0] == this.table[i, 2])
                {
                    switch (this.table[i,0])
                    {
                        case 'o':
                            return 1;
                        case 'x':
                            return -1;
                    }
                }
            }

            return 0;
        }

        public int checkRow()
        {
            for (int i = 0; i < 3; i++)
            {
                if (this.table[0, i] == this.table[1, i] && this.table[0, i] == this.table[2, i])
                {
                    switch (this.table[0, i])
                    {
                        case 'o':
                            return 1;
                        case 'x':
                            return -1;
                    }
                }
            }

            return 0;
        }

        public int checkCross()
        {
            if ((this.table[1, 1] == this.table[0, 0] && this.table[1, 1] == this.table[2, 2]) || (this.table[1, 1] == this.table[2, 0] && this.table[1, 1] == this.table[0, 2]))
            {
                switch (this.table[1, 1])
                {
                    case 'o':
                        return 1;
                    case 'x':
                        return -1;
                }
            }
            return 0;
        }
    }
}