「Rubyがミニツク」の演習問題を解く vol4

Stringクラスレッスンの演習

問題

菱形(ひし形)を出力しなさいという問題。
なお、菱形の横幅は、半角文字で30文字。

          *          
         * *            
        *   *    
       *     *     
        *   *  
         * *   
          *     

この問題はヒント付き

  • 文字列を繰り返す時は、「*」が使える
  • 文字列を中央寄せする時は、.centerメソッドが使える
  • stepメソッドは、任意の値ずつ加算(減算)する事が可能

この3つのヒントを上手く使えということでしょう。

さっそく書いていきます。

私の回答・解説

まずは、問題文の理解から。
菱形の横幅は半角30文字とはどこの事を指しているのか。
そもそも30文字(偶数文字)だと菱形が作れない・・・

  *       *
 * *     **
*   *   *  *
 * *     **
  *       *
左が奇数5文字、右が偶数文字4文字

上のように、偶数文字だと最初と最後の*が 中央に表示できない。
なので空白を含めて30文字、
つまり菱形の横幅は29文字と勝手に解釈します。

そして一生懸命考えて行き着いた答えがこちら・・・
表示を4段階に分けました。

  1. ひし形の上部
  2. ひし形の広がっていく部分
  3. ひし形の狭まっていく部分
  4. ひし形の下部

駄目だ・・、絶対模範回答と違う気がする笑

模範回答を恐る恐る見てみる...

 1. def diamond(width, padding=' ')
 2.   return if width.zero?
 3.   width += 1 if width.odd? 
 4.  
 5.   puts("*".center(width))
 6.   max = width - 2
 7.   interval = 1
 8.   interval.step(max, 2) do |i|
 9.     puts("*#{padding * i}*".center(width))
10.   end
11.   max -= 3
12.   max.step(interval, -2) do |i|
13.     puts("*#{padding * i}*".center(width))
14.   end
15.   puts("*".center(width))
16. end
17.  
18. diamond(30)

あれ、以外と似ている。
メソッドにしてなかった事と
ループ処理で使う数字を変数にセットしている事ぐらい。

3. width += 1 if width.odd?

これ意味あるのかな・・・
11行目で-3してるので+1しとかないとズレるって事かな。
あとでじっくり確認しときます。

次回から演習コースになります。
そろそろついていけない!