せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Ruby】【アルゴリズム】逆ポーランド記法

テンパズルを解くために下準備中。

おなじみ、テンパズルとは。

1から9までの、1桁の数字がかかれたカードが4枚ある。
この数字をそれぞれ1回ずつ使い、10になるように計算する。

あれです。
駅の切符とか、ナンバープレートとかで暇つぶしにやるあれ。

え?自分は当然そんな習慣ないです。
そんなことばっかり考えてる男性ってなんか辛気臭い。みたいな。

髪のチェックとかしてるよ。
女子だから。


まずは、逆ポーランドから。

逆ポーランド記法(ぎゃくポーランドきほう、英語:Reverse Polish Notation, RPN)とは、数式やプログラムを記述する方法(記法)の一種。演算子(オペレータ)を被演算子オペランド)の後(右)に記述することから、後置記法(Postfix Notation)とも言う。

http://ja.wikipedia.org/wiki/%E9%80%86%E3%83%9D%E3%83%BC%E3%83%A9%E3%83%B3%E3%83%89%E8%A8%98%E6%B3%95

"15+23+*" ⇒30

 

実装したコード

10分で書けた!すごい!

def _calc(num1, num2, operator)
  raise "argument is not correct" if num1.nil? || num2.nil?
  a = num1.to_f ; b = num2.to_f
  return a + b if operator == "+"
  return a - b if operator == "-"
  return a * b if operator == "*"
  return a / b if operator == "/"
end
def calculate(str)
  num_stack = []
  datas = str.split("")
  datas.each do |data|
    if data =~ /\d/
      num_stack << data 
    else
      a = num_stack.pop
      b = num_stack.pop
      num_stack << _calc(b, a, data)
    end
  end
    raise "argument is not correct" if num_stack.length != 1
    num_stack
end

p calculate("15+23+*")

■実行結果

30.0