CodeIQ:カードを上手く並べよう

私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「カードを上手く並べよう」(CodeIQ)を参照してください。

問題の概要

問題を引用します。
問題
あなたは、11から99までの、89枚のカードを持っています。
問題では、横幅と高さの整数が与えられます。
この横幅と高さで作られるマス目に、カードを左上から順に並べていきます。

その際、縦に順番に並べ、高さいっぱいになると、次の列にカードを並べます。
カードがなくなった場合は「--」を代わりに置きます。

標準入力から得られる数字は「,」で区切られた2つの数値です。1つ目は横幅、2つ目は高さになります。
標準出力に出力する際は、各行の「数値」や「--」は、「,」で区切ります。列は改行で区切ります。

// 入力例
11,9
// 出力例
11,20,29,38,47,56,65,74,83,92,--
12,21,30,39,48,57,66,75,84,93,--
13,22,31,40,49,58,67,76,85,94,--
14,23,32,41,50,59,68,77,86,95,--
15,24,33,42,51,60,69,78,87,96,--
16,25,34,43,52,61,70,79,88,97,--
17,26,35,44,53,62,71,80,89,98,--
18,27,36,45,54,63,72,81,90,99,--
19,28,37,46,55,64,73,82,91,--,--

私のプログラム

Rubyで解答しています。

#!/usr/bin/ruby

def solve(row, col)
	for r in 0...row
		st = 11 + r

		line = []
		for c in 0...col
			v = st + row * c
			line << ((v<=99) ? v.to_s : "--")
		end
		puts line.join(',')
	end
end

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

	col, row = line.split(',').map{|a| a.to_i}
	solve(row, col)
end

解説

数字を左から縦書きしてください、ということです。

考え方

数字を横に見ると左端の数から順に行数ずつ増えます。
左端の数字は1行ごとに1ずつ増えます。

main

入力値をsolve()にしします。

solve(row, col)

二重ループで行と列を処理します。
行の一番左の数は11〜11+rowまで(st)です。
各行の数字は左からst+row*c(cは0〜col-1まで)です。
99を超えたら"--"をです。
これらを配列にとって、1行ごとにjoin()して印字します。
一旦配列にとっているのは最後のコンマが面倒臭いからです。

雑感

計算だけでやろうと思ったのですが、行末のコンマが面倒で配列を使ってしまいました。