Este es un hoyo de mini golf:
El límite exterior es un círculo con radio 10 y centro (0,0). El límite interior es un círculo con radio 3 y centro (0,5). El tee está en (0, -8). Suponga que la pelota es solo un punto con radio 0.
La dinámica de la pelota se rige por las siguientes reglas:
La pelota es golpeada inicialmente con energía 50 y con un ángulo dado.
- El ángulo está en disminución en el sistema de coordenadas cartesianas, por lo que 0 ° significa directamente a la derecha, 90 ° está directamente hacia arriba, y así sucesivamente.
Cuando la pelota golpea el borde del círculo interno o externo, rebota del círculo usando la ley de la reflexión.
La pelota pierde energía a medida que se mueve.
Por cada unidad de tierra que cubre, pierde 1 unidad de energía.
Cada vez que rebota en una pared pierde 5 unidades de energía.
La pelota se detiene cuando se queda sin energía o cuando cae en el hoyo.
Si la pelota golpea una pared con <= 5 unidades de energía, se detiene.
Cae en el hoyo si tiene energía <10 cuando está dentro de la distancia 1 del hoyo; de lo contrario, sigue moviéndose.
Desafío
Dadas las coordenadas xy de un hoyo, devuelve un ángulo en el que puedas golpear la pelota para que la pelota caiga en el hoyo (si existe ese ángulo).
Entrada
Tome como entrada las coordenadas x e y del centro del agujero en cualquier forma conveniente. La entrada puede tomarse de STDIN (o la alternativa más cercana), parámetros de línea de comando o argumentos de función.
Salida
Imprima o regrese un ángulo en grados en el que la pelota pueda ser golpeada desde el tee de manera que la pelota caiga en el hoyo. Si existe tal ángulo, la salida debe estar en el rango [0, 360), de lo contrario, la salida debe ser -1.
Respuestas:
C,
415430EDITAR: Como mencionó @Winny, los valores de salida superiores a 255 no son posibles, por lo que tuve que aumentar el tamaño de este código para imprimir valores de hasta 360.
Asume 2 (y solo 2) entradas de línea de comando (xy) como ints. La respuesta en grados se imprime o -1 si no existe ningún grado.
Ex.
Golfista por primera vez; probablemente podría mejorarse bastante. Si necesitamos tener más precisión, tengo una versión que toma xy y devuelve el ángulo con dobles trabajando con precisión de .01 grados en 449 caracteres.
Versión legible:
fuente
exit(code)
. Probado en Linux y FreeBSD a través deecho 'int main(){return 300;}' > test.c && cc test.c && ./a.out; echo $?
.