CodeIQ:汚いコードを綺麗にしてして

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

解説

「進捗マーク」シリーズは終わりました。

main

入力値の1行目をモードとしてmodeに、行目以降を変換対象としてinputsに取得します。
変換対象は'='で分割して配列にしておきます。
また、各行の変数名の長さの最大値をmxに取得しておきます。
inputs, mode, mxをsolve()に渡して結果を印字します。

solve(inputs, mode, mx)

引数inputsは[[変数名, 値], ...]の配列です。
引数modeはモード、mxは最長の変数名の長さです。

inputsの全要素をループします。
最長の変数名と現在の変数名の差からスペースの文字列を作ります。
modeが'l'なら変数名の左、そうでなければ右にスペースを足します。
それに値の文字列を足して印字します。

雑感

進捗マークシリーズは終わった様です。
また、再開したりして。