3の倍数と3が付く数字の時に…
2008-04-02
というプログラムをふと書いてみたくなった。 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;
}
追記
人力検索はてなで質問がでていた。
多彩な回答があって参考になるなぁ。