# # @author Sinu John # sinuvian at gmail dot com # www.sinujohn.wordpress.com # # # Usage: # python clock.py [degree [time]] # # 'degree' is the degree of fuzziness - can have values of 1 or 2 # 'time' - give time in the format hour:minute (24-hour format) # example: 9:45, 11:30, 14:25 # Default value of 'degree' is 1, and 'time' is System time. # import sys import time def fuzzy(hour, minute, degree=1): '''Implements the fuzzy clock. returns the the string that spells out the time - hour:minute Supports two degrees of fuzziness. Set with degree = 1 or degree = 2 When degree = 1, time is in quantum of 5 minutes. When degree = 2, time is in quantum of 15 minutes.''' if degree<=0 or degree>2: print 'Please use a degree of 1 or 2. Using fuzziness degree=1' degree = 1 begin = 'It\'s ' f0 = 'almost ' f1 = 'exactly ' f2 = 'around ' b0 = ' past ' b1 = ' to ' hourList = ('One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Eleven', 'Twelve') s1 = s2 = s3 = s4 = '' base = 5 if degree == 1: base = 5 val = ('Five', 'Ten', 'Quarter', 'Twenty', 'Twenty-Five', 'Half') elif degree == 2: base = 15 val = ('Quarter', 'Half') dmin = minute % base # to find whether we have to use 'almost', 'exactly' or 'around' if minute > 30: pos = int((60 - minute) / base) #position in the tuple 'val' else: pos = int(minute / base) if dmin == 0: s1 = f1 pos = pos - 1 elif dmin <= base/2: s1 = f2 if minute < 30: pos = pos-1 else: s1 = f0 if minute > 30: pos = pos -1 s2 = val[pos] if minute <= base/2: # Case like "It's around/exactly Ten" s2 = s3 = '' s4 = hourList[hour - 12 - 1] elif minute >= 60-base/2: # Case like "It's almost Ten" s2 = s3 = '' s4 = hourList[hour - 12] else: # Other cases with all words, like "It's around Quarter past One" if minute>30: s3 = b1 # to s4 = hourList[hour - 12] else: s3 = b0 # past s4 = hourList[hour - 12 - 1] return begin + s1 + s2 + s3 + s4 def main(): deg = 1 stm = time.localtime() h = stm.tm_hour m = stm.tm_min if len(sys.argv)>=2: try: deg = int(sys.argv[1]) except: print 'Please use a degree of 1 or 2. Using fuzziness degree=1' if len(sys.argv)>=3: tm = sys.argv[2].split(':') try: h = int(tm[0]) m = int(tm[1]) if h<0 or h>23 or m<0 or m>59: raise Exception except: print 'Bad time entered. Using the system time.' h = stm.tm_hour m = stm.tm_min print fuzzy(h, m, deg) return main()