from math import acos, sin, cos, radians, floor
RADIUS_MILES = 3963
class Solution:
def __init__ ( self ) :
self .city_map = { }
pass
def handle_location( self , line_arr) :
city = line_arr[ 1 ]
print ( line_arr[ 2 ] , "degree" )
lat_rad = radians( int ( line_arr[ 2 ] ) )
long_rad = radians( int ( line_arr[ 3 ] ) )
self .city_map [ city] = [ lat_rad, long_rad]
def calculate_distance( self , line_arr) :
city_1 = self .city_map [ line_arr[ 1 ] ]
city_2 = self .city_map [ line_arr[ 2 ] ]
abs_long_dif = abs ( city_1[ 2 ] -city_2[ 2 ] )
sin_pro = sin( city_1[ 0 ] ) *sin( city_2[ 0 ] )
cos_pro = cos( city_1[ 0 ] ) *cos( city_2[ 0 ] ) *abs_long_dif
distance = floor( RADIUS_MILES*acos( sin_pro+cos_pro) )
return ":" .join ( line_arr[ 1 :] +[ distance] )
def process( self , line) :
line_arr = line.split ( ":" )
if ( line_arr[ 0 ] == "LOC" ) :
self .handle_location ( line_arr)
return line_arr[ 1 ]
else :
return self .calculate_distance ( line_arr)
pass
sol = Solution( )
print ( sol.process ( "LOC:CHI:41.836944:-87.684722" ) )
print ( sol.process ( "LOC:NYC:40.7127:-74.0059" ) )
print ( sol.process ( "TRIP:C0FFEE1C:CHI:NYC" ) )
ZnJvbSBtYXRoIGltcG9ydCBhY29zLCBzaW4sIGNvcywgcmFkaWFucywgZmxvb3IKUkFESVVTX01JTEVTID0gMzk2MwoKY2xhc3MgU29sdXRpb246CglkZWYgX19pbml0X18oc2VsZik6CgkJc2VsZi5jaXR5X21hcCA9IHt9CgkJcGFzcwoJCglkZWYgaGFuZGxlX2xvY2F0aW9uKHNlbGYsIGxpbmVfYXJyKToKCQljaXR5ID0gbGluZV9hcnJbMV0KCQlwcmludChsaW5lX2FyclsyXSwiZGVncmVlIikKCQlsYXRfcmFkID0gcmFkaWFucyhpbnQobGluZV9hcnJbMl0pKQoJCWxvbmdfcmFkID0gcmFkaWFucyhpbnQobGluZV9hcnJbM10pKQoJCXNlbGYuY2l0eV9tYXBbY2l0eV0gPSBbbGF0X3JhZCxsb25nX3JhZF0KCQkKCWRlZiBjYWxjdWxhdGVfZGlzdGFuY2Uoc2VsZixsaW5lX2Fycik6CgkJY2l0eV8xID0gc2VsZi5jaXR5X21hcFtsaW5lX2FyclsxXV0KCQljaXR5XzIgPSBzZWxmLmNpdHlfbWFwW2xpbmVfYXJyWzJdXQoJCWFic19sb25nX2RpZiA9IGFicyhjaXR5XzFbMl0tY2l0eV8yWzJdKQoJCXNpbl9wcm8gPSBzaW4oY2l0eV8xWzBdKSpzaW4oY2l0eV8yWzBdKQoJCWNvc19wcm8gPSBjb3MoY2l0eV8xWzBdKSpjb3MoY2l0eV8yWzBdKSphYnNfbG9uZ19kaWYKCQlkaXN0YW5jZSA9IGZsb29yKFJBRElVU19NSUxFUyphY29zKHNpbl9wcm8rY29zX3BybykpCgkJcmV0dXJuICI6Ii5qb2luKGxpbmVfYXJyWzE6XStbZGlzdGFuY2VdKQoJCQoJCQoJZGVmIHByb2Nlc3Moc2VsZixsaW5lKToKCQlsaW5lX2FyciA9IGxpbmUuc3BsaXQoIjoiKQoJCWlmKGxpbmVfYXJyWzBdID09ICJMT0MiKToKCQkJc2VsZi5oYW5kbGVfbG9jYXRpb24obGluZV9hcnIpCgkJCXJldHVybiBsaW5lX2FyclsxXQoJCWVsc2U6CgkJCXJldHVybiBzZWxmLmNhbGN1bGF0ZV9kaXN0YW5jZShsaW5lX2FycikKCQlwYXNzCgpzb2wgPSBTb2x1dGlvbigpCnByaW50KHNvbC5wcm9jZXNzKCJMT0M6Q0hJOjQxLjgzNjk0NDotODcuNjg0NzIyIikpCnByaW50KHNvbC5wcm9jZXNzKCJMT0M6TllDOjQwLjcxMjc6LTc0LjAwNTkiKSkKcHJpbnQoc29sLnByb2Nlc3MoIlRSSVA6QzBGRkVFMUM6Q0hJOk5ZQyIpKQo=