【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