連続した一連の日付から始める場合:
(Date.today..(Date.today + 30)).to_a
この配列をソートして、順番にすべての日付が少なくとも 1 日離れているようにするにはどうすればよいですか?
もちろん、これは2つの連続する日付の配列では不可能であることを認識しています。
連続した一連の日付から始める場合:
(Date.today..(Date.today + 30)).to_a
この配列をソートして、順番にすべての日付が少なくとも 1 日離れているようにするにはどうすればよいですか?
もちろん、これは2つの連続する日付の配列では不可能であることを認識しています。
配列は常に偶数の長さですか? そうです、私は簡単に書きます(必要に応じて奇数の長さに簡単に変更できます):
>> (1..6).each_slice(2).to_a.transpose.flatten(1)
=> [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}
(1..6).partition(&:odd?).flatten #=>[1, 3, 5, 2, 4, 6]
偶数要素または奇数要素に関係なく、範囲 (または任意の列挙可能) で機能します。
愚かな解決策:
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
パフォーマンスをあまり気にしない場合にのみ使用してください ;-)