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 № 1Approche 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:
Vous divisez la chaîne en séparateur de tableau
"-"
à String # split méthodeVous avez besoin de toutes les permutations de longueur 1, 2, 3. Plage
1..arr.length
représente toutes ces longueurs.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"]]
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