CodeIQ:進捗プログレスマーク

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

問題の概要

問題を引用します。
進捗進んだ!やった!!というおきもちを知らせる「進捗プログレスマーク」を作ることにしました。
進 捗 プ ロ グ レ ス。
そう、大事なことは二度言う気持ちです。
「進捗プログレスマーク」は高さ X 幅 X の正方形の中にPのカタチをした文字を半角小文字の「p」で描きます。
一番上と真ん中の行は全て列が「p」です。
それ以外の真ん中より上については左右の端のみが「p」です。
それ以外の真ん中より下については左端のみが「p」です。
それ以外を半角ドット「.」にします。

例 高さ 1 幅 1 の進捗プログレスマーク

p

例 高さ 3 幅 3 の進捗プログレスマーク

ppp
ppp
p..

例 高さ 5 幅 5 の進捗プログレスマーク

ppppp
p...p
ppppp
p....
p....

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

仕様
・標準入力の高さ(=幅)を元に「進捗プログレスマーク」を出力する

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

例:
5

標準出力
・高さが奇数の場合は「進捗プログレスマーク」を出力する
・高さが偶数の場合は「invalid」を出力する

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

ppppp
p...p
ppppp
p....
p....

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

Samples
Sample1
Input
1

p

Sample2
Input
3

ppp
ppp
p..

Sample3
Input
5

ppppp
p...p
ppppp
p....
p....
Sample4
Input
2

invalid

私のプログラム

Rubyで解答しています。

#!/usr/bin/ruby

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

	for i in 0...n
		str = '.' * n
		if (i == 0) || (i == n-n/2-1) then
			str = 'p' * n
		elsif (0 < i) && (i < n/2) then
			str[0] = 'p'
			str[n-1] = 'p'
		else
			str[0] = 'p'
		end
		puts str
	end
end

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

	solve(line.to_i)
end

解説

「進捗マーク」シリーズ、終わったと思いましたが再開しました。

main

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

solve(n)

1行目とn/2行目はn個の'p'、1〜n/2-1行目は両はしに'p'、それ以外は先頭だけを'p'にすればOKです。

雑感

全部'p'の行の条件を(i == n-n/2-1)とか言う複雑な式にしてしまっています。多分、何か疲れていたのだと思います。