import math
FUEL_PER_MILE = 2.125
# Function to check if a number is an odd prime
def is_odd_prime( n) :
if n < 2 or n % 2 == 0 :
return False
for i in range ( 3 , int ( math .sqrt ( n) ) + 1 , 2 ) :
if n % i == 0 :
return False
return True
# Function to simulate the trip
def simulate_trip( initial_fuel, print_output= False ) :
fuel = initial_fuel
location = 0
while fuel >= 0 :
if print_output:
print ( "LOCATION: {} FUEL: {:.6f}" .format ( location, fuel) )
if is_odd_prime( location) :
fuel += location # Add fuel at odd prime mile markers
if print_output:
print ( "{} FUEL ADDED AT ODD PRIME MILE MARKER" .format ( location) )
fuel -= FUEL_PER_MILE # Consume fuel per mile
if fuel < 0 :
return location + ( fuel / FUEL_PER_MILE) # Exact stranded location
location += 1
return float ( 'inf' ) # If never stranded, return infinity
# Minimum fuel needed to never get stranded
min_fuel = 6.375
# Verify if 6.375 is enough
result = simulate_trip( min_fuel)
if result == float ( 'inf' ) :
print ( "Minimum starting fuel: {:.6f}" .format ( min_fuel) )
else :
print ( "ERROR: 6.375 is not enough fuel!" )
# Part 2: Simulate with one drop less fuel
stranded_location = simulate_trip( min_fuel - 0.0001 , print_output= True )
print ( "Final stranded location with one drop less fuel: {:.6f}" .format ( stranded_location) )
aW1wb3J0IG1hdGgKCkZVRUxfUEVSX01JTEUgPSAyLjEyNQoKIyBGdW5jdGlvbiB0byBjaGVjayBpZiBhIG51bWJlciBpcyBhbiBvZGQgcHJpbWUKZGVmIGlzX29kZF9wcmltZShuKToKICAgIGlmIG4gPCAyIG9yIG4gJSAyID09IDA6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBmb3IgaSBpbiByYW5nZSgzLCBpbnQobWF0aC5zcXJ0KG4pKSArIDEsIDIpOgogICAgICAgIGlmIG4gJSBpID09IDA6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIFRydWUKCiMgRnVuY3Rpb24gdG8gc2ltdWxhdGUgdGhlIHRyaXAKZGVmIHNpbXVsYXRlX3RyaXAoaW5pdGlhbF9mdWVsLCBwcmludF9vdXRwdXQ9RmFsc2UpOgogICAgZnVlbCA9IGluaXRpYWxfZnVlbAogICAgbG9jYXRpb24gPSAwCgogICAgd2hpbGUgZnVlbCA+PSAwOgogICAgICAgIGlmIHByaW50X291dHB1dDoKICAgICAgICAgICAgcHJpbnQoIkxPQ0FUSU9OOiB7fSAgICBGVUVMOiB7Oi42Zn0iLmZvcm1hdChsb2NhdGlvbiwgZnVlbCkpCgogICAgICAgIGlmIGlzX29kZF9wcmltZShsb2NhdGlvbik6CiAgICAgICAgICAgIGZ1ZWwgKz0gbG9jYXRpb24gICMgQWRkIGZ1ZWwgYXQgb2RkIHByaW1lIG1pbGUgbWFya2VycwogICAgICAgICAgICBpZiBwcmludF9vdXRwdXQ6CiAgICAgICAgICAgICAgICBwcmludCgie30gRlVFTCBBRERFRCBBVCBPREQgUFJJTUUgTUlMRSBNQVJLRVIiLmZvcm1hdChsb2NhdGlvbikpCgogICAgICAgIGZ1ZWwgLT0gRlVFTF9QRVJfTUlMRSAgIyBDb25zdW1lIGZ1ZWwgcGVyIG1pbGUKCiAgICAgICAgaWYgZnVlbCA8IDA6CiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbiArIChmdWVsIC8gRlVFTF9QRVJfTUlMRSkgICMgRXhhY3Qgc3RyYW5kZWQgbG9jYXRpb24KCiAgICAgICAgbG9jYXRpb24gKz0gMQoKICAgIHJldHVybiBmbG9hdCgnaW5mJykgICMgSWYgbmV2ZXIgc3RyYW5kZWQsIHJldHVybiBpbmZpbml0eQoKIyBNaW5pbXVtIGZ1ZWwgbmVlZGVkIHRvIG5ldmVyIGdldCBzdHJhbmRlZAptaW5fZnVlbCA9IDYuMzc1CgojIFZlcmlmeSBpZiA2LjM3NSBpcyBlbm91Z2gKcmVzdWx0ID0gc2ltdWxhdGVfdHJpcChtaW5fZnVlbCkKaWYgcmVzdWx0ID09IGZsb2F0KCdpbmYnKToKICAgIHByaW50KCJNaW5pbXVtIHN0YXJ0aW5nIGZ1ZWw6IHs6LjZmfSIuZm9ybWF0KG1pbl9mdWVsKSkKZWxzZToKICAgIHByaW50KCJFUlJPUjogNi4zNzUgaXMgbm90IGVub3VnaCBmdWVsISIpCgojIFBhcnQgMjogU2ltdWxhdGUgd2l0aCBvbmUgZHJvcCBsZXNzIGZ1ZWwKc3RyYW5kZWRfbG9jYXRpb24gPSBzaW11bGF0ZV90cmlwKG1pbl9mdWVsIC0gMC4wMDAxLCBwcmludF9vdXRwdXQ9VHJ1ZSkKcHJpbnQoIkZpbmFsIHN0cmFuZGVkIGxvY2F0aW9uIHdpdGggb25lIGRyb3AgbGVzcyBmdWVsOiB7Oi42Zn0iLmZvcm1hdChzdHJhbmRlZF9sb2NhdGlvbikpCg==