ich schreiben würde:
(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]]
Website Anmerkung 1: Dies ist ein klassisches Beispiel, in dem list-Comprehensions Glanz (und noch mehr, wenn es ein Zustand irgendwo war). Da Ruby keine LC hat, müssen wir die typische Umwandlung zu OOP durchführen: N-1flat_map
's + map
. Es wäre großartig, LCs in Ruby zu haben (siehe this feature request), Scala hat bewiesen, dass sogar eine reine OOP-Sprache von diesem syntaktischen Zucker profitiert (obwohl ich die Prävention von den Entwicklern aufgrund des impliziten iterierbaren Protokolls/Methode verstehen kann). Auf einer imaginären Rubin, die sie unterstützt Sie schreiben würde:
[[x, y, 100-x-y] for x in 0..100 for y in 0..100-x] # imaginary Ruby
Exkurs 2: Stellen Sie sich vor, dass Sie einen weniger speicherintensive Lösung bevorzugen (Sie wahrscheinlich das gesamte Array nicht brauchen). Ein fauler Lösung mit Ruby-2.0 erfordert nur ein paar [lazy][2]
Proxies hinzuzufügen:
(0..100).lazy.flat_map { |x| (0..100-x).lazy.map { |y| [x, y, 100-x-y] } }
Side Anmerkung 3: Nur der Vollständigkeit halber, in der Linie der @akuhn Antwort, eine weitere faule Lösung unter Verwendung von Aufzählungen:
Enumerator.new do |e|
(0..100).each { |x| (0..100-x).each { |y| e.yield([x, y, 100-x-y]) } }
end
erinnern einige der Antworten wählen – tokland