Ruby,无法解释的减少行为

时间:2018-03-31 07:02:28

标签: ruby reduce

美好的一天。在不同的编程竞赛中解决一种'找到独特价值'问题的常见做法是使用此代码arr.reduce(:^)

例如像那样的任务给你一个奇数长度的整数数组,除了一个数字之外,它们都是相同的。找到这个号码通常以这种方式解决: [8,8,8,5,8,8,8].reduce(:^) # 5

我开始做实验,发现这个解决方案存在一个差距,现在是:

p [8,2,2].reduce(:^) # 8
p [8,2,2,2].reduce(:^) # 10 !!!!!!!!
p [8,2,2,2,2].reduce(:^) # 8

我发现在任何数组格式[x,y,y,y] x都无法找到reduce(:^)

p x = rand(1..100)
p y = rand(1..100)
p [x, y, y, y].reduce(:^) == x # FALSE (!)
puts "But!"
p [x, y, y ].reduce(:^) == x # true
p [x, y, y, y, y ].reduce(:^) == x # true

为什么会这样? (我的红宝石是MRI 2.3.0)

2 个答案:

答案 0 :(得分:2)

  

您将获得奇数长度整数数组,...

[8, 2, 2, 2]奇数长度怎么样?

第三个2永远不会被异化。有人可能会逐步检查:

8 ^ 2
#⇒ 10
8 ^ 2 ^ 2
#⇒ 8 # because 2 and 2 are XOR’ed out
8 ^ 2 ^ 2 ^ 2
#⇒ 10 # because it’s the same as 8 ^ 2

此外:

2 ^ 2 ^ 2
#⇒ 2

答案 1 :(得分:1)

@mudasobwa answer is correct. However for more insight you might wanna have a a look at:

https://www.calleerlandsson.com/rubys-bitwise-operators/

For your use case you are better off with:

[8,2,2,2].inject{|i,n| i > n ? i : n}

Let's see what's going on under the hood:

def max_array_int(arr)
  arr.inject do |i,n|
    check = i > n ? i : n
    puts "evaluated #{i} > #{n}. result: #{check}"
    check
  end
end

max_array_int [10,3,15,7]