Files
pyDefis/Mario s'entraîne pour les jeux olympiques d'hiver.py

61 lines
1.8 KiB
Python

import datetime
input = open("trace_mario.txt").read()
# input = open("trace_mario_example.txt").read()
input = input.splitlines()
def conpute_distance(pos1, pos2):
"""from math import radians, cos, sin, asin, sqrt
# convert decimal degrees to radians
lon1, lat1, lon2, lat2 = map(radians, [pos1["long"], pos1["lat"], pos2["long"], pos2["lat"]])
# haversine formula
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
r = 6371 # Radius of earth in kilometers. Use 3956 for miles. Determines return value units.
dalt = pos2["alt"] - pos1["alt"]
return sqrt((c * r )**2 + dalt**2) * 1000"""
from math import pi, cos, sqrt
r = 6371 * 1000
dlat = pos2["lat"] - pos1["lat"]
dlong = pos2["long"] - pos1["long"]
dist_lat = (2 * pi * r) / 360 * dlat
dist_long = (2 * pi * r * cos((pos1["lat"] + pos1["lat"])/2/360*2*pi)) / 360 * dlong
dist_alt = pos2["alt"] - pos1["alt"]
return sqrt((dist_lat**2+dist_long**2)+dist_alt**2)
data = []
for line in input:
lat, long, alt, horodate = line.split(" ")
data.append({"lat":float(lat), "long":float(long), "alt":float(alt), "time":datetime.datetime.strptime(horodate, "%H:%M:%S")})
distance = 0
duree = datetime.datetime.min
montee_descente = "M" #Montée par défaut
for i in range(1, len(data)):
#Check altitude
if data[i]["alt"] < data[i-1]["alt"]:
montee_descente = "D"
elif data[i]["alt"] > data[i-1]["alt"]:
montee_descente = "M"
#If descente
if montee_descente == "D":
duree = duree + (data[i]["time"] - data[i-1]["time"])
distance = distance + conpute_distance(data[i], data[i-1])
duree = duree - datetime.datetime.min
print(distance, distance/duree.total_seconds())