No Programming, No Life

プログラミング関連の話題や雑記

2のx乗を求めるスクリプト

クロージャの練習で作ったスクリプトをせっかくなんで公開。

言語はrubyとgroovy。
題材はNo Programming, No Lifeの表の数値。

まずはruby

ソース
def count_up(interval)
  num = 1
  1.upto(80) do |i|
    num *= 2
    yield(i, num) if i % interval == 0
  end
end

count_up(10) do |i, num|
  print "2の#{i}乗=#{num.to_s()}\n"
end

yieldで処理をブロックに渡します。

出力結果


>ruby num.rb
2の10乗=1024
2の20乗=1048576
2の30乗=1073741824
2の40乗=1099511627776
2の50乗=1125899906842624
2の60乗=1152921504606846976
2の70乗=1180591620717411303424
2の80乗=1208925819614629174706176

続いてgroovy

ソース
def countUp(def interval, Closure clos) {
  def num = 1G // BigInteger型
  for(i in 1..80){
    num *= 2
    if(i % interval == 0) {
       clos.call(i, num)
    }
  }
}

countUp(10) { i, num ->
  println "2の${i}乗=${num.toString()}"
}

こちらはClosureクラスのcallメソッドを実行してクロージャを呼び出す。

(2008-12-13追記: id:nobusueさんのご指摘を受け、「def num = new BigInteger("1")」となっていた部分を「def num = 1G」へと変更しました)

出力結果


>groovy num.groovy
2の10乗=1024
2の20乗=1048576
2の30乗=1073741824
2の40乗=1099511627776
2の50乗=1125899906842624
2の60乗=1152921504606846976
2の70乗=1180591620717411303424
2の80乗=1208925819614629174706176

結果はrubyとgroovyどちらも同様。