--Apple-Mail-1-149917106
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
charset F-8;
formatðïwed
Just for fun, a little over-engineered maybe...

--
Mike Stok <mike / stok.ca>
http://www.stok.ca/~mike/
The "`Stok' disclaimers" apply.
--Apple-Mail-1-149917106
Content-Type: multipart/mixed;
boundary ¨ÂìåÍáéì²±´¹¹±·±°
--Apple-Mail-2-149917106
Content-Transfer-Encoding: 7bit
Content-Type: text/html;
charset -ASCII
<HTML><BODY style ord-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space; ">Just for fun, a little over-engineered maybe...<DIV><BR class html-block-placeholder"></DIV><DIV><SPAN></SPAN></DIV></BODY></HTML>
--Apple-Mail-2-149917106
Content-Transfer-Encoding: 7bit
Content-Type: text/x-ruby-script;
x-unix-mode44;
nameÓÚrange.rb
Content-Disposition: attachment;
filename¥ìyrange.rb
class DayRange
# Class for translating between day names and numbers
class DayTranslator
require 'abbrev'
VALID_DAY_NUMBERS .. 7
def initialize(day_names { Monday Tuesday Wednesday Thursday Friday Saturday Sunday })
day_names.size 7 or raise ArgumentError, "must have a 7 element array"
# are there 7 different names?
@day_names ay_names
@name_map bbrev::abbrev(day_names)
@number_map }
day_names.each_with_index do |name, i|
@number_map[name] + 1
end
end
# Convert a string (day name or abbreviation) or a number to a day number and
# return it.
#
# If we get invalid input then raise an ArgumentError
def make_number(number_or_string)
number ase number_or_string
when String
@number_map[@name_map[number_or_string]]
when Numeric
number_or_string.to_i
else
raise ArgumentError
end
valid_day_number?(number) or raise ArgumentError
number
end
# Turn a day number into a string whose length may be specified
def make_string(number, length0
valid_day_number?(number) or raise ArgumentError
name day_names[number - 1]
name[0 ... [name.length, length].min]
end
def valid_day_number?(num)
VALID_DAY_NUMBERS.include?(num)
end
end
MIN_RANGE_SIZE # Ranges smaller than this are output as individual items
def initialize(*day_list)
@translator ayRange::DayTranslator.new
@day_ranges ake_ranges(day_list.collect { |day| @translator.make_number(day) })
end
#
def to_s
@day_ranges.collect { |range|
if range.size < MIN_RANGE_SIZE
range.collect { |day_num| @translator.make_string(day_num) }
else
"#{@translator.make_string(range.first)}-#{@translator.make_string(range.last)}"
end
}.flatten.join(', ')
end
# Turn a list of day numbers into a list of "ranges."
#
# Each range is stored as an array because it's easier to add elements to an
# array, and we are only dealing with 7 days at most here.
def make_ranges(day_list)
day_list.sort.inject([]) { |ranges, day_num|
if ranges.empty? or day_num ! anges.last.last.succ
ranges << [day_num]
else
ranges.last << day_num
end
ranges
}
end
end
--Apple-Mail-2-149917106
Content-Transfer-Encoding: 7bit
Content-Type: text/html;
charset -ASCII
<HTML><BODY style ord-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space; "><DIV><SPAN></SPAN><SPAN></SPAN></DIV></BODY></HTML>
--Apple-Mail-2-149917106
Content-Transfer-Encoding: 7bit
Content-Type: application/octet-stream;
x-unix-mode55;
name¥å
¥Æ¥å¥È¥³ ¥µ
¥å
¡×¡£¥Ã¥Ã¥Ã
¥¡¥Ã¥¡
¥¡¥¡
¥ä¥Æ¡¬¥à¥ä ¥· ¥ä¥³¥³¥æ¥³¥³¥ä¥Æ
¡× ¥ä
¡¬
¡¬¥£¥¡¥Ø¥å¥â¥¡¥ã ¥È¥á¥ç¥£¥¢¥ã¥¤¥ã¥¦¥ã¥¨¥ã¥ª¥ã¥«¥ã¥¥¥¥ç¡¬¥¥
¡¬¥£¥¡¥Ø¥å¥é¥ã ¥â¥ã ¥â¥¡¥ã ¥È¥á¥ç¥£¥¢¥ã¥¤¥ã¥¦¥ã¥«¥ã¥¥¥¥ç¡¬¥¥
¡¬¥£¥¡¥Ø¥ã ¥é¥å¥â¥¡¥ã ¥È¥á¥ç¥£¥¢¥ã¥¦¥ã¥¨¥ã¥ª¥ã¥«¥¥¥ç¡¬¥¥
¡¬¥£¥¡¥ä¥å¥ä¥ã ¥â¥ã ¥â¥¡¥ã ¥È¥á¥ç¥£¥¤¥ã¥¦¥ã¥¨¥ã¥«¥ã¥¥¥¥ç¡¬¥¥
¡¬¥£¥¡¥Ø¥ã ¥é¥ã ¥ä¥ã ¥â¥ã ¥â¥¡¥ã ¥È¥á¥ç¥£¥¢¥ã¥¦¥ã¥¨¥ã¥«¥ã¥¥¥¥ç¡¬¥¥
¡¬¥£¥¡¥â¥¡¥ã ¥È¥á¥ç¥£¥¥¥¥ç¡¬¥¥
¡¬¥£¥¡¥Ø¥ã ¥â¥¡¥ã ¥È¥á¥ç¥£¥¢¥ã¥¥¥¥ç¡¬¥¥
¡¬¥£¥Á¥Ê¥¥ ¥È¥á¥ç¥£¥¢¥ã¥¯¥¥
¡¬¡¬
¥á¥³¥³¥È¥ä¥ç
¡¬¥£¥¢¥ã ¥ç¡¬¥£¥¡¥Ø¥¡¥¥¥¥
¡¬¥£¥¢¥ã ¥ç¡¬¥£¥¡¥Ø¥¡¥¥¥¥
¡¬¥£¥¡¥Ø¥¡¥ã ¥ç¡¬¥£¥¢¥¥¥¥
¡¬¥£¥¡¥Ø¥¡¥ã ¥ç¡¬¥£¥¢¥ã ¥¢¥¥¥¥
¥å¥å¥Á¥å¥Ø¥å¥¤¥å¥¢¥¨¥±¥±¥¢¥¥¢¡¼¥«
¥Æ¥å¥ä¥å¥Ê¥³ ¥å
¥Æ¥å¥ä¥³ ¥Ã¥µ
¥Þ¥å¥¯¥¯¥ª¥±¥å¥¢
¥·¥Í¥ä¥Ø¥Õ¥»¥·¥Ä¥Þ¥È¥ë ¥¹¡Ö¥å¥³ ¥å¥µ ¥å¥å¥å¥³ ¥µ ¥å¥å¥å¥³ ¥å¥å¥µ ¡Ö¥»¥·¥È¥Î¥è¥»¥·¥â¥ß¥Á¥Û¥»¥·¥Ã¥â¥ß¥Á¥Û¥»¥·¥Ä¥á¥»¥·¥È¥Î¥è¥» ¥·¥â¥ß¥Á¥Û ¥¹¡Ö¥Á¥å¥å¡Ö ¥¹¡Ö¥å¥³ ¥µ ¥å¥³ ¡¼ ¡¼¥µ ¥³ ¥£¡¼¥ã ¡¼¥ã ¡¼¥¥¥µ ¥å¥³ ¥Í¥µ ¥å¥³ ¥¢¥¤¥µ ¥å¥³ ¥µ ¥å¥³ ¥µ ¥å¥³ ¥µ ¥å¥³ ¥µ ¥å¥³ ¥µ ¥å¥³ ¥µ ¥å¥å¥å¥å¥å¥³ ¥µ ¥å¥³ ¡¼¥µ ¥å¥å¥å¥å¥³ ¥µ ¥å¥³ ¥µ ¥³ ¥¤¥µ ¥å¥³ ¥µ ¥³ ¥¤¥µ ¥å¥³ ¡¼¥µ ¡Ö¥»¥·¥È¥Î¥è ¥¹¡Ö¥å¥³ ¡¼¥µ ¥å¥³ ¡¼¥µ ¥å¥³ ¡¼¥µ ¥å¥³ ¡¼¥µ ¡Ö¥»¥å¥å¥Ã¥È¥Î¥è¥»¥·¥È¥Î¥è ¥¹¡Ö¥å¥³ ¡¼¥µ ¥å¥³ ¡¼¥µ ¥å¥³ ¡¼¥µ ¥å¥³ ¡¼¥µ ¡Ö¥»¥·¥Ä¥á ¥¹¡Ö¥å¥å¡Ö¥»¥·¥Ã¥È¥Î¥è¥»¥·¥È¥Î¥è ¥¹¡Ö¥å¥³ ¡¼¥µ ¥å¥³ ¡¼¥µ ¥å¥³ ¡¼¥µ ¥å¥³ ¡¼¥µ ¡Ö¥»¥Ø ¥â ¥ò¥µ¥·¥Á ¥¹¡Ö¥³¥¿¥ç¡Ö¥»¥¿¥ç¥·¥Ã¥Á¥»¥ò¥µ¥·¥Ã¥È¥Î¥è¥»¥·¥È¥Î¥è ¥¹¡Ö¥å¥³ ¡¼¥µ ¥å¥³ ¡¼¥µ ¥å¥³ ¡¼¥µ ¥å¥³ ¡¼¥µ ¡Ö¥»¥·¥Á ¥¹¡Ö¥³¥Ã¥Ã¥ç¥ç¥Ã¥Ã¡Ö¥»¥³¥Ã¥Ã¥ç¥ç¥Ã¥Ã¥·¥Ã¥Á¥»¥·¥Ã¥È¥Î¥è¥»¥·¥È¥Î¥è¥¹¡Ö¥å¥³ ¡¼¥µ ¥å¥³ ¡¼¥µ ¥å¥³ ¡¼¥µ ¥å¥³ ¡¼¥µ ¡Ö¥»¥·¥Ä¥á ¥¹¡Ö¥å¥å¡Ö¥»¥·¥Ã¥È¥Î¥è¥»¥·¥È¥Î¥è ¥¹¡Ö¥å¥³ ¡¼¥µ ¥å¥³ ¡¼¥µ ¥å¥³ ¡¼¥µ ¥å¥³ ¡¼¥µ ¡Ö¥»¥ä ¡Ö¥â¥¡ ¡Ö ¥ç¥·¥Ã¥È¥Î¥è¥»¥·¥È¥Î¥è¥»¥·¥Ä¥á ¥¹¡Ö¥å¥å¡Ö¥»¥·¥Ã¥È¥Î¥è¥»¥·¥È¥Î¥è¥»¥·¥Ä¥á ¥¹¡Ö¥å¥å¡Ö¥»¥·¥Ã¥È¥Î¥è¥»¥·¥Ä¥á ¥¹¡Ö¥Á¥å¥å¡Ö¥»¥·¥Ã¥â¥ß¥Á¥Û¥» ¥·¥Ã¥È¥Î¥è¥»¥·¥Ä¥á¥»¥·¥Ã¥È¥Î¥è¥»¥·¥Ã¥Ä¥Þ¥È¥ë¥»¥·¥Ã¥Í¥ä¥Ø¥Õ¥»¥å¥Á¥å¥Ø¥å¥¤¥å¥¢¥¨¥±¥±¥¢¥¥¢¡¼¥«¥å¥å
¥å¥å¥Á¥å¥Ø¥å¥¢¥å¥¢¥¨¥±¥±¥¢¥¥¢¡¼¥«¥å¥å