| #! /usr/bin/env python | 
 |  | 
 | # Calculate your unbirthday count (see Alice in Wonderland). | 
 | # This is defined as the number of days from your birth until today | 
 | # that weren't your birthday.  (The day you were born is not counted). | 
 | # Leap years make it interesting. | 
 |  | 
 | import sys | 
 | import time | 
 | import calendar | 
 |  | 
 | def main(): | 
 |     if sys.argv[1:]: | 
 |         year = int(sys.argv[1]) | 
 |     else: | 
 |         year = int(input('In which year were you born? ')) | 
 |     if 0 <= year < 100: | 
 |         print("I'll assume that by", year, end=' ') | 
 |         year = year + 1900 | 
 |         print('you mean', year, 'and not the early Christian era') | 
 |     elif not (1850 <= year <= time.localtime()[0]): | 
 |         print("It's hard to believe you were born in", year) | 
 |         return | 
 |  | 
 |     if sys.argv[2:]: | 
 |         month = int(sys.argv[2]) | 
 |     else: | 
 |         month = int(input('And in which month? (1-12) ')) | 
 |     if not (1 <= month <= 12): | 
 |         print('There is no month numbered', month) | 
 |         return | 
 |  | 
 |     if sys.argv[3:]: | 
 |         day = int(sys.argv[3]) | 
 |     else: | 
 |         day = int(input('And on what day of that month? (1-31) ')) | 
 |     if month == 2 and calendar.isleap(year): | 
 |         maxday = 29 | 
 |     else: | 
 |         maxday = calendar.mdays[month] | 
 |     if not (1 <= day <= maxday): | 
 |         print('There are no', day, 'days in that month!') | 
 |         return | 
 |  | 
 |     bdaytuple = (year, month, day) | 
 |     bdaydate = mkdate(bdaytuple) | 
 |     print('You were born on', format(bdaytuple)) | 
 |  | 
 |     todaytuple = time.localtime()[:3] | 
 |     todaydate = mkdate(todaytuple) | 
 |     print('Today is', format(todaytuple)) | 
 |  | 
 |     if bdaytuple > todaytuple: | 
 |         print('You are a time traveler.  Go back to the future!') | 
 |         return | 
 |  | 
 |     if bdaytuple == todaytuple: | 
 |         print('You were born today.  Have a nice life!') | 
 |         return | 
 |  | 
 |     days = todaydate - bdaydate | 
 |     print('You have lived', days, 'days') | 
 |  | 
 |     age = 0 | 
 |     for y in range(year, todaytuple[0] + 1): | 
 |         if bdaytuple < (y, month, day) <= todaytuple: | 
 |             age = age + 1 | 
 |  | 
 |     print('You are', age, 'years old') | 
 |  | 
 |     if todaytuple[1:] == bdaytuple[1:]: | 
 |         print('Congratulations!  Today is your', nth(age), 'birthday') | 
 |         print('Yesterday was your', end=' ') | 
 |     else: | 
 |         print('Today is your', end=' ') | 
 |     print(nth(days - age), 'unbirthday') | 
 |  | 
 | def format(date): | 
 |     (year, month, day) = date | 
 |     return '%d %s %d' % (day, calendar.month_name[month], year) | 
 |  | 
 | def nth(n): | 
 |     if n == 1: return '1st' | 
 |     if n == 2: return '2nd' | 
 |     if n == 3: return '3rd' | 
 |     return '%dth' % n | 
 |  | 
 | def mkdate(date): | 
 |     # January 1st, in 0 A.D. is arbitrarily defined to be day 1, | 
 |     # even though that day never actually existed and the calendar | 
 |     # was different then... | 
 |     (year, month, day) = date | 
 |     days = year*365                  # years, roughly | 
 |     days = days + (year+3)//4        # plus leap years, roughly | 
 |     days = days - (year+99)//100     # minus non-leap years every century | 
 |     days = days + (year+399)//400    # plus leap years every 4 centirues | 
 |     for i in range(1, month): | 
 |         if i == 2 and calendar.isleap(year): | 
 |             days = days + 29 | 
 |         else: | 
 |             days = days + calendar.mdays[i] | 
 |     days = days + day | 
 |     return days | 
 |  | 
 | if __name__ == "__main__": | 
 |     main() |