#arrays #ruby
#массивы #ruby
Вопрос:
У меня есть два разных массива с массивами в них:
Vowels = [['a', 'a'], ['a', 'e'], ['a', 'i']]
Consonants = [['b', 'b', 'b'], ['b', 'b', 'c'], ['b', 'b', 'd']]
Я хочу иметь возможность смешивать их вместе во все возможные комбинации, не теряя и не добавляя содержимое, с помощью функции
allmixes(Vowels, Consonants)
#=> [['a', 'a', 'b', 'b', 'b'], ['a', 'b', 'b', 'b', 'a'], ...]
Под смешиванием я подразумеваю, что мне нужно, чтобы два массива имели своего рода комбинацию без дубликатов или перемешивание, которое следует шаблону, позволяющему мне вызывать определенный результат по индексу.
Ответ №1:
Vowels = [['a', 'a'], ['a', 'e']]
Consonants = [['b', 'b', 'b'], ['b', 'b', 'c']]
Vowels.product(Consonants).flat_map { |v,c| (v c).permutation.to_a.uniq }
#=> [["a", "a", "b", "b", "b"], ["a", "b", "a", "b", "b"], ["a", "b", "b", "a", "b"],
["a", "b", "b", "b", "a"], ["b", "a", "a", "b", "b"], ["b", "a", "b", "a", "b"],
["b", "a", "b", "b", "a"], ["b", "b", "a", "a", "b"], ["b", "b", "a", "b", "a"],
["b", "b", "b", "a", "a"], ["a", "a", "b", "b", "c"], ["a", "a", "b", "c", "b"],
["a", "a", "c", "b", "b"], ["a", "b", "a", "b", "c"], ["a", "b", "a", "c", "b"],
...
["c", "b", "a", "e", "b"], ["c", "b", "a", "b", "e"], ["c", "b", "e", "a", "b"],
["c", "b", "e", "b", "a"], ["c", "b", "b", "a", "e"], ["c", "b", "b", "e", "a"]]
Vowels.product(Consonants).flat_map { |v,c| (v c).permutation.to_a.uniq }.size
#=> 120
Ответ №2:
Вы можете попробовать с permutation
:
vowels.flat_map do |vowel|
consonants.flat_map do |consonant|
[*vowel,*consonant].permutation.to_a.uniq
end
end
Комментарии:
1. Если я задам
vowels = Vowels
иconsonants = Consonants
, дляVowels
иConsonants
, определенный в моем ответе, ваш код создаст тот же массив (из 120 элементов), который я получаю с моим кодом.2. @CarySwoveland: извините, к чему вы клоните (опасность для сна)?
3. Просто мы либо оба правы, либо оба ошибаемся. 😎
4. @CarySwoveland: понял 😉😄