CodeIQ:右位置揃え

私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「右位置揃え」(CodeIQ)を参照してください。

問題の概要

問題を引用します。
【問題】
息抜き時間でできる、簡単なプログラムを書いてみよう!
改行区切りの文字列の各行は、半角数字のみの整数(最大桁数32)になっています。
この各行の先頭に任意の数の半角のアンダーバー(_)を挿入して、右揃えになるように加工して下さい。
ただし、最も桁数が多い数値の先頭には、半角のアンダーバーを挿入しないものとします。

// 入力例
1
23
45678
9
10

// 出力例
____1
___23
45678
____9
___10

私のプログラム

Rubyで解答しています。

#!/usr/bin/ruby

# main
strs = []
szs = []

def printRight(strs, mx)
	for s in strs
		sp = mx - s.size
		puts '_' * sp + s
	end
end

while line = gets
	line.strip!
	next if line.empty?

	strs << line
	szs << line.size
end

printRight(strs, szs.max)

解説

息抜きとある通り、簡単な問題です。

考え方

入力値の中でもっとも長い文字列の長さを求め、それ以外の文字列について最長との差だけ'_'で左側を埋めて印字すれば良いだけです。

main

入力値を取得し配列strsに保持しつつ、各文字列の長さをszsに記録します。
strsとszsの中で最大の値をprintRight()に渡して印字します。

printRight(strs, mx)

strsから入力値を1行ずつ取り出し、その文字列と最長文字列数mxとの差を求めます。そして、その数だけ'_'を入力値の前につけて印字するだけです。

雑感

C言語のprintf()は0ないし空白のパディングは簡単にできるけど、任意の文字でパディングってできるんだっけ?