at posts/single.html

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;
}

追記

人力検索はてなで質問がでていた。

多彩な回答があって参考になるなぁ。

関連する日記