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 JAVA (judge verdict: Accepted)

import java.util.*;

public class Main {
	Scanner in = new Scanner(System.in);
	public static void main(String[] args) {
		new Main();
	}
	public Main() {
		new B().doIt();
	}
	
	class B{
		
		String input;
		char type;
		
		void solve(){
			Data d = new Data(input);
//			System.out.println(Arrays.toString(d.input));
			if(type=='U')System.out.println(d.toU());
			else if(type=='L')System.out.println(d.toL());
			else if(type=='D')System.out.println(d.toD());
		}
		
		void doIt(){
			while(in.hasNext()){
				input = in.next();
				type = in.next().charAt(0);
				if(type=='X')break;
				solve();
			}
		}
		class Data{
			String[] input;
			int n;
			public Data(String a) {
				String[] test = a.split("_");
				if(test.length==1){
					String b = a.charAt(0)+"";
					for(int i=1;i<a.length();i++){
						if(Character.isUpperCase(a.charAt(i)))b+=" ";
						b+=a.charAt(i);
					}
					input = b.split(" ");
					n = input.length;
				}else{
					input = a.split("_");
					n = test.length;
				}
			}
			
			String toU(){
//				System.out.println(Arrays.toString(input));
//				System.out.println(n);
				String result = "";
				for(int i=0;i<n;i++){
					result += Character.toUpperCase(input[i].charAt(0));
					for(int s=1;s<input[i].length();s++)result += input[i].charAt(s);
				}
				return result;
			}
			
			String toL(){
				String result = toU();
				String result2 = Character.toLowerCase(result.charAt(0))+"";
				for(int i=1;i<result.length();i++)result2+=result.charAt(i);
				return result2;
			}
			
			String toD(){
				String result = Character.toLowerCase(input[0].charAt(0))+input[0].substring(1,input[0].length());
				for(int i=1;i<n;i++){
//					System.out.println(input[i]);
					result += "_";
					for(int s=0;s<input[i].length();s++){
//						System.out.println(result);
						result += Character.toLowerCase(input[i].charAt(s));
					}
				}
				return result;
			}
			
		}
	}
	

//	class B{
//		int n,a,b;
//
//		void solve(){
//			
//		}
//
//		void doIt(){
//			while(in.hasNext()){
//				n = in.nextInt();
//				a = in.nextInt();
//				b = in.nextInt();
//				if(n+a+b==0)break;
//				solve();
//			}
//		}
//	}
//
}