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 {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		while(true){
			String s = sc.next();
			String t = sc.next();
			if(t.charAt(0)=='X') break;
			
			char[] a = s.toCharArray();
			char[] b = t.toCharArray();
			
			if(s.contains("_")==true){
				if(b[0]=='D') System.out.print(s);
				else{
					if(b[0]=='U' && (int)a[0]>96) a[0]-=32;
					else if(b[0]=='L' && (int)a[0]<96) a[0]+=32;
					for(int i=0;i<a.length;i++){
						if(a[i]=='_') a[i+1]-=32;
						else System.out.print(a[i]);
					}
				}
			}else{
				if(b[0]=='D'){
					if((int)a[0]<96) a[0]+=32;
					for(int i=0;i<a.length;i++){
						if((int)a[i]<96){
							System.out.print('_');
							a[i]+=32;
						}
						System.out.print(a[i]);
					}
				}else{
					if(b[0]=='U' && (int)a[0]>96) a[0]-=32;
					else if(b[0]=='L' && (int)a[0]<96) a[0]+=32;
					for(int i=0;i<a.length;i++) System.out.print(a[i]);
				}
			}
			System.out.println();	
		}	
	}	
}