计算红宝石的可用周数

时间:2012-05-07 22:44:14

标签: ruby-on-rails ruby

我需要一种方法,根据当前日期和已使用的日期计算可用周数。

我提出了不同的解决方案,但对于Ruby来说,所有这些解决方案似乎都是“丑陋”的。我知道有更好的方法可以做到。

要求:

方法需要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

假设我们通过了这个方法:

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

(假设为了简单起见,Date.current将返回 Sun,2012年1月1日

然后该方法应返回以下几周的日期: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

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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

但我感觉好像这比积累循环更清楚,更漂亮。在任何一种情况下,你最好断言excluded_weeks是一个空数组而不是nil,以避免在你想要使用它时使用后来的nil guards。