私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「カードを上手く並べよう」(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ずつ増えます。
入力値をsolve()にしします。
二重ループで行と列を処理します。
行の一番左の数は11〜11+rowまで(st)です。
各行の数字は左からst+row*c(cは0〜col-1まで)です。
99を超えたら"--"をです。
これらを配列にとって、1行ごとにjoin()して印字します。
一旦配列にとっているのは最後のコンマが面倒臭いからです。
計算だけでやろうと思ったのですが、行末のコンマが面倒で配列を使ってしまいました。