Как я могу отсортировать массив дат, чтобы он не был непрерывным?
Если я начну с непрерывной последовательности дат:
(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
Используйте только если вы не заботитесь о производительности;-)