はじめに
章末問題2問目。
問題
以下を表示する。
# #
## ##
### ###
########
########
### ###
## ##
# #
解答
難しい…何この形。
下が左右上下対照に4つある。
#
##
###
####
とりあえず空白も埋めてみて考える。
■□□□□□□□□□□□□■
□■■□□□□□□□□■■□
□□■■■□□□□■■■□□
□□□■■■■■■■■□□□
□□□■■■■■■■■□□□
□□■■■□□□□■■■□□
□■■□□□□□□□□■■□
■□□□□□□□□□□□□■
いつものようにまずは無理やり表示させる。
sharps = 2
spaces_center = 12
spaces_side = 0
4.times do
sharp = "#" * (sharps / 2)
space_side = " " * (spaces_side / 2)
puts space_side + sharp + (" " * spaces_center) + sharp + space_side
sharps += 2
spaces_center -= 4
spaces_side += 2
end
sharps -= 2
spaces_center += 4
spaces_side -= 2
4.times do
sharp = "#" * (sharps / 2)
space_side = " " * (spaces_side / 2)
puts space_side + sharp + (" " * spaces_center) + sharp + space_side
sharps -= 2
spaces_center += 4
spaces_side -= 2
end
この前教えてもらったcenter
を使ったらもうちょっと単純化できた。
center_spaces = 12
fillin_sp = 14
4.times do
puts (" " * center_spaces).center(fillin_sp, "#").center(14, " ")
center_spaces -= 4
fillin_sp -= 2
end
center_spaces += 4
fillin_sp += 2
4.times do
puts (" " * center_spaces).center(fillin_sp, "#").center(14, " ")
center_spaces += 4
fillin_sp += 2
end
この2回同じような処理があるのは何とかならないものか…。
…と思って使う数値を全列挙したら処理自体は短くなった。
space_array = [14,12,10,8,8,10,12,14]
[*12,8,4,0,0,4,8,12].each.with_index do |c, i|
puts (" " * c).center(space_array[i], "#").center(14, " ")
end
この数値自体を列挙しない方法でどうにかできるのだろうけど。
数日考えてここまでしか思いつかず。
それとも根本的にやり方がおかしいのか。う〜ん…
この図形難し…
問題の出典
- プログラマの考え方がおもしろいほど身につく本 問題解決能力を鍛えよう!