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で解答しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/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文が不細工です。