/ / Как да се комбинира / пермутация в рубин? - рубин

Как да комбинираме / пермутация в рубин? - рубин

Аз познавам този познат въпрос, който изглежда като пермутация / комбинация от математическия свят.

Как мога да постигна следното чрез рубин?

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"]

Отговори:

7 за отговор № 1

Функционален подход:

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 за отговор № 2

Можете да използвате Array # пермутация метод, за да получите всички пермутации:

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"]

Нека обясня кода:

  1. Разделяте низ в масив, преминаващ през разделител "-" да се String # сплит метод

  2. Нуждаете се от всички пермутации с дължина 1, 2, 3. Диапазон 1..arr.length представлява всички тези дължини.

  3. Събирате масив от всички използващи permutations Enumerable # намаляват, Тук ще получите масив от масиви:

    [["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. Преобразувате всички подраздели от този масив в низове, използвайки Array # присъединят с твоя "-" разделител вътре Enumerable # карта


1 за отговор № 3

Array#permutation(n) ще ви даде всички пермутации на дължината п като масив от масиви, така че можете да наричате това с всяка дължина между 1 и броя на цифрите в значки, Последната стъпка е да ги съпоставим обратно с низове, разделени с -.

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("-") }

Update: Мисля, че Алекс използва reduce е по-елегантен подход, но аз ще оставя този отговор за сега, в случай че е полезен.