Line 1: Error: Invalid Blog('by Esehara' )

または私は如何にして心配するのを止めてバグを愛するようになったか

>> Zanmemo

あと何かあれは 「esehara あっと じーめーる」 か @esehara まで

文系プログラマが整数論を勉強してRubyのFizzBuzzを書いたらどうなるか

Ruby書くのを練習したのが3日目なのだけれど、まさかもうメタプログラミングを使うはめになるとは……

ルール

ある関数に、1から100の整数が入る。このとき

  1. その整数が3で割りきれる場合、Fizz
  2. その整数が5で割りきれる場合、Buzz
  3. その整数が15で割りきれる場合、FizzBuzz
  4. 上記に当てはまらない場合、その数

それぞれを出力するプログラムを書きなさい

実装

class Float
  def int?
    f = self.to_s.split(".")[-1]
    f == "0"
  end
end

def fizzbuzz(n)
  case 
  when (n / 15.0).int? then "FizzBuzz"
  when (n / 3.0).int? then "Fizz"
  when (n / 5.0).int? then "Buzz"
  else n
  end
end

[*1..100].each {|v| puts fizzbuzz v}

雑に証明します

 まず、a,bが整数であり、かつbは0ではないとするう。このとき、q,rになる整数がある。それらの数により

a = bq + r

 と表現できる。aがbで割りきれるというとき、rが0になる場合である。

 インプットされた整数をaとする。この両辺をbで割る場合

\frac{a}{b} = \frac{bg}{b} + \frac{r}{b}

 とすることができる。式を整理すれば、

\frac{a}{b} = q + \frac{r}{b}

 とすることができる。このとき、qは定義上整数であるが、しかし\frac{r}{b}は整数であることを保証しない。

 また、rは0 \le r \lt bの範囲をとる。この場合、\frac{r}{b}0 \le \frac{r}{b} \lt 1になる(と思う)。なので、この場合、0の整数か、0ではない1以下の実数である(と思う)。

 従って両者を割った場合、整数+実数か、あるいは整数に定まる。

たぶん言語仕様的なアレ

 Rubyの場合、実質Intである(つまり、a = bg で表現できる)Float型の場合、"#{bg}.0" という表現になる。

 とすると、Rubyの場合、"."を境目に整数部分と、実数部分にわかれる。この実数部分が\frac{r}{b}。ここが文字列として"0"であるならば、実質"0"である筈なので、ここの"0"をチェックする。

rが0だった場合

 rが0の場合、 a = bg + r = bg + 0 = bg とすることができる。このとき、aはbの倍数である。上記により、割りきれることが証明できる。

言い訳

 始めてTeX記法と、数学っぽいことを書いてみようと思ったのだけれど、間違っているところが確実にあると思うし、「それ自明じゃないじゃん」みたいなところはたくさんあると思う。大学のレポートだったらお情けで可くらいだと思うので、マサカリを投げてくれれば幸いです。

精度の問題っつーのがあるだろ

 気がついてなかった、これは盲点だった。

 haruyamaさん、ご指摘ありがとうございます。

参考文献

整数論1: 初等整数論からp進数へ

整数論1: 初等整数論からp進数へ