CodeIQ:PPSP

私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「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

解説

問題は簡単です。
でも、あんまりうまい方法を思いつきませんでした。

main

toPascalCase()に渡します。
結果が返ってくるので印字します。

toPascalCase(line)

引数は入力値です。
ret1はイニシャル、ret2はPascal Caseの文字列です。

入力値を1文字ずつ取り出します。
1文字目は問答無用で大文字にし、ret1とret2に追加します。
2文字目以降は","か"_"なら無視します。それ以外の文字の場合、1文字前が","なら大文字にし、ret1とret2に追加します。1文字前が"_"なら大文字にしてret2だけに追加します。それ以外ならそのままret2に追加します。
ret1とret2を返します。

雑感

もっと短く、シンプルに書く方法はあったのかなぁ。if文が不細工です。