Перемешать два массива неслучайно

#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: понял 😉😄