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;
using System.Linq;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace aizu
{
    class OnlineJudge
    {
        static void Main()
        {
            string input;
            int count = 0;
            Regex[] winPattern = new Regex[]{
                new Regex(@"^(?:...){0,2}([ox])\1{2}"),
                new Regex(@"([ox])(..\1){2}"),
                new Regex(@"(?:([ox]).)(\1.){2}"),
                new Regex(@"(?:([ox])...)(\1...){1}\1"),
            };
            Dictionary<char, Action> action = new Dictionary<char, Action>{
                { 'o' , () => ++count },
                { 'x' , () => --count },
                { 's' , () => { return;} },
            };
            while((input = Console.ReadLine()) != null){
                string winner = "d";
                count = 0;
                foreach(Regex reg in winPattern) {
                    if(reg.IsMatch(input)) {
                        foreach(char c in input) {
                            action[c]();
                        }
                        winner = (count > 0 ? "o" : "x");
                        break;
                    }
                }
                Console.WriteLine(winner);
            }
        }
    }
}