mirror of
https://github.com/Oxbian/CodingGame.git
synced 2025-06-15 09:58:01 +02:00
120 lines
4.3 KiB
Python
120 lines
4.3 KiB
Python
import sys
|
|
import math
|
|
|
|
def distance_pos(pos1, pos2):
|
|
return math.sqrt((pos1[0] - pos2[0])**2 + (pos1[1] - pos2[1])**2)
|
|
|
|
def distance_point (pt1, pt2):
|
|
return pt1 - pt2
|
|
|
|
def target_dir(x, land_x):
|
|
return 1 if (x > land_x) else -1
|
|
|
|
def check_direction_speed(h_speed):
|
|
return -1 if (h_speed < 0) else 1
|
|
|
|
surface_n = int(input()) # the number of points used to draw the surface of Mars.
|
|
prev_x, prev_y, land_x, land_y = 0, 0, 1, 1
|
|
for i in range(surface_n):
|
|
prev_x, prev_y = land_x, land_y
|
|
land_x, land_y = [int(j) for j in input().split()]
|
|
if land_y == prev_y:
|
|
landing_x = (prev_x, land_x)
|
|
landing_y = land_y
|
|
|
|
target = ((landing_x[0] + landing_x[1]) // 2, landing_y)
|
|
print("Target:", target, file=sys.stderr)
|
|
|
|
#Constants
|
|
g = 3.711
|
|
pi = math.pi
|
|
start_dist_x = -1
|
|
start_h_speed = -1
|
|
start_v_speed = -1
|
|
starting_calc = True
|
|
counter_start_motion = False # Used to indicate whether we need to counter the starting velocity
|
|
landing = False # Indicates whether landing phase is live
|
|
movement = False # Indicates whether movement phase is live
|
|
|
|
# game loop
|
|
while True:
|
|
# h_speed: the horizontal speed (in m/s), can be negative.
|
|
# v_speed: the vertical speed (in m/s), can be negative.
|
|
# fuel: the quantity of remaining fuel in liters.
|
|
# rotate: the rotation angle in degrees (-90 to 90).
|
|
# acc: the thrust power (0 to 4).
|
|
x, y, h_speed, v_speed, fuel, rotate, acc = [int(i) for i in input().split()]
|
|
|
|
dist_x = distance_point(x, target[0])
|
|
acc_h = acc * math.sin(rotate * (pi / 180)) #Accélération horizontale = current accélération * sin(rotate in rad)
|
|
acc_v = (acc * math.cos(rotate * (pi / 180))) - g #Accélération verticale = current accélération * cos(rotate in rad) - g
|
|
|
|
# Starting calculations
|
|
if starting_calc:
|
|
# Starting values
|
|
start_dist_x = abs(distance_point(x, target[0]))
|
|
start_h_speed = h_speed
|
|
start_v_speed = v_speed
|
|
# Target values
|
|
tar_acc_h = (start_h_speed ** 2) / (2 * start_dist_x) # Horizontal acc when taking into account starting speed
|
|
try:
|
|
tar_time = (2 * start_dist_x) // (start_h_speed)
|
|
except:
|
|
pass
|
|
if abs(tar_acc_h) < 2 and start_h_speed != 0:
|
|
print(0, 4)
|
|
continue
|
|
starting_calc = False # We're done with the calculations
|
|
if start_h_speed != 0:
|
|
counter_start_motion = True
|
|
else:
|
|
movement = True
|
|
turn = (x + target[0]) // 2
|
|
# 3 stages (movement, stabilize, landing)
|
|
# Check what the starting velocity is (can be not_moving or moving)
|
|
# You will want to initiate movement phase or stabilize phase depending on the start
|
|
if counter_start_motion is True:
|
|
thrust = 4 # Fixing one variable
|
|
direction = check_direction_speed(start_h_speed) # Counters motion
|
|
rotate_to = direction * (int(math.asin(tar_acc_h / thrust) * 180 / pi) + 2)
|
|
if v_speed > 0:
|
|
thrust = 2
|
|
if abs(h_speed) < 2:
|
|
rotate_to = 0
|
|
counter_start_motion = False # We have stabilized
|
|
# Now we have to check whether we're clear to land
|
|
# Or maybe we need to move more towards the zone
|
|
if landing_x[0] < x < landing_x[1]: # We're in the zone
|
|
landing = True
|
|
else: # We overshot the zone or we hit the brakes too fast
|
|
movement = True
|
|
turn = (x + target[0]) // 2
|
|
# Now comes the movement
|
|
if movement is True:
|
|
thrust = 4
|
|
if x < turn:
|
|
rotate_to = -30
|
|
elif x >= turn:
|
|
rotate_to = 30
|
|
|
|
if landing_x[0] < x < landing_x[1] and abs(h_speed) < 2:
|
|
movement = False
|
|
landing = True
|
|
mov_dir = -1
|
|
rotate_to = 0
|
|
|
|
# We can try doing the landing procedure now
|
|
if landing is True:
|
|
if abs(v_speed) < 36:
|
|
thrust = 2
|
|
else:
|
|
thrust = 4
|
|
|
|
# Control board
|
|
print('Current Target is {}'.format(target), file=sys.stderr)
|
|
print('Starting distance to land is', start_dist_x, file=sys.stderr)
|
|
print('Horizontal acceleration is {}'.format(acc_h), file=sys.stderr)
|
|
print('Vertical acceleration is {}'.format(acc_v), file=sys.stderr)
|
|
print('Distance to flat surface is ', dist_x, file=sys.stderr)
|
|
|
|
print(rotate_to, thrust) |