我有一个与sign(+/-)和数字交错的数组。 有没有办法在ruby中评估这个数组?
例如:["+", 1, "+", 2, "+", 3]
。
这需要进行评估,即在上述情况下为6
。
更多例子:
["+", 1, "+", 2, "+", 3] -> 6
["+", 1, "+", 2, "-", 3] -> 0
["-", 1, "-", 2, "-", 3] -> -6
答案 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