Rubyで円を描くパズル

問題
半径が与えられると、文字を使って円を描く関数print_circleを作れ。例えば、以下はprint_circle(10)の出力例。(正確に一致する必要はありません)

          ●
      ●●●●●●●●●
    ●●●●●●●●●●●●●
   ●●●●●●●●●●●●●●●
  ●●●●●●●●●●●●●●●●●
  ●●●●●●●●●●●●●●●●●
 ●●●●●●●●●●●●●●●●●●●
 ●●●●●●●●●●●●●●●●●●●
 ●●●●●●●●●●●●●●●●●●●
 ●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●
 ●●●●●●●●●●●●●●●●●●●
 ●●●●●●●●●●●●●●●●●●●
 ●●●●●●●●●●●●●●●●●●●
 ●●●●●●●●●●●●●●●●●●●
  ●●●●●●●●●●●●●●●●●
  ●●●●●●●●●●●●●●●●●
   ●●●●●●●●●●●●●●●
    ●●●●●●●●●●●●●
      ●●●●●●●●●
          ●

解答
特にひねりはなく、円の定義から作りました。

def print_circle(r)
  (-r..r).to_a.each do |x|
    (-r..r).to_a.each do |y|
      if x ** 2 + y ** 2 <= r ** 2
        print ''
      else
        print ' '
      end
    end
    print "\n"
  end
end

print_circle(10)

無意味に複雑にした版も作ってみました。

class TrueClass
  def to_mark
    ''
  end
end

class FalseClass
  def to_mark
    ' '
  end
end

def print_circle(r)
  (-r..r).to_a.each do |x|
    (-r..r).to_a.each do |y|
      print '' + (x ** 2 + y ** 2 <= r ** 2).to_mark
    end
    print "\n"
  end
end

print_circle(10)

今回のエントリは結城浩の『Perlクイズ』≪パズル≫ 2000-03-13 Puzzle.0006をベースにしています。