CodeIQ:進捗ジエンドマーク

私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「進捗ジエンドマーク」(CodeIQ)を参照してください。

問題の概要

問題を引用します。
進捗が一気に進んで全て終わったことを知らせる「進捗ジエンドマーク」を作ることにしました。
「進捗ジエンドマーク」は高さ X 幅 X の正方形の中に J のカタチにした文字を半角小文字の「j」で描きます。

真ん中の行と、真ん中より上の行は右端を「j」にします。
一番下の行を除いた真ん中より下の行は左端と右端を「j」にします。
一番下の行は全てを「j」にします。
それ以外を半角ドット「.」にします。

例 高さ 1 幅 1 の進捗ジエンドマーク

j

例 高さ 3 幅 3 の進捗ジエンドマーク

..j
..j
jjj

例 高さ 5 幅 5 の進捗ジエンドマーク

....j
....j
....j
j...j
jjjjj

「進捗ジエンドマーク」を手入力するのはしんどいのでプログラムで出力することにしました。
「進捗ジエンドマーク」を出力するプログラムを実装してください。

仕様
・標準入力の高さ(=幅)を元に「進捗ジエンドマーク」を出力する

標準入力
・標準入力の高さが 1-100 の整数で与えられます

例:
5

標準出力
・高さが奇数の場合は「進捗ジエンドマーク」を出力する
・高さが偶数の場合は「invalid」を出力する

例(入力の例に対する出力の例)

....j
....j
....j
j...j
jjjjj

その他の仕様
・標準入力の末尾には改行があります
・標準出力の末尾に改行をつけてください
・標準入力の仕様で説明した内容以外の入力は行われません(不正入力に対するチェックは不要)

Samples
Sample1
Input
1

j

Sample2
Input
3

..j
..j
jjj

Sample3
Input
5

....j
....j
....j
j...j
jjjjj
Sample4
Input
2

invalid

私のプログラム

Rubyで解答しています。

#!/usr/bin/ruby

def solve(n)
	if n % 2 == 0
		puts "invalid"
		return
	end

	for i in 0...n
		if i <= n/2 then puts '.' * (n-1) + 'j'
		elsif i == n-1 then puts 'j' * n
		else puts 'j' + '.' * (n-2) + 'j'
		end
	end
end

# main
while line = gets
	line.strip!
	next if line.empty?
	solve(line.to_i)
end

解説

「進捗マーク」シリーズです

main

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

solve(n)

n/2行目以下は(n-1)個の'.'と'j'、最後の行はn個の'j'、それ以外は'j'と(n-2)個の'.'と'j'を印字します。

雑感

The EndのTじゃないんだ。