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;

public class hello
{
    public static void Main()
    {
        while (true)
        {
            string[] s = Console.ReadLine().Trim().Split(' ');
            if (s[1] == "X") break;
            if (s[0].Contains("_")) getAns1(s[0], s[1]);
            else if (s[1] == "U" | s[1] == "L") getAns2(s[0], s[1]);
            else getAns3(s[0]);
        }
    }
    public static void getAns3(string s)
    {
        var sL = s.Length;
        if (sL == 1) Console.WriteLine(s.ToLower());
        else
        {
            Console.Write(s[0].ToString().ToLower());
            for (int i = 1; i < sL; i++)
                if (Char.IsUpper(s[i]))
                {
                    Console.Write("_");
                    Console.Write(s[i].ToString().ToLower());
                }
                else Console.Write(s[i]);
            Console.WriteLine();
        }
    }
    public static void getAns2(string s, string c)
    {
        if (c == "U") print(s);
        else
        {
            Console.Write(s.Substring(0, 1).ToLower());
            Console.Write(s.Substring(1));
        }
        Console.WriteLine();
    }
    public static void getAns1(string s, string c)
    {
        if (c == "D") { Console.WriteLine(s); return; }
        string[] s2 = s.Split('_');
        if (c == "U") print(s2[0]);
        else Console.Write(s2[0]);
        for (int i = 1; i < s2.Length; i++)
            print(s2[i]);
        Console.WriteLine();
    }
    public static void print(string a)
    {
        if (a.Length == 1) Console.Write(a.ToUpper());
        else
        {
            Console.Write(a.Substring(0, 1).ToUpper());
            Console.Write(a.Substring(1));
        }
    }
}