#!/usr/bin/ruby $goal = 10.0 def doError msg STDERR.puts msg exit(-1) end #逆ポ評価 def evalans s s2 = [] s.each do |a| case a when '+', '-', '*', '/' arg1 = s2.pop.to_f arg2 = s2.pop.to_f return nil if arg1 == nil || arg2 == nil s2.push(arg2 + arg1) if a=='+' s2.push(arg2 - arg1) if a=='-' s2.push(arg2 * arg1) if a=='*' s2.push(arg2 / arg1) if a=='/' else s2.push(a) end end return nil if s2.length != 1 return s2[0] end # 逆ポ → 通常の式 def showans s s2 = [] s.each do |a| case a when '+', '-', '*', '/' arg1 = s2.pop arg2 = s2.pop return nil if arg1 == nil || arg2 == nil s2.push('('+arg2.to_s + ' ' + a + ' ' + arg1.to_s+')') else s2.push(a) end end puts s2[0] end # 使用したオペレータ数と数値の配列が引数 def calc nops, digits if $ans.length == 7 showans($ans) if evalans($ans) == $goal return end digits.length.times do |i| next if digits[i] == nil $ans.push(digits[i]) digits[i] = nil calc nops, digits digits[i] = $ans.pop.to_s end if nops < 3 ['+', '-', '*', '/'].each do |op| $ans.push(op) calc nops + 1, digits $ans.pop end end end $ans=[] digits = [] while a = ARGV.shift do case a when /-goal/ $goal = ARGV.shift.to_f else digits.push a end end doError "Please specify 4 digits." if digits.length != 4 calc 0, digits