3の倍数と3が付く数字の時に…
というプログラムをふと書いてみたくなった。 FizzBuzz じゃなくて世界の NabeBuzz 問題。
そのために、 13.include?(3) みたいな判定ができるメソッドを作ってみた。 最初はこんな感じに書いた。 数字の右側から順番に (i /= 10) 、下ひと桁 (i % 10) が等しいかどうかチェックしている。
class Integer def include?(n) raise ArgumentError.new if n > 9 i = self while (i > 0) do return true if i % 10 == n i /= 10 end false end end
でもこれだと、
0.include?(0)
が false になってしまう。 試行錯誤して、結局こんな感じになった。
class Integer def include?(n) raise ArgumentError.new if n > 9 if self % 10 == n true elsif self > 9 (self / 10).include?(n) else false end end end
要は、再帰を使ってきれいに書けたのが嬉しかっただけなんだけどね。
ちなみに
実は一行で書けたりする。
class Integer def include?(n) self.to_s.include(n.to_s) end end
C だとこんな感じ? snprintf とか strstr とか、ちゃんと調べてないから使い方が怪しいけど、いちおう動いた。
#include <stdio.h> #include <string.h> int is_include(int num, int target) { char s_num[32]; char s_target[2]; snprintf(s_num, 32, "%d", num); snprintf(s_target, 2, "%d", target); return strstr(s_num, s_target) ? 1 : 0; }
追記
人力検索はてなで質問がでていた。
多彩な回答があって参考になるなぁ。