Skip to content

Instantly share code, notes, and snippets.

@rectangletangle
Created June 20, 2015 20:00
Show Gist options
  • Save rectangletangle/393a5938891e95c1707b to your computer and use it in GitHub Desktop.
Save rectangletangle/393a5938891e95c1707b to your computer and use it in GitHub Desktop.
Race Average
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