CodeIQ:進捗はいいゼットマーク

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

問題の概要

問題を引用します。
進捗のよさ具合をひと目で知らせるために「進捗はいいゼットマーク」を作ることにしました。
「進捗はいいゼットマーク」は高さ X 幅 X の正方形の中にZのカタチをしたの文字を半角小文字の「z」で描きます。
1行目と最終行はすべてが「z」に。2行目から最終行の前の行までは対角線が「z」になります。
それ以外を半角ドット「.」にします。

例 高さ 1 幅 1 の進捗はいいぞゼットマーク

z

例 高さ 3 幅 3 の進捗はいいぞゼットマーク

zzz
.z.
zzz

例 高さ 5 幅 5 の進捗はいいぞゼットマーク

zzzzz
...z.
..z..
.z...
zzzzz

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

仕様
・標準入力の高さ(=幅)を元に「進捗はいいぞマーク」を出力する

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

例:
5

標準出力
・高さが奇数の場合は「進捗はいい進捗はいいゼットマーク」を出力する
・高さが偶数の場合は「invalid」を出力する

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

zzzzz
...z.
..z..
.z...
zzzzz

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

Samples
Sample1
Input
1

z

Sample2
Input
3

zzz
.z.
zzz

Sample3
Input
5

zzzzz
...z.
..z..
.z...
zzzzz
Sample4
Input
2

invalid

私のプログラム

Rubyで解答しています。

#!/usr/bin/ruby

def solve(n)
	if n%2 == 0 then
		puts "invalid"
		return
	elsif n == 1 then
		puts "z"
	else
		puts "z" * n

		for i in 1..(n-2)
			str = "." * n
			str[n-1-i] = "z"
			puts str
		end

		puts "z" * n
	end
end

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

	solve(line.to_i)
end

解説

このシリーズでは3問目ですが一番簡単と思います。

main

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

solve(n)

nが偶数なら'invalid'なので先にチェックしてしまいます。
先頭行は全部zなのでzをn個印字します。
(0始まりで)1〜(n-2)行目までは右から行数番目の文字がz、それ以外が.なので、.がn個の文字列を作っておき、(n-i-1)文字目をzにし、それを印字します。
最終行も全部zなのでzをn個印字します。

雑感

先頭行と最終行だけが特別で、それ以外は右上から左下に1文字ずつずれてゆくだけなので単純です。