Как я могу отсортировать массив дат, чтобы он не был непрерывным?

Если я начну с непрерывной последовательности дат:

(Date.today..(Date.today + 30)).to_a

Как я могу отсортировать этот массив так, чтобы все даты в последовательности, по крайней мере, 1 день?

Я понимаю, что это, конечно, было бы невозможно для массива из двух смежных дат.

4 ответа

Всегда ли массив имеет четную длину? это так, я бы просто написал (легко модифицируемый для нечетной длины, если требуется):

>> (1..6).each_slice(2).to_a.transpose.flatten(1)
=> [1, 3, 5, 2, 4, 6]
(1..6).partition(&:odd?).flatten #=>[1, 3, 5, 2, 4, 6]

работает с диапазонами (или любыми перечисляемыми) независимо от четных или нечетных элементов.

Это работает для меня:

dates = (Date.today..(Date.today + 30)).to_a
dates.each_with_index{|d,i| dates.push(dates.delete(d)) if i % 2}

Глупое решение:

dates = (Date.today..(Date.today + 30)).to_a
begin
  ary   = dates.shuffle
  valid = (ary.select.each_with_index { |element, i| 
    ( i == ary.length-1 || (ary[i+1]  - element).abs  > 1 ) &&
    ( i == 0            || (element   - ary[i-1]).abs > 1 )
  })
end until valid.length == dates.length
ary

Используйте только если вы не заботитесь о производительности;-)

Другие вопросы по тегам