Ruby,无法解释的reduce行为
你好。在不同的编程竞赛中解决一类“查找唯一值”问题的常见做法是使用以下代码Ruby,无法解释的reduce行为,ruby,reduce,Ruby,Reduce,你好。在不同的编程竞赛中解决一类“查找唯一值”问题的常见做法是使用以下代码arr.reduce(:^): 例如,像这样的任务会给您一个奇数长度的整数数组,其中除一个数字外,所有整数都是相同的。查找此数字通常通过以下方式解决: [8,8,8,5,8,8,8]。减少(:^)#5 我开始做实验,发现这个解决方案有一个缺口,就是: p [8,2,2].reduce(:^) # 8 p [8,2,2,2].reduce(:^) # 10 !!!!!!!! p [8,2,2,2,2].reduce(:^)
arr.reduce(:^)
:
例如,像这样的任务会给您一个奇数长度的整数数组,其中除一个数字外,所有整数都是相同的。查找此数字通常通过以下方式解决:
[8,8,8,5,8,8,8]。减少(:^)#5
我开始做实验,发现这个解决方案有一个缺口,就是:
p [8,2,2].reduce(:^) # 8
p [8,2,2,2].reduce(:^) # 10 !!!!!!!!
p [8,2,2,2,2].reduce(:^) # 8
我发现在任何数组格式中,reduce(:^)
都找不到x
:
为什么会这样?(我的ruby是MRI 2.3.0)
给你一个奇数长度的整数数组
[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
此外:
给你一个奇数长度的整数数组
[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
此外:
@mudasobwa的回答是正确的。但是,要了解更多信息,您可能需要了解: 对于您的用例,您最好使用:
[8,2,2,2].inject{|i,n| i > n ? i : n}
让我们看看引擎盖下面发生了什么:
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]
@mudasobwa的回答是正确的。但是,要了解更多信息,您可能需要了解: 对于您的用例,您最好使用:
[8,2,2,2].inject{|i,n| i > n ? i : n}
让我们看看引擎盖下面发生了什么:
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]