Получение всех комбинаций элементов массива при сохранении последовательности - Ruby - PullRequest
2 голосов
/ 11 августа 2010

Учитывая массив строк

["the" "cat" "sat" "on" "the" "mat"]

Я ищу, чтобы получить все комбинации элементов в последовательности, из любой начальной позиции, например,

["the"]
["the" "cat"]
["the" "cat" "sat"]
...
["cat" "sat" "on" "the" "mat"]
["sat" "on" "the" "mat"]
["on" "the" "mat"]
...
["sat" "on"]
["sat" "on" "the"]

Комбинации из оригиналапоследовательность или с отсутствующими элементами запрещены, например,

["sat" "mat"] # missing "on"
["the" "on"]  # reverse order

Я также хотел бы знать, имеет ли эта операция конкретное имя или есть более точный способ ее описания.

Спасибо.

Ответы [ 3 ]

6 голосов
/ 11 августа 2010

Если вы в однострочнике, вы можете попробовать

(0..arr.length).to_a.combination(2).map{|i,j| arr[i...j]}

Кстати, я думаю, это называется "все подпоследовательности" массива.

4 голосов
/ 11 августа 2010

Просто итерируйте по каждой начальной позиции и для каждой начальной позиции по каждой возможной конечной позиции:

arr = ["the", "cat", "sat", "on", "the", "mat"]
(0 ... arr.length).map do |i|
  (i ... arr.length).map do |j|
    arr[i..j]
  end
end.flatten(1)
#=> [["the"], ["the", "cat"], ["the", "cat", "sat"], ["the", "cat", "sat", "on"], ["the", "cat", "sat", "on", "the"], ["the", "cat", "sat", "on", "the", "mat"], ["cat"], ["cat", "sat"], ["cat", "sat", "on"], ["cat", "sat", "on", "the"], ["cat", "sat", "on", "the", "mat"], ["sat"], ["sat", "on"], ["sat", "on", "the"], ["sat", "on", "the", "mat"], ["on"], ["on", "the"], ["on", "the", "mat"], ["the"], ["the", "mat"], ["mat"]]

Требуется ruby ​​1.8.7+ (или backports) для flatten(1).

0 голосов
/ 03 апреля 2014

здесь вы можете получить все комбинации

(1...arr.length).map{ | i | arr.combination( i ).to_a }.flatten(1)
...