Created
June 20, 2015 20:00
-
-
Save rectangletangle/393a5938891e95c1707b to your computer and use it in GitHub Desktop.
Race Average
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import datetime | |
import time | |
import re | |
def stringToTimedelta(string): | |
try: | |
timestring, daystring = string.lower().split(',') | |
day = int(re.search(r'day (\d+)', daystring).group(1)) | |
t = time.strptime(timestring, '%I:%M %p') | |
except (AttributeError, ValueError): | |
raise ValueError('Invalid time format') | |
else: | |
return datetime.timedelta(days=day, | |
hours=t.tm_hour, | |
minutes=t.tm_min) | |
class RaceAverage(object): | |
def __init__(self, finishes, start='8:00 AM, DAY 1'): | |
self.finishTimeStrings = finishes | |
self.startTimeString = start | |
def _timesAsDeltas(self): | |
startDelta = stringToTimedelta(self.startTimeString) | |
finishDeltas = [stringToTimedelta(t) | |
for t in self.finishTimeStrings] | |
return (startDelta, finishDeltas) | |
# camelCase is ugly in Python | |
def avgMinutes(self): | |
start, deltas = self._timesAsDeltas() | |
diffs = [(delta - start).total_seconds() / 60 | |
for delta in deltas] | |
try: | |
avg = int(round(sum(diffs) / float(len(diffs)))) | |
except ZeroDivisionError: | |
raise ValueError('There must be at least one finish time in order to get an average.') | |
else: | |
assert avg >= 0 | |
return avg | |
if __name__ == '__main__': | |
assert stringToTimedelta('8:00 AM, DAY 1') == datetime.timedelta(days=1, hours=8, minutes=0) | |
assert stringToTimedelta('2:12 PM, DAY 3') == datetime.timedelta(days=3, hours=14, minutes=12) | |
assert RaceAverage(['12:00 PM, DAY 1', '12:01 PM, DAY 1']).avgMinutes() == 241 | |
assert RaceAverage(['12:00 AM, DAY 2']).avgMinutes() == 960 | |
assert RaceAverage(['02:00 PM, DAY 19', '02:00 PM, DAY 20', '01:58 PM, DAY 20']).avgMinutes() == 27239 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment