------ art_8959_2039871.1156864647707
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
I thought I should post my original solution that got
me wondering about better solutions and eventually got
me to submit a quiz.
Someone named their class DaySet, and I agree that's a
better name. I'll probably change mine to match.
My solution isn't complete.. some additional input
formats requirements were added to make it a more
interesting quiz. Mine only accepts an array of
integers (since that's what I will be using in my
Rails app anyway). I also changed my argument check
to be similar to James Edward Gray II's.
Also, if anyone is curious about the real-world
application I'm using this for, just send me an email
and I'll send you the url.
Anyway, here's my solution:
#DayRange
#
#DayRange accepts an array of day IDs (Mon , Tue 2, etc.)
#and returns a formatted string of the days, using day
ranges
#where appropriate, e.g, "Mon-Wed, Fri"
#
#author: Bryan Donovan
class DayRange
def day_hash
{ '1' Mon',
'2' Tue',
'3' Wed',
'4' Thu',
'5' Fri',
'6' Sat',
'7' Sun' }
end
def initialize(day_ids)
@day_ids ay_ids.uniq.sort
unless @day_ids.all? { |d| d.between?(1,7) }
raise ArgumentError "Days must be between 1 and 7"
end
end
#Returns formatted string representing the day array
def to_s
day_abbrs ay_hash
i
#Array of consec_days arrays
consec_day_groups ]
#Array of consecutive days. This gets
#reset when we find a day that is not
#part of a consecutive set of days.
consec_days ]
@day_ids.each do |day_id|
if i 0
#add the day abbr for this day if this is the first
#element of @day_ids.
consec_days << day_abbrs[day_id.to_s]
elsif @day_ids[i-1] (day_id - 1)
#if this is not the first day in @day_ids, check
#if the previous day in the array is the real life
#previous day of the week. If so, add it to the
#consec_days array
consec_days << day_abbrs[day_id.to_s]
else
#otherwise start a new consec_days array and
#add the current consec_days array to the
#consec_day_groups array.
consec_day_groups << consec_days
consec_days ]
consec_days << day_abbrs[day_id.to_s]
end
#Always add the consec_days array when this is the
#last day of the @day_ids array
if day_id @day_ids.last
consec_day_groups << consec_days
end
i +
end
day_strings ]
consec_day_groups.each do |c|
if c.length > 2
day_strings << c.first.to_s + "-" + c.last.to_s
else
day_strings << c.join(", ")
end
end
return day_strings.join(", ")
end
end
------ art_8959_2039871.1156864647707--