遠い世界の数式

遠い世界の数式
http://nabetani.sakura.ne.jp/kanagawa.rb/evalex/

解いてみた。

まず最初に考えたもの。結構強引。
問題は最後の5問だけ。

class Fixnum
  def -(x) self | x end
  def ^(x) self + x end
  def >(x) self * x end
end

DATA.each do |expr|
  p eval(expr.gsub(/[\|\+\*]/, {'|'=>'-', '+'=>'^', '*'=>'>'}))
end

__END__
13&84&43*6+77|56+59|15&24+9*66
928&728*151+695&321*369|845+771
5984|86*8519&43184&7183+401*48|6629+97|852
217|999&112+511+357+514&98*796|718*715|442&682
461&424&462+557+855|656|924*234*557&451*884|322

こっちは優先順位に従って地道に式変形していく方法。

def f(e, op)
  e.sub!(/\d+#{Regexp.quote(op)}\d+/) {|t| eval(t).to_s} while e.index(op)
end

DATA.each do |expr|
  print %w(| & + *).each_with_object(expr) {|op, e| f(e, op)}
end

__END__
13&84&43*6+77|56+59|15&24+9*66
928&728*151+695&321*369|845+771
5984|86*8519&43184&7183+401*48|6629+97|852
217|999&112+511+357+514&98*796|718*715|442&682
461&424&462+557+855|656|924*234*557&451*884|322