気ままなタンス*プログラミングなどのノートブック

プログラミングやRPGツクール、DTM、VOCALOIDについてのんびり書きます。

【Ruby】002.縦、横の長さを任意の回数読み込んで、矩形を出力する

今日もAIDU ONLINE JUDGEで楽しいRubyお勉強。

本日はこれ
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10013

縦、横の長さを任意の回数読み込んで、矩形を出力する

りんねぐりっどのプログラム

forms = []
while str = gets
	layout = str.split(" ").map!{|x| x.to_i }
	break if layout.all?{|x| x == 0 }
	forms.push(layout) 
end

forms.each{|x|
	for i in 0..x[0]-1
		for j in 0..x[1]-1
			#ここを工夫したい
			if j > 0 && j < x[1]-1 && i > 0 && i < x[0]-1
				print "."
			else
				print "#"
			end
		end
		puts ""
	end
	puts ""
}


ポイントは2点。(コーディング中に考えてたこと)

  • [1]コマンドラインから任意の回数だけ、縦・横の長さを入力するためのwhile文
    • 文字列を読み込んだときに半角スペースで区切られた数値をsplitで分割しmapメソッドのブロックで整数にキャスト(ここのmapは破壊的メソッド)。all?メソッドのブロックを用いて全て0ならばbreakする。
  • [2]縦・横の長さを記録した分だけ、矩形を出力するeach
    • '#'を出力するタイミング、'.'を出力するタイミングを分析すると、あら面白い。#は外枠、'.'は内容として表示している。縦と横それぞれの出力で考えるとやりやすい。
      • 縦(i)
        • 1列目:'#'
        • 2列目:'#'から始まり、'.'で間を埋め、'#'で終わる
        • 最後 :'#'
      • 横(j)
        • 1行目:'#'
        • 2行目:'#'から始まり、'.'で間を埋め、'#'で終わる
        • 最後 :'#'

つまり、iとjが2列目、2行目以降で、最後の列、行より小さいときには、'.'を出力するようにしてあげればいい。
iとjは0から始まるので・・・
j > 0 && j < x[1] - 1 && i > 0 && i < x[0] - 1
となる。

プログラムに求められている要件は満たしているけど、条件部分がちょっとモヤモヤしている。もっと別の書き方できるんじゃなかろうか。

もしかっこいいプログラムが書けたら、このブログのコメント欄使って自慢してください。素敵なソースをぜひ。