Proponuję użyć Array#product
.
[:a, :b].product [4,5]
Co przyniesie pożądane wyniki.
irb(main):001:0> [:a, :b].product [4,5]
=> [[:a, 4], [:a, 5], [:b, 4], [:b, 5]]
irb(main):002:0>
Jeśli chcesz leniwego generatora permutacji, napisałem coś takiego wcześniej. Ale ostrzegam, jeśli masz dużą liczbę permutacji do obliczenia, może to trochę potrwać. Powinieneś być w stanie wziąć to, czego potrzebujesz od pierwszych 40 - 45 linii this file (ten plik i tak był eksperymentem).
Sztuką jest zbudowanie modułów wyliczających przy użyciu Ruby 1.9.2, aby przejść przez szereg tablic. Najpierw zbudujesz moduł wyliczający, który będzie cyklicznie przechodził przez macierz, aw module wyliczającym tablicę będziesz śledził pierwszy zestaw wyjściowy i zakończy pętlę, gdy zostanie trafiony po raz drugi. To był jedyny sposób, w jaki mogłem wymyślić, jak zakończyć taką pętlę.
def infinite_iterator(array)
Enumerator.new do |result|
loop do
array.cycle { |item| result << item }
end
end
end
def cartesian_iterator(data)
Enumerator.new do |result|
first = data.map { |p| p.next }
result << first
i = 1
parts = first.dup
loop do
parts[2-i] = data[2-i].next
break if parts == first
result << parts.join
i = ((i + 1) % parts.size)
end
end
end
array = [ infinite_iterator([:a,:b]), infinite_iterator([4,5]) ]
generator = cartesian_iterator(array)
generator.each { |a| p a }
Czy możesz wyjaśnić, o co prosisz? Jak powinieneś konstruować co? Czy próbujesz utworzyć klasę o nazwie "CartesianProduct", która zrobiłaby to, co pokazano? – denniss
Tak, wymaga to metody klasy. Wiem, jak skonstruować metodę instancji, aby zwrócić wartość, ale nie wiem, jak skonstruować metodę klasy, aby zmodyfikować wartość obiektu klasy. – ZhijieWang
Czy to zadanie domowe? Jeśli tak, to jest w porządku, ludzie będą próbować popchnąć cię we właściwym kierunku. – steenslag