ruby - 什么是最像 Ruby 的生成 3 个正整数加起来等于 100 的唯一组合的方法

标签 ruby function combinations permutation

条件:

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/

相关文章:

ruby-on-rails - 订阅的短信支付平台?

ruby - Rails 加载错误版本的 Ruby

Python:在文本文件中写入 pd.Series 的所有组合

python - 列表嵌套字典的笛卡尔积

ruby - win32console已安装,但未按预期显示 'require'

ruby-on-rails - 保留 ActiveAdmin 布局的 ActiveAdmin 自定义 View

c++ - 如何为 C++ 函数中的结构分配默认值?

具有动态生成参数的 Javascript 函数

hibernate - JPA Hibernate 调用 Postgres 函数无效返回映射异常 :

python - 如何打印因素列表的所有非重复产品