Problem:


Problem P04: CamelCase

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

Upper CamelCase　にする

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

例： GetUserName

Lower CamelCase　にする

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

例： getUserName

アンダースコアで繋ぐ

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

例： get_user_name

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

Input

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

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

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

type命名規則

UUpper CamelCase にする

LLower 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



Sample input:
get_user_name L
getUserName U
GetUserName D
EndOfInput X


Sample output:
getUserName
GetUserName
get_user_name

Submission status: Accepted

Solution code:
#!/usr/bin/env python

from collections import deque
import itertools as it
import sys
import math

sys.setrecursionlimit(10000000)

while True:
    S, tp = raw_input().split()
    if tp == 'X':
        break
    if tp == 'L':
        if '_' in S:
            ls = S.split('_')
            S = ''
            for s in ls:
                S += chr(ord('A') + ord(s[0]) - ord('a')) + s[1:]
        if 0 <= ord(S[0]) - ord('A') < 26:
            S = chr(ord('a') + ord(S[0]) - ord('A')) + S[1:]
    if tp == 'U':
        if '_' in S:
            ls = S.split('_')
            S = ''
            for s in ls:
                S += chr(ord('A') + ord(s[0]) - ord('a')) + s[1:]
        if 0 <= ord(S[0]) - ord('a') < 26:
            S = chr(ord('A') + ord(S[0]) - ord('a')) + S[1:]
    if tp == 'D':
        for i in range(26):
            S = S.replace(chr(ord('A') + i), '_' + chr(ord('a') + i))
        if S[0] == '_':
            S = S[1:]
    print S

Submission status: Runtime Error

Solution code:
while True:
    name,typ=raw_input().split()
    if name=="EndOfInput" and typ=="X":break
    L=[]
    if "_" in name:
        L=name.split("_")
    elif  name[0].islower():
        temp=""
        for ch in name:
            if ch.islower():
                temp+=ch
            else:
                L.append(temp)
                temp=""
                temp+=ch
        L.append(temp)
    else:
        temp=name[0]
        for ch in name[1:]:
            if ch.islower():
                temp+=ch
            else:
                L.append(temp)
                temp=""
                temp+=ch
        L.append(temp)

    if typ=="D":
        print "_".join(map(lambda s:s.lower(),L))
    elif typ=="U":
        print "".join(map(lambda s:s.capitalize(),L))
    else:
        print L[1]+"".join(map(lambda s:s.capitalize(),L[1:]))

Submission status: Runtime Error

Solution code:
upp = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
low = "abcdefghijklmnopqrstuvwxyz"

while 1:
	a,type = raw_input().split()
	if type == "X": break
	ans = ""
	if type == "U":
		if "_" in a:
			words = a.split("_")
			for word in words:
				ans += upp[low.index(word[0])] + word[1:]
		else:
			ans = upp[low.index(a[0])] + a[1:]
	elif type == "L":
		if "_" in a:
			words = a.split("_")
			ans += words[0]
			for word in words[1:]:
				ans += upp[low.index(word[0])] + word[1:]
		else:
			ans = low[upp.index(a[0])] + a[1:]
	else:
		words = []
		sp = 0
		for i in range(1,len(a)):
			if a[i] in upp:
				words.append(a[sp:i].lower())
				sp = i
		words.append(a[sp:].lower())
		ans = "_".join(words)
	print ans