私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「汚いコードを綺麗にしてして」(CodeIQ)を参照してください。
変数名="文字列"
のように変数名の変数にイコール( = )で文字列を代入するコードが3行入力されます。
この3行のコードの変数名とイコール( = )の部分を左寄せモード、右寄せモードそれぞれのルールに従い揃えます。
左寄せモードでは=の位置を左端に揃えます。
右寄せモードでは変数名を右端で揃えます。
揃える際は半角ドットを利用して揃えてください。
※詳しくはサンプルケースをご確認ください。
標準入力
・1行目は左右寄せモード。l は左寄せモード、r は右寄せモードです
・2行目-4行目は整形対象のコードです。以下のフォーマットになっています
変数名="文字列"
変数名="文字列"
変数名="文字列"
例:
l
ab="a"
abc="bb"
abcd="ccc"
標準出力
・仕様に従って変換したコード3行を出力します
例(入力の例に対する出力の例)
ab..="a"
abc.="bb"
abcd="ccc"
その他の仕様
・標準入力の末尾には改行があります
・標準出力の末尾に改行をつけてください
・標準入力の仕様で説明した内容以外の入力は行われません(不正入力に対するチェックは不要)
Samples
Sample1
Input
l
ab="a"
abc="bb"
abcd="ccc"
ab..="a"
abc.="bb"
abcd="ccc"
Sample2
Input
r
ab="a"
abc="bb"
abcd="ccc"
..ab="a"
.abc="bb"
abcd="ccc"
Rubyで解答しています。
#!/usr/bin/ruby def solve(inputs, mode, mx) for l in inputs sp = "." * (mx - l[0].size) if mode == "l" then var = l[0] + sp else var = sp + l[0] end puts var + "=" + l[1] end end # main inputs = [] l = 0 mx = 0 while line = gets line.strip! if l == 0 then mode = line else inputs << line.split("=").map{|a| a.strip} mx = inputs[l-1][0].size if mx < inputs[l-1][0].size end l += 1 end solve(inputs, mode, mx)
「進捗マーク」シリーズは終わりました。
入力値の1行目をモードとしてmodeに、行目以降を変換対象としてinputsに取得します。
変換対象は'='で分割して配列にしておきます。
また、各行の変数名の長さの最大値をmxに取得しておきます。
inputs, mode, mxをsolve()に渡して結果を印字します。
引数inputsは[[変数名, 値], ...]の配列です。
引数modeはモード、mxは最長の変数名の長さです。
inputsの全要素をループします。
最長の変数名と現在の変数名の差からスペースの文字列を作ります。
modeが'l'なら変数名の左、そうでなければ右にスペースを足します。
それに値の文字列を足して印字します。
進捗マークシリーズは終わった様です。
また、再開したりして。