2012-05-07 9 views
2

現在の日付と既に使用されている日付に基づいて利用可能な週を計算する方法が必要です。ルビーで利用可能な週を計算する

私はさまざまな解決策を考え出しましたが、それらのすべてがRubyの「醜い」方法と思われます。私はそれを行う良い方法があることを知っています。

要件:

calculate_available_weeks (Date.current, 5, [1,3,7]) 

(のはDate.currentは日、2012年1月1日を返すとしましょう

方法は、我々は、このメソッドを渡しましょう3つの引数

start - Date, to start calculation from 

amount - Integer, How many weeks do we want? 

used_weeks - Array of already used weeknumbers (optional) Default: nil 

を取ります簡略化のため)

次にこの方法は、次の週の日付を返す必要があります:2,4,5,6,8

は、ここで私はこれまで持っているものです:私はルビーを好きな理由

def calculate_week_dates(start, amount, excluded_weeks = nil) 
    weeks = [] 

    last_checked = start 
    until weeks.length == amount do 
    unless excluded_weeks && excluded_weeks.include?(last_checked.cweek) 
     weeks << last_checked 
    end 
    last_checked = last_checked.next_week 
    end 

    weeks 
end 
+0

出力例は、コード例と一致しません。あなたは出力にcweek番号を指定しているようですが、あなたのコードは除外でcweeksを受け取りますが、その結果には週番号ではなく日付を生成します。あなたは、現在のプラス金額の週が来年になったら何を得たいですか? – dbenhur

答えて

1

これがあります。

def calculate(starting_week, amount, excluded_weeks = []) 
    ((starting_week..52).to_a - excluded_weeks).first(amount) 
end 

puts calculate(1, 5, [1,3,7]).inspect # => [2, 4, 5, 6, 8] 
puts calculate(5, 5, [1,3,7]).inspect # => [5, 6, 8, 9, 10] 
puts calculate(10, 5, [1,3,7]).inspect # => [10, 11, 12, 13, 14] 
+0

start_week + amount + excluded_weeks.sizeが翌年にラップするとどうなりますか? – dbenhur

+0

それは動作しません。 @Tim:ラッピングが必要ですか? – iblue

+0

@iblue:そうです、それで、なぜ私はDateとしてのスタートを過ぎているのですか? –

1

さて、あなたは機能列挙子を連鎖それを行うことができます。

def calculate_week_dates(start, amount, excluded_weeks = []) 
    (0 ... amount + excluded_weeks.size). 
    inject([start]) {|a,wk| a << a.last.next_week }. 
    reject {|wk| excluded_weeks.include? wk.cweek }. 
    first(amount) 
end 

しかし、私は、これは、蓄積ループより明確か、きれいであるかどうかを混合感じのよ。どちらの場合でも、後でnilガードを使用しないようにするために、excluded_weeksがnilではなく空の配列であると主張する方がよいでしょう。

関連する問題