私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「PPSP」(CodeIQ)を参照してください。
PPSP問題
仕様
標準入力
【例】
- 標準入力には4つのプログラム言語名がカンマ区切りで与えられます
- 各言語名は Snake case で入力されます
- 各言語名は [a-z] とアンダースコア( _ )の組み合わせからなります
ruby,java_script,python,c
標準出力
【例(標準入力のケースに対応する出力)】
- 1行目には各言語名の先頭の文字のみを結合し、大文字化した文字列を出力します
- 2行目には各言語名を Pascal case に変換し、結合した文字列を出力します
RJPC
RubyJavaScriptPythonC
Snake Caseとは
複合語をアンダースコアで結合し、全て小文字で書き表すこと。
地をはう蛇のように見えることからスネークケースと呼ばれる。
例えば SnakeCase を Snake case にするとsnake_caseになる。
Pascal case とは
複合語の各先頭を大文字にして結合し、先頭以外を小文字にして書き表すこと。
例えば pascal_case を Pascal case にするとPascalCaseになる。
その他の仕様
・標準入力の末尾には改行があります
・標準出力の末尾に改行をつけてください
・標準入力の仕様で説明した内容以外の入力は行われません(不正入力に対するチェックは不要)
Samples
Sample1
標準入力
haskell,tcl,type_script,power_shell
標準出力
HTTP
HaskellTclTypeScriptPowerShell
Sample2
標準入力
stream,intercal,elixir,r
標準出力
SIER
StreamIntercalElixirR
Sample3
標準入力
common_lisp,delphi,icon,qt_script
標準出力
CDIQ
CommonLispDelphiIconQtScript
Rubyで解答しています。
#!/usr/bin/ruby def toPascalCase(line) ret1 = "" ret2 = "" for i in 0...line.size if i==0 then ret1 += line[i].upcase ret2 += line[i].upcase elsif i > 0 then if line[i-1] == "," then ret1 += line[i].upcase ret2 += line[i].upcase elsif line[i-1] == "_" then ret2 += line[i].upcase elsif (line[i] == ",") || (line[i] == "_") then next else ret2 += line[i] end end end return ret1, ret2 end # main while line = gets line.strip! if line.empty? then next end ret1,ret2 = toPascalCase(line) puts ret1 puts ret2 end
問題は簡単です。
でも、あんまりうまい方法を思いつきませんでした。
toPascalCase()に渡します。
結果が返ってくるので印字します。
引数は入力値です。
ret1はイニシャル、ret2はPascal Caseの文字列です。
入力値を1文字ずつ取り出します。
1文字目は問答無用で大文字にし、ret1とret2に追加します。
2文字目以降は","か"_"なら無視します。それ以外の文字の場合、1文字前が","なら大文字にし、ret1とret2に追加します。1文字前が"_"なら大文字にしてret2だけに追加します。それ以外ならそのままret2に追加します。
ret1とret2を返します。
もっと短く、シンプルに書く方法はあったのかなぁ。if文が不細工です。