什么是最像Ruby的方式生成3个正整数的每个独特组合,最多可加100
发布时间:2020-12-16 21:19:21 所属栏目:百科 来源:网络整理
导读:条件 a + b + c = 100a,b,c positive integers or 0 期望的输出: [ [0,100],[0,1,99 ],... # all other permutations [99,0 ],[100,0]] Stackoverflow说我的帖子没有太多的上下文来解释代码部分.你同意吗? (这是填充文本以满足其要求) 解决方法 我写道: (
条件
a + b + c = 100 a,b,c positive integers or 0 期望的输出: [ [0,100],[0,1,99 ],... # all other permutations [99,0 ],[100,0] ] Stackoverflow说我的帖子没有太多的上下文来解释代码部分.你同意吗? (这是填充文本以满足其要求) 解决方法
我写道:
(0..100).flat_map { |x| (0..100-x).map { |y| [x,y,100-x-y] } } #=> [[0,99]],...,[99,0],0]] 网站注释1:这是一个典型的例子,其中列表理解能够发光(如果某个地方存在某种情况,甚至更多).由于Ruby没有LC,我们必须进行典型的OOP转换:N-1 flat_map的1映射.在Ruby中使用LC会很棒(检查this feature request),Scala已经证明即使是纯OOP语言也能从这种语法糖中获益(尽管由于隐式迭代协议/方法,我可以理解开发人员的预防).在一个支持它们的想象中的Ruby上你会写: [[x,100-x-y] for x in 0..100 for y in 0..100-x] # imaginary Ruby 旁注2:想象一下,您更喜欢耗费较少内存的解决方案(您可能不需要整个阵列).使用Ruby 2.0的懒惰解决方案只需要添加几个[懒惰] [2]代理: (0..100).lazy.flat_map { |x| (0..100-x).lazy.map { |y| [x,100-x-y] } } 旁注3:为了完整性,在@akuhn答案中,使用枚举器的另一个懒惰解决方案: Enumerator.new do |e| (0..100).each { |x| (0..100-x).each { |y| e.yield([x,100-x-y]) } } end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |