2

連続した一連の日付から始める場合:

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

この配列をソートして、順番にすべての日付が少なくとも 1 日離れているようにするにはどうすればよいですか?

もちろん、これは2つの連続する日付の配列では不可能であることを認識しています。

4

4 に答える 4

2

配列は常に偶数の長さですか? そうです、私は簡単に書きます(必要に応じて奇数の長さに簡単に変更できます):

>> (1..6).each_slice(2).to_a.transpose.flatten(1)
=> [1, 3, 5, 2, 4, 6]
于 2012-09-10T19:38:05.407 に答える
2

これは私のために働く:

dates = (Date.today..(Date.today + 30)).to_a
dates.each_with_index{|d,i| dates.push(dates.delete(d)) if i % 2}
于 2012-09-10T18:45:02.527 に答える
2
(1..6).partition(&:odd?).flatten #=>[1, 3, 5, 2, 4, 6]

偶数要素または奇数要素に関係なく、範囲 (または任意の列挙可能) で機能します。

于 2012-09-10T21:11:19.563 に答える
-1

愚かな解決策:

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

パフォーマンスをあまり気にしない場合にのみ使用してください ;-)

于 2012-09-10T19:05:21.147 に答える