评估存储在数组中的表达式

时间:2016-09-25 08:21:07

标签: ruby

我有一个与sign(+/-)和数字交错的数组。 有没有办法在ruby中评估这个数组?

例如:["+", 1, "+", 2, "+", 3]。 这需要进行评估,即在上述情况下为6

更多例子:

["+", 1, "+", 2, "+", 3] ->  6
["+", 1, "+", 2, "-", 3] ->  0
["-", 1, "-", 2, "-", 3] -> -6

3 个答案:

答案 0 :(得分:7)

对于给定的数组结构,代码可能类似于

 int k;
cin>>k;
for(int i=1;i<=k;i++){
    int r,c1,c2;
    cin>>r>>c1>>c2;
     mymap[r].push_back(c1);
     mymap[r].push_back(c2);

}

答案 1 :(得分:0)

试试这个简单的单线

eval ["+", 1, "+", 2, "+", 3].map(&:to_s).reduce(:+)
  

注意:eval的负面影响尚未考虑在内   这里。

答案 2 :(得分:0)

以下是另外两种方法。

<强>#1

def calc(arr)
   enum = arr.to_enum
   loop.reduce(0) { |val| val.send enum.next, enum.next }
end

calc ['+', 7, '+', 1, '-', 2, '-', 3, '+', 4]
   #=> 7

只要缺少括号不是问题,您可以添加除+-之外的运算符(具有两个操作数)。您无法计算((-1+4)*4)%5,但可以评估-1+4*4%5

calc ["-", 1, "+", 4, "*", 4, "%", 5]
  #=> 2

<强>#2

def calc(arr)
  arr.each_slice(2).
      with_object({}) { |(op,val),h| (h[op] ||= []) << val }.
      values_at('+', '-').
      map { |a| (a || [0]).reduce(:+) }.
      reduce(:-)
end

calc ['+', 7, '+', 1, '-', 2, '-', 3, '+', 4]
  #=> 7
calc ['+', 7, '+', 1]
  #=> 8 
calc ['-', 2, '-', 3]
  #=> -5 

步骤如下。

arr ['+', 7, '+', 1, '-', 2, '-', 3, '+', 4]
a = arr.each_slice(2)
  #=> #<Enumerator: ["+", 7, "+", 1, "-", 2, "-", 3, "+", 4]:each_slice(2)> 

我们可以看到这个枚举器通过将它转换为数组而生成的对象。

a.to_a
  #=> [["+", 7], ["+", 1], ["-", 2], ["-", 3], ["+", 4]] 

继续,

b = a.with_object({}) { |(op,val),h| (h[op] ||= []) << val }  
  #=> {"+"=>[7, 1, 4], "-"=>[2, 3]} 
c = b.values_at('+', '-')
  #=> [[7, 1, 4], [2, 3]] 
d = c.map { |a| (a || [0]).reduce(:+) }
  #=> [12, 5] 
e.reduce(:-)
  #=> 7