プログラミング/ruby/遠い世界の数学 のバックアップ(No.1)

更新


公開メモ

概要

こちらで紹介されていた、

http://qiita.com/cielavenir/items/cadbc5e24525b6a86cf8

このお題について。

http://nabetani.sakura.ne.jp/kanagawa.rb/evalex/

まず思いついた普通のやり方

LANG:ruby
def calc(expr)
  expr.split('*', -1).inject(1) do |result, expr|
    result * expr.split('+', -1).inject(0) do |result, expr|
      result + expr.split('&', -1).inject(0xffffffff) do |result, expr|
        result & expr.split('|', -1).inject(0) do |result, expr|
          result | expr.to_i
        end
      end
    end
  end
end

正規表現で手抜きをする

LANG:ruby
def calc2(expr)
  eval expr.gsub(/[^\*\(\)]+/,'(\\0)')
           .gsub(/[^\*\+\(\)]+/,'(\\0)')
           .gsub(/[^\*\+\&\(\)]+/,'(\\0)')
end

コードゴルフ的な何か

LANG:ruby
def calc3(s)
  eval s.gsub(/[^*]+/){"(#{$&.gsub(/[^+]+/){"(#{$&.gsub(/[^&]+/,'(\\0)')})"}})"}
end

質問・コメント





Counter: 4390 (from 2010/06/03), today: 3, yesterday: 0