2012-05-07 3 views
2

현재 날짜와 이미 사용한 날짜를 기반으로 사용 가능한 주를 계산하는 방법이 필요합니다.루비에서 사용 가능한 주를 계산하십시오.

나는 다른 솔루션을 생각해 냈지만 모두 루비에 대해 "추악한"것처럼 보입니다. 나는 그것을하는 더 좋은 방법이 있다는 것을 압니다.

요구 사항 :

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

(의이 Date.current이 2012년 (일) 1월 1일를 반환한다고 가정 해 봅시다 :

방법은

start - Date, to start calculation from 

amount - Integer, How many weeks do we want? 

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

이의 우리가 법이 통과한다고 가정 해 봅시다 3 개 인수

합니다 단순화를 위해)

그런 다음 방법은 다음 주 날짜를 반환해야합니다 : 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

작동하지 않습니다. @ 팀 : 포장이 필요합니까? – iblue

+0

@ 글루 : 그렇습니다. 그 이유는 제가 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 

그러나이 축적 루프보다 더 선명하고 더 예뻐인지 나는 혼합 된 느낌입니다. 두 경우 모두 exclude_weeks가 나중에 사용하지 않으려는 경비원을 피하기 위해 nil 대신 빈 배열임을 주장하는 것이 좋습니다.