def calc(op,l,r) case op when :+ then l+r when :* then l*r when :- then l-r when :/ then l/r when :% then l%r end end while line=gets do a = line.scan(%r![-+/*%]|\d+(?:\.\d+)?!).map{|e| case e when /\d+\.\d+/ then e.to_f when /\d+/ then e.to_i when %r![-+/*]! then e.to_sym end } # この部分は 関数 Scan としてまとめるといいだろう while (l, ope, r = a.shift(3); ope) # 以前に提示していたコード、 # while l, ope, r = a.shift(3) and ope # は今は動作しないので上記のように訂正した a.unshift(calc(ope,l,r)) end puts l end