Проверка через подмножество Array - PullRequest
0 голосов
/ 15 февраля 2012

У меня есть проблема, я пытаюсь написать метод, который принимает массив и возвращает подмножество и перестановку двойок, включая исходный массив. Как проверить наличие определенных шаблонов в массиве. Например, учитывая этот массив:

[a,b,c]

возврат подмножества будет:

[a,b,c,], [a,b], [b,c], [c,a]

и мне также нужно проверить, содержит ли каждое подмножество определенную букву. Вот мой код:

def conflict_free?(a)
  return a.permutation(2).to_a
end

Ответы [ 2 ]

2 голосов
/ 15 февраля 2012

Вот как получить подмножества, которые вы ищете:

def subsets(a)
  2.upto(a.length).flat_map {|n| a.combination(n).to_a}
end

irb(main):023:0> subsets(["a", "b", "c"])
=> [["a", "b"], ["a", "c"], ["b", "c"], ["a", "b", "c"]]

Все, что вы хотите, вам придется отредактировать свой вопрос и предоставить более подробную информацию.

0 голосов
/ 16 февраля 2012

Вот очень компактное и быстрое решение:

def conflict(a)
  a.combination(2).to_a << a
end

>> [["a", "b"], ["a", "c"], ["b", "c"], ["a", "b", "c"]]

Если вы действительно хотели, чтобы начальный массив был в начале, вы жертвовали немалой скоростью. Тем не менее, лучший способ сделать это:

def conflict(a)
  temp = [a]
  a.combination(2).each { |com| temp << com}
  temp
end

>> [["a", "b", "c"], ["a", "b"], ["a", "c"], ["b", "c"]]

Если вход не равен 3, это будет работать:

def conflict(a)
  temp = []
  2.upto(a.size-1) {|i| temp += a.combination(i).to_a}
  temp << a
end

Исходный массив может быть добавлен в начале или конце. Выше это в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...