LoginSignup
2
2

More than 5 years have passed since last update.

[Ruby基礎学習] パターンの表示④

Last updated at Posted at 2015-04-25

はじめに

章末問題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

この数値自体を列挙しない方法でどうにかできるのだろうけど。
数日考えてここまでしか思いつかず。
それとも根本的にやり方がおかしいのか。う〜ん…
この図形難し…

問題の出典

  • プログラマの考え方がおもしろいほど身につく本 問題解決能力を鍛えよう!
2
2
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2