En este código de golf, tendrá que determinar la dirección del tiro más corto que golpea exactamente n cojines antes de caer en un bolsillo.
La mesa de billar es una mesa de billar de 6 bolsillos con las siguientes características:
- Las dimensiones son variables ( a x b )
- Sin fricción: la pelota rodará para siempre hasta que caiga en un bolsillo
- Los bolsillos y los tamaños de las bolas son casi cero. Esto significa que la pelota caerá en el bolsillo solo si tienen la misma posición.
- La pelota se coloca en el hoyo inferior izquierdo al principio (pero no cae dentro)
Cree un programa o función completa que tome las dimensiones ( a , b ) de la tabla y el número de cojines para golpear n como entrada y devuelva el ángulo en grados del camino más corto que golpea exactamente n cojines antes de caer en un bolsillo.
- a > 0
- b > 0
- 0 <= n <10000000
- Precisión 0 < alfa <90 (en grados): al menos 10 ^ -6
ejemplos:
con a = 2, b = 1, n = 1 hay tres caminos posibles: (1) (2) (3) en la siguiente figura. el número (1) es el más corto, por lo que la salida debe ser atan (2) = 63.43494882292201 grados
La solución para a = 2, b = 1, n = 4 es atan (4/3) = 53.13010235415598 grados
muestras de prueba :
a = 2, b = 1, n = 1, -> alpha = 63.43494882292201
a = 2, b = 1, n = 2, -> alpha = 71.56505117707799
a = 2, b = 1, n = 3, -> alpha = 75.96375653207353
a = 2, b = 1, n = 4, -> alpha = 53.13010235415598
a = 2, b = 1, n = 5, -> alpha = 59.03624346792648
a = 2, b = 1, n = 6, -> alpha = 81.86989764584403
a = 4.76, b = 3.64, n = 27, -> alpha = 48.503531644784466
a = 2, b = 1, n = 6, -> alpha = 81.86989764584403
a = 8, b = 3, n = 33, -> alpha = 73.24425107080101
a = 43, b = 21, n = 10005, -> alpha = 63.97789961246943
Este es el código / billar golf: ¡el código más corto gana!
n
cojines, o al menosn
cojines?Respuestas:
Python 2.7,
352344281 bytesExplicación: en lugar de calcular los golpes de los cojines, agrego n tablas y tomo los nuevos agujeros como válidos: el borde negro / agujeros es el original, el borde verde / agujeros es válido para n = 1, el borde rojo / agujeros es válido para n = 2 y así sucesivamente. Luego elimino los agujeros no válidos (por ejemplo, la flecha azul para n = 1). Tendré una lista de agujeros válidos y sus coordenadas, luego calcularé su distancia desde el punto inicial y luego el ángulo de la distancia más pequeña.
Notas:
a = 4.76, b = 3.64, n = 27 - dé 52.66286, tratando de averiguar por qué secorrigió y guardó 8 bytes en el proceso = Da = 43, b = 21, n = 10005 - toma ~ 80 segundos ( pero da el ángulo correcto)
versión legible:
fuente
: degrees
b < a
. Eso podría solucionarse fácilmente obteniendo el mínimo / máximo dea
yb
sin embargo.Haskell,
133117bytesEsta es mi implementación:
Con una tabla 2x1, una ruta alcanzará exactamente n cojines antes de entrar en un bolsillo si: (x-1) / 2 + (y-1) == ny x, y son primos mutuos. donde x, y son la distancia de la pelota sobre ejes horizontales / verticales.
Las rutas son las mismas con un tamaño de tabla arbitrario, por lo que solo tenemos que actualizar longitudes y ángulos con (a, b) y mantener el más corto. La longitud del camino es sqrt ((x * a / 2) ^ 2 + (y * b) ^ 2) y el ángulo es atan ((y * b) / (x * a / 2))
fuente