/ / Comment combiner / permuter en rubis? - rubis

Comment combiner / permuter en rubis? - rubis

J'ai "cette question familière qui ressemble à la permutation / combinaison du monde mathématique.

Comment puis-je atteindre les objectifs suivants via ruby?

badges = "1-2-3"

badge_cascade = []
badges.split("-").each do |b|
badge_cascade << b
end

Gives: => ["1", "2", "3"]

But I want it to be is:

=> ["1", "2", "3",
"1-2", "2-3", "3-1", "2-1", "3-2", "1-3",
"1-2-3", "2-3-1", "3-1-2"]

Réponses:

7 pour la réponse № 1

Approche fonctionnelle:

bs = "1-2-3".split("-")
strings = 1.upto(bs.size).flat_map do |n|
bs.permutation(n).map { |vs| vs.join("-") }
end
#=> ["1", "2", "3", "1-2", "1-3", "2-1", "2-3", "3-1", "3-2", "1-2-3", "1-3-2", "2-1-3", "2-3-1", "3-1-2", "3-2-1"]

5 pour la réponse № 2

Vous devez utiliser Tableau # permutation méthode pour obtenir toutes les permutations:

arr = "1-2-3".split "-" # => ["1", "2", "3"]
res = (1..arr.length).reduce([]) { |res, length|
res += arr.permutation(length).to_a
}.map {|arr| arr.join("-")}

puts res.inspect
# => ["1", "2", "3", "1-2", "1-3", "2-1", "2-3", "3-1", "3-2", "1-2-3", "1-3-2", "2-1-3", "2-3-1", "3-1-2", "3-2-1"]

Laissez-moi vous expliquer le code:

  1. Vous divisez la chaîne en séparateur de tableau "-" à String # split méthode

  2. Vous avez besoin de toutes les permutations de longueur 1, 2, 3. Plage 1..arr.length représente toutes ces longueurs.

  3. Vous collectez un tableau de toutes les permutations en utilisant Enumérable # réduire. Vous obtiendrez un tableau de tableaux ici:

    [["1"], ["2"], ["3"], ["1", "2"], ["1", "3"], ["2", "1"], ["2", "3"], ["3", "1"], ["3", "2"], ["1", "2", "3"], ["1", "3", "2"], ["2", "1", "3"], ["2", "3", "1"], ["3", "1", "2"], ["3", "2", "1"]]
    
  4. Vous transformez tous les sous-tableaux de ce tableau en chaînes à l'aide de Array # join avec votre "-" séparateur à l'intérieur de Enumerable # map


1 pour la réponse № 3

Array#permutation(n) vous donnera toutes les permutations de longueur n comme un tableau de tableaux afin que vous puissiez appeler cela avec chaque longueur entre 1 et le nombre de chiffres badges. La dernière étape consiste à mapper ces éléments dans des chaînes délimitées par -.

badges = "1-2-3"

badges_split = badges.split("-")

permutations = []

(1..badges_split.size).each do |n|
permutations += badges_split.permutation(n).to_a
end

result = permutations.map { |permutation| permutation.join("-") }

Mettre à jour: Je pense que Alex utilise reduce C'est une approche plus élégante, mais je vais laisser cette réponse ici pour le cas où cela serait utile