2012-03-11 4 views
0

イベントをその日までにグループ化したい。 Prefact:Rubyでの高度なグループ化

Available days are 1,2,3,4,5,6,7 
    One event can not contain duplicates. e.g [1,1,2,3] 
    Setup is Ruby 1.9.2 with Rails 3.2 

イベントが8~10以上の属性のように含有されている(例に含めるする必要はなく、これらの属性がまだグループ化した後に存在するべきであると考えるべきである。)換言すれば、イベントオブジェクトはいけませんそのままでグループ分けされています。

events = [ 
    { 
    :name => "event1", 
    :days => [1,2,3,4,5] 
    }, 
    { 
    :name => "event2", 
    :days => [1,4,5] 
    }, 
    { 
    :name => "event3", 
    :days => [1] 
    }, 
    { 
    :name => "event4", 
    :days => [2] 
    }, 
    { 
    :name => "event5", 
    :days => [3] 
    }, 
    { 
    :name => "event6", 
    :days => [4] 
    }, 
    { 
    :name => "event7", 
    :days => [5] 
    }, 
    { 
    :name => "event8", 
    :days => [1,2,3] 
    }, 
    { 
    :name => "event9", 
    :days => [1,5] 
    }, 
    { 
    :name => "event10", 
    :days => [1,2] 
    }, 
    { 
    :name => "event11", 
    :days => [1,2,3,4,5] 
    } 
] 

イベントをグループ化するには、少なくとも3日持っている必要があります。

は、オブジェクトの配列を考えてみましょう。そして、今日は数値順でなければなりません。

例(グループ化されるべきである):[1,2,3]

例(グループ化されるべきではない)ではない[1,4,5]

イベント彼らが含まれている毎日に配置する必要があります。

例:それは非常に高度ルビー

[ 
    { 
    :heading => "1", 
    :events => [ 
     { 
     :name => "event3", 
     :days => [1] 
     }, 
     { 
     :name => "event9", 
     :days => [1,5] 
     }, 
     { 
     :name => "event10", 
     :days => [1,2] 
     }, 
     { 
     :name => "event2", 
     :days => [1,4,5] 
     } 
    ] 
    }, 
    { 
    :heading => "2", 
    :events => [ 
     { 
     :name => "event4", 
     :days => [2] 
     }, 
     { 
     :name => "event10", 
     :days => [1,2] 
     } 
    ] 
    }, 
    { 
    :heading => "3", 
    :events => [ 
     { 
     :name => "event5", 
     :days => [3] 
     } 
    ] 
    }, 
    { 
    :heading => "4", 
    :events => [ 
     { 
     :name => "event6", 
     :days => [4] 
     }, 
     { 
     :name => "event2", 
     :days => [1,4,5] 
     } 
    ] 
    }, 
    { 
    :heading => "5", 
    :events => [ 
     { 
     :name => "event7", 
     :days => [5] 
     }, 
     { 
     :name => "event9", 
     :days => [1,5] 
     }, 
     { 
     :name => "event2", 
     :days => [1,4,5] 
     } 
    ] 
    }, 
    { 
    :heading => "1-3", 
    :events => [ 
     { 
     :name => "event8" 
     } 
    ] 
    }, 
    { 
    :heading => "1.5", 
    :events => [ 
     { 
     :name => "event1" 
     }, 
     { 
     :name => "event11" 
     } 
    ] 
    } 
] 

:[1,4,5】上記1,4および5

にイベント配列の所望の結果を配置する必要がありますここに。私にとってはあまりにも進んでいるかもしれませんが、私が試したことのすべてが方程式の一部を欠いてしまいます。しかしねえ、それはRubyだ、それほど難しいはずはない?

EDIT:明確化と修正期待される出力

+2

event8は3日連続していますが、出力は分割されていますか? – tokland

+0

あなたのルールによれば、event8は "1-3"グループに入るべきではありませんか? – DigitalRoss

+0

「1,3,4,5」はどうですか?それは別の '1'を、次に' 3-5'のグループを持っていますか?それとも、何もグループ化しないだろうか?そして、「1,1,2,3」や「5,3,1」のような日を持つことは可能ですか? – Amadan

答えて

2
require 'pp' 
pp(events.inject(Hash.new { |h, k| h[k] = [] }) do |m, e| 
    days = e[:days] 
    event = { :name => e[:name] } 
    if days.size >= 3 && days.last - days.first + 1 == days.size 
    m["%d-%d" % [days.first, days.last]] << event 
    else 
    days.each { |d| m[d.to_s] << event } 
    end 
    m 
end) 
+0

すごい! –

+0

それは動作します!グループ化されたイベントを最後に取得する方法はありますか?グループ '' 1-3 '''は '' 1-5' 'の前でなければなりません。 –

+0

確かに、1.8または1.9では、ハッシュの代わりに配列として結果を得ることができ、1.9では、配列をハッシュに変換できるハッシュオブジェクトが作成順序を保持します。結果を 'r'に入れて、次に:' r.sort_by {| k、v | 1.9では、 'Hash [r.sort_by {...}] ' – DigitalRoss

1

で更新たとえば、私は少しDigitalRossの答えを変更します。私はまた、試験前の日の配列をソートするのが賢明だろう...これは[1,1,3,4]キャッチします

​​

if days.size >= 3 && days.last - days.first + 1 == days.size 

を変更します!

関連する問題