Mailing List Archive: 49091 messages
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

[REBOL] Exercise: Calculate # work days between two dates

From: edoconnor::gmail::com at: 31-Jan-2007 16:22

I found Sununda's algorithm challenge to be very interesting. I'm often amazed by the different approaches to a given problem. In this spirit, I thought I'd offer up a basic exercise based on a post about Ruby I came across yesterday. See: *Calculate the number of working days between two dates* http://www.railsonwave.com/railsonwave/2007/1/30/calculate-the-number-of-working-days-between-two-dates Here's an approach I took, which embellishes with a refinement: calc-workdays: func [ "Return number of workdays between two dates, excluding holidays" date1 [date!] "Start date" date2 [date!] "End date" holidays [block!] "Block of dates to exclude (holidays, etc.)" /non "Return number of non-work days (weekend + holidays) between 2 dates" /local days day1 day2 diff param ][ days: copy [] set [day1 day2] sort reduce [date1 date2] diff: day2 - day1 param: pick [[> 5 union][< 6 exclude]] either found? non [1][2] loop diff [ day1: day1 + 1 if do param/1 day1/weekday param/2 [append days day1] ] return length? do param/3 days holidays ] Results:
>> calc-workdays now/date 3-feb-2007 [1-feb-2007]
== 1
>> print calc-workdays/non now/date 3-feb-2007 [1-feb-2007]
== 2
>> calc-workdays now/date 31-dec-2007 [25-dec-2007 1-Jan-2008]
== 237
>> print calc-workdays/non now/date 31-dec-2007 [25-dec-2007 1-Jan-2008]
== 98 Anyone care to share a different or more natural approach? One of the things I'd like to see in REBOL's future is a guide or "phrase-book" for common expressions found in problems big and small. Ed