[Kc] Perl Quiz-of-the-Week #22

Garrett Goebel garrett at scriptpro.com
Thu Aug 26 07:41:40 CDT 2004


IMPORTANT: Please do not post solutions, hints, or other spoilers
        until at least 60 hours after the date of this message.
        Thanks.

Qing3 Zhu4Yi4: Qing3 Ning2 Deng3Dao4 Jie1Dao4 Ben3 Xin4Xi2 Zhi1Hou4 60
        Xiao3Shi2, Zai4 Fa1Biao3 Jie3Da2, Ti2Shi4, Huo4 Qi2Ta1 Hui4
        Xie4Lou4 Da2An4 De5 Jian4Yi4.  Xie4Xie4.

----------------------------------------------------------------

The purpose of this problem is very simple (and hopefully something many of
us will be able to use).

Inside a directory (say $ENV{HOME}/.upcoming) we have several files.
Here's part of one:

02/26	lon brocard
03/06  michelangelo
05/29	simon cozens
12/28	randal schwartz
02/27 eduardo nuno
03/05 crapulenza tetrazzini
03/16 richard m. stallman 


This particular file is appropriately named 'birthdays'. You can have as
many different files as you wish in that directory.

Here's part of another file, 'events':

   01       payday
   15       payday
08/13/2004  slides for YAPC::EU::2004
03/01       feast of st. david
03/01/1565  Rio de Janeiro founded        
03/09/2004  dentist appointment 10:00

As you can see, both the month and the year are optional. When not given a
month, we'll have three spaces; by the end of the date we may have as many
spaces and/or tabs up to the description.  The 'events'
file says that payday occurs on the 1st and 15th of every month, and that
the Feast of St. David occurs each year on the first day of March.

This week's problem consists of writing the script 'upcoming', which tells
us about our upcoming events.  Suppose today is 26 February.
Then the output will contain:

        birthdays
           ===> 02/26	lon brocard
           -->  02/27	eduardo nuno

        events
        -->     03/01   payday
        -->     03/01   Feast of St. David


Explanation:

* For each file, you get a paragraph, if there are upcoming events
  mentioned in that file.

* The program will print all the events that will occur in the next
  'n' days, where 'n' is specified with a '-n' command-line flag.  If
  '-n' is omitted, 'n' will default to 7 days.

* For each event, you get a string that tells you about the event's
proximity:

  0 =>  '   ===>',
  1 =>  '   -->',
  2 =>  '  -->',
  3 =>  ' -->',
  4 =>  '-->',
  5 =>  '->',
  6 =>  '>',
  7 =>  ' ',

If the '-n' switch is given, and the event is in the specified range, but
more then 7 days ahead, then the proximity string is something like (8) or
(13) depending on how many days ahead the event is.
Here we're running the program on 26 February, as before, but with the
option '-n 12':

        birthdays
           ===> 02/26	lon brocard
           -->  02/27	eduardo nuno
        (8)     03/05   crapulenza tetrazzini
        (9)     03/06   Michelangelo

        events
        -->     03/01   Feast of St. David
        -->     03/01   payday
        (12)    03/09   dentist appointment 10:00


Note that the founding of Rio de Janeiro did not occur in either output,
since it has already passed.

As you'll notice, it's a little hard to schedule things such as the fourth
Thursday of each month, or dates like Mother's Day (I don't know about the
rest of the world, but that changes, here in Portugal).
It might be a good idea to find a reasonable way to solve this.

Happy hacking :-)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.pm.org/pipermail/kc/attachments/20040826/9d8ba5bb/attachment.htm


More information about the kc mailing list