条件:
a + b + c = 100
a,b,c positive integers or 0
期望的输出:
[
[0,0,100],
[0,1,99 ],
... # all other permutations
[99,1,0 ],
[100,0,0]
]
最佳答案
我会写:
(0..100).flat_map { |x| (0..100-x).map { |y| [x, y, 100-x-y] } }
#=> [[0, 0, 100], [0, 1, 99]], ..., [99, 1, 0], [100, 0, 0]]
站点注释 1:这是一个经典示例,其中列表推导式大放异彩(如果某处有条件则更是如此)。由于 Ruby 没有 LC,我们必须进行典型的 OOP 转换:N-1 flat_map
's + 1 map
。在 Ruby 中使用 LC 会很棒(检查 this feature request ),Scala 已经证明,即使是纯 OOP 语言也能从这种语法糖中受益匪浅(尽管我可以理解开发人员的预防,因为隐式的可迭代协议(protocol)/方法)。在一个支持它们的假想 Ruby 上,你会写:
[[x, y, 100-x-y] for x in 0..100 for y in 0..100-x] # imaginary Ruby
旁注 2:假设您更喜欢内存消耗较少的解决方案(您可能不需要整个数组)。使用 Ruby 2.0 的惰性解决方案只需要添加几个 [lazy][2]
代理:
(0..100).lazy.flat_map { |x| (0..100-x).lazy.map { |y| [x, y, 100-x-y] } }
旁注 3:为了完整起见,在 @akuhn 的回答中,另一个使用枚举器的惰性解决方案:
Enumerator.new do |e|
(0..100).each { |x| (0..100-x).each { |y| e.yield([x, y, 100-x-y]) } }
end
关于ruby - 什么是最像 Ruby 的生成 3 个正整数加起来等于 100 的唯一组合的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13753977/