ナベアツ関数

プログラミングGaucheという本を読んでいたら、その中の「『Lisp脳』の謎に迫る」というコラムにこんな問題が載っていた。

1から100までの数をプリントするプログラムを書け。
ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、
3と5の両方の倍数の場合には「FizzBuzz」とプリントすること。

その本でこの問題を取り上げたのは、典型的な手続型の発想とScheme使いの発想の違いをデモするためだったのだが、安直にも

私は3の倍数と3のつく数字の数のときだけ変な顔になります。

でおなじみ、世界のナベアツを連想した。で、この問題のナベアツ版のコードを書いてみた。ただ、SchemeじゃなくてRubyで。

def digits(n)
  ret = []
  while n > 0
    ret << n % 10
    n = n / 10
  end
  ret
end

def nabeatsu?(n)
  digits(n).include?(3) or n % 3 == 0
end

(1..40).each do |i|
  if nabeatsu?(i)
    puts "%2d (`Д-)" % i
  else
    puts "%2d (^_^)" % i
  end
end

3のつく数の判定方法は、数字を文字列にして'3'という文字が含まれているかチェックしようかとはじめ考えた。だけどちょっと邪道な気がしたので一応数字だけで判定するようにした。


やるだけやってから、同じことをやった人が絶対いるだろう思って検索してみたらやはりいた。
http://q.hatena.ne.jp/1207585413