'*'で描画しよう(3) - わさっきの続きでございます.
前回残した課題は,nすなわちダイアモンド型の対角線の長さとして偶数を与えたときに,ダイアモンド型になってくれないというものでした.偶数だったら「とんがらせる」ことができないので,ダイアモンド型を追求するのが無茶じゃないか,と思うことなく,次善の解を考えていきます.
n=8のとき,描きたい図形を座標で表してみます.
この図で,'*'に着目すると,左端の'*'の表示する上でのx座標は0になります.そう考えたときに,図の中心の座標は,実数軸で見るとなのですが,左端の'*'を0として,いわば離散的に考えると,となります.この中心座標は,nが奇数のときにも成り立ちます.
ということで,プログラムは次のようになります.
#!/usr/bin/env ruby # diamond3.rb class Diamond def initialize(n_ = 0) @n = n_.to_i @n = 13 if @n <= 0 end def start nhalf = @n / 2 dist = (@n - 1.0) / 2 @n.times do |y| @n.times do |x| if (x - dist).abs + (y - dist).abs <= nhalf print "*" else print " " end end puts end end end if __FILE__ == $0 Diamond.new(ARGV.shift).start end
実行してみます.
$ ruby diamond3.rb * *** ***** ******* ********* *********** ************* *********** ********* ******* ***** *** * $ ruby diamond3.rb 12 ** **** ****** ******** ********** ************ ************ ********** ******** ****** **** **
(2)の図形と少し違います.あっちでは,n-1行n列の領域に描いていました.今回のほうが,左右対称,上下対称,そして点対称ですので,均整がとれています.脱線ではなくこちらを本線として,次回はこれをCに作り替えることにします.