From [this hackerrank](https://www.hackerrank.com/challenges/library-fine): > Problem Statement > > The Head Librarian at a library wants you to make a program that > calculates the fine for returning the book after the return date. You > are given the actual and the expected return dates. Calculate the fine > as follows: > > - If the book is returned on or before the expected return date, no fine > will be charged, in other words fine is 0. > - If the book is returned in > the same calendar month as the expected return date, Fine = 15 Hackos > × Number of late days > - If the book is not returned in the same calendar > month but in the same calendar year as the expected return date, Fine > = 500 Hackos × Number of late months > - If the book is not returned in the same calendar year, the fine is fixed at 10000 Hackos. Input > > You are given the actual and the expected return dates in D M Y format in > two separate lines. The first line contains the D M Y values for the > actual return date and the next line contains the D M Y values for the > expected return date. My development philosophy was to TDD this. First write code that reads the date correctly, then start implementing the test cases from the problem statement. I did not put anything in a separate class. My code passed all their test cases but looks ugly as heck. Any suggestions for improvement would be appreciated! import datetime def testFine(dueDate, returnDate, actualFine): fine = getFine(dueDate, returnDate) if (fine != actualFine): print( "Test FAILED for duedate %s and returnDate %s with fine: %d but expected:%d." %( dueDate, returnDate, fine, actualFine) ) else: print( "Test passed for duedate %s and returnDate %s with fine: %d." % ( dueDate, returnDate, fine) ) def tests(): #If the book is not returned in the same calendar year, the fine is fixed at 10000 Hackos. testFine(datetime.date(2015,5,5), datetime.date(2016,5,6),10000) #If the book is returned on or before the expected return date, no fine will be charged, in other words fine is 0. testFine(datetime.date(2015,5,5), datetime.date(2015,5,5),0) testFine(datetime.date(2015,5,5), datetime.date(2015,5,3),0) #If the book is returned in the same calendar month as the expected return date, Fine = 15 Hackos × Number of late days testFine(datetime.date(2015,5,5), datetime.date(2015,5,6),15) testFine(datetime.date(2015,2,5), datetime.date(2015,2,10),75) #If the book is not returned in the same calendar month but in the same calendar year as the expected return date, Fine = 500 Hackos × Number of late months testFine(datetime.date(2015,2,5), datetime.date(2015,3,1),500) testFine(datetime.date(2015,2,5), datetime.date(2015,6,1),2000) def getFine(dueDate, returnDate): #print (dueDate, returnDate) if (returnDate.year > dueDate.year): return 10000 if (returnDate.year == dueDate.year and returnDate.month == dueDate.month and returnDate.day > dueDate.day): return 15*(returnDate.day-dueDate.day) if (returnDate.year == dueDate.year and returnDate.month > dueDate.month): return 500*(returnDate.month-dueDate.month) return 0 def getDateFromCin(): s = input() nums = [int(n) for n in s.split(" ")] return datetime.date(nums[2], nums[1],nums[0]) def testFunc(): testline = input() print (testline + "test") return def cinMain(): returnDate = getDateFromCin() dueDate = getDateFromCin() fine = getFine(dueDate, returnDate) print (fine) def main(): tests() cinMain()