#! /usr/bin/env python # -*- coding: utf-8 -*- # Munter Time Calculation # # Rudimentary program written by ALV to implement the Munter time calculation import sys import argparse class InvalidUnitsException(Exception): pass rates = { 'uphill': { 'rate': 4, 'direction': '↑' }, 'flat': { 'rate': 6, 'direction': '→' }, # or downhill on foot 'downhill': { 'rate': 10, 'direction': '↓' }, 'bushwhacking': { 'rate': 2, 'direction': '↹' }, } unit_choices = ['metric', 'imperial'] travel_mode_choices = rates.keys() def munter(distance, elevation, rate, units): retval = {} if units not in unit_choices: raise InvalidUnitsException unit_count = 0 if 'imperial' == units: # convert to metric distance = (distance * 1.609) # mi to km elevation = (elevation * .305) # ft to m unit_count = distance + (elevation / 100.0) retval['time'] = (distance + (elevation / 100.0)) / rates[rate]['rate'] retval['unit_count'] = unit_count retval['direction'] = rates[rate]['direction'] retval['pace'] = rates[rate]['rate'] return retval def main(): parser = argparse.ArgumentParser(description='Munter Time Calculation') parser.add_argument('--distance', '-d', type=float, required=True, help='Distance (in km, by default)') parser.add_argument('--elevation', '-e', type=float, required=True, help='Elevation change (in m, by default)') parser.add_argument('--travel-mode', '-t', type=str, default='uphill', choices=travel_mode_choices, required=False, help='Travel mode (flat, by default)') parser.add_argument('--units', '-u', type=str, default='imperial', required=False, choices=unit_choices, help='Units of input values') opts = parser.parse_args() distance = opts.distance elevation = opts.elevation units = opts.units travel_mode = opts.travel_mode time_calc = munter(distance, elevation, travel_mode, units=units) hours = int(time_calc['time']) minutes = int((time_calc['time'] - hours) * 60) print("\n\t╒═══════════════════════════════╕") print("\t╎▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒╎╮") print("\t╎▒{:^29}▒╎│".format('')) print("\t╎▒{pace_readable:^31}▒╎│".format( pace_readable="{units} {direction} @ {pace}".format( units=round(time_calc['unit_count']), direction=time_calc['direction'], pace=time_calc['pace']))) print("\t╎▒{human_time:^29}▒╎│".format( human_time="{hours} hours {minutes} minutes".format( hours=hours, minutes=minutes))) print("\t╎▒{:^29}▒╎│".format('')) print("\t╎▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒╎│") print("\t╘═══════════════════════════════╛│") print("\t └───────────────────────────────┘\n") if __name__ == "__main__": main()