Problem:
Problem P04: CamelCase

プログラミングにおける識別子（変数や関数）の命名では、
単語を連結した複合語が使われる。
しかし、そのまま連結すると単語の区切りがわからなくなるため、
一般的に以下の命名規則の中から統一するものを選び適用する：

Upper CamelCase　にする

単語を直接連結し複合語とし、各単語の先頭文字のみを大文字にする。

例： GetUserName

Lower CamelCase　にする

単語を直接連結し複合語とし、各単語の先頭文字のみを大文字にする。ただし、複合語の先頭文字は小文字にする。

例： getUserName

アンダースコアで繋ぐ

単語をアンダースコアで連結し複合語とする。単語の文字はすべて小文字にする。

例： get_user_name

与えられた識別子を、指定された命名規則を適用して出力するプログラムを作成せよ。
与えられる識別子は、上記の命名規則のいづれかが既に適用されているものとする。

Input

入力として複数のデータセットが与えられる。各データセットは以下の形式で与えられる：

name type （識別子、命名規則：　空白区切りの文字列と文字）

typeは命名規則を示す文字であり、以下の表の通りとする：

type

命名規則

U

Upper CamelCase にする

L

Lower CamelCase にする

D

アンダースコアで繋ぐ

与えられる識別子の文字数は 1 以上 100 以下である。

type が 'X' のとき入力の終わりとする。この入力に対する出力を行ってはならない。

Output

各データセットについて、命名規則を適用した識別子を1行に出力せよ。

Sample Input

get_user_name L
getUserName U
GetUserName D
EndOfInput X

Output for the Sample Input

getUserName
GetUserName
get_user_name

Solution in C# (judge verdict: Accepted)

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

namespace AOJ
{
	class Program
	{
		static void Main(string[] args)
		{
			string[] nametype;
			while ((nametype = Console.ReadLine().Split(' '))[1] != "X")
			{
				var w = SplitWord(nametype[0]);

				if (nametype[1] == "U")
				{
					var s = string.Join("", w.Select(ss => char.ToUpper(ss[0]) + ss.Substring(1)).ToArray());
					Console.WriteLine(s);
				}
				else if (nametype[1] == "L")
				{
					var s = string.Join("", w.Select(ss => char.ToUpper(ss[0]) + ss.Substring(1)).ToArray());
					s = char.ToLower(s[0]) + s.Substring(1);
					Console.WriteLine(s);
				}
				else if (nametype[1] == "D")
				{
					var s = string.Join("_", w.Select(ss => ss.ToLower()).ToArray());
					Console.WriteLine(s);
				}
			}
		}

		static string[] SplitWord(string s)
		{
			string[] r;

			if (s.Contains('_'))
			{
				r = s.Split('_');
			}
			else if (char.IsUpper(s[0]))
			{
				var list = new List<string>();
				int index = -1;
				for (int i = 0; i < s.Length; i++)
				{
					if (char.IsUpper(s[i]))
					{
						list.Add(s[i].ToString());
						index++;
					}
					else
					{
						list[index] += s[i];
					}
				}
				r = list.ToArray();
			}
			else
			{
				var list = new List<string>();
				list.Add("");
				int index = 0;
				for (int i = 0; i < s.Length; i++)
				{
					if (char.IsUpper(s[i]))
					{
						list.Add(s[i].ToString());
						index++;
					}
					else
					{
						list[index] += s[i];
					}
				}
				r = list.ToArray();
			}

			return r;
		}
	}
}