Eres el capitán de un acorazado. El departamento de ingeniería ha estado cortando esquinas con diseños este año, por lo que el barco en el que estás toma la forma de un triángulo simple.
Sales a la terraza y disfrutas de la brisa marina ... aunque no por mucho tiempo. ¡Un enemigo te ha disparado! - ¿Pero el tiro golpeará?
Entrada
Puede escribir una función o un programa completo para este desafío.
Su programa tomará 11 enteros, diez de los cuales están emparejados:
Los primeros tres pares de enteros (x 1 , y 1 ), (x 2 , y 2 ), (x 3 , y 3 ) especificarán los vértices de tu nave. El triángulo formado tendrá un área distinta de cero.
El siguiente par de enteros (e x , e y ) especifica la ubicación del cañón del enemigo. El cañón enemigo nunca estará sobre, o dentro de los límites de tu nave. *
El par (a x , a y ) después de eso especifica dónde apuntó el enemigo. Esto será distinto de (e x , e y ).
El número entero positivo final R especifica el alcance del disparo del enemigo.
* ¡Serías un capitán terrible si ni siquiera te dieras cuenta de que eso está sucediendo!
Salida
Debe imprimir / devolver un Truthy valor (por ejemplo verdadera, 1) si el acorazado se verán afectados, de lo contrario un valor Falsy (por ejemplo falsa, 0).
¿Qué es un hit?
El disparo enemigo es un segmento de línea recta de longitud R desde (e x , e y ) en la dirección de (a x , a y ). Si este segmento de línea se superpone a cualquier parte del interior de su acorazado triangular, entonces esto cuenta como un golpe. De lo contrario, no es un éxito.
Los disparos que pastan o solo alcanzan el límite del triángulo no cuentan como un golpe.
Ejemplos
0 0 0 1 1 0
1 1
0 0
2
Golpe: ¡ El enemigo ha disparado a través del centro de tu nave!
2 0 0 2 4 4
0 0
1 1
1
Ningún golpe: el alcance del enemigo es demasiado corto, por lo que estás a salvo.
0 0 1 2 3 0
-4 0
0 0
8
Sin golpe: el enemigo ha rozado el costado de su nave, por lo que esto no cuenta como un golpe. ¡Suerte!
0 0 -1 3 4 -1
-3 -4
3 4
5
Ningún golpe: el disparo enemigo simplemente se detiene cerca de la nave, por lo que estás a salvo. Si el cañón del enemigo tuviera un alcance incluso ligeramente mejor, ¡entonces habrías sido golpeado! ¡Uf!
-2 -3 -3 6 7 -2
-6 2
1 -4
7
Golpe: Aunque el disparo no penetró al otro lado, sigue siendo un golpe.
-3 2 2 -4 7 -3
-3 -4
-3 0
10
Sin éxito: para el registro, esta es otra falta cercana.
Casos de prueba adicionales
0 0 6 0 6 8
-6 -8
6 8
20
Ningún golpe: esta es otra pasta, pero en ángulo.
0 0 -2 -5 5 3
-3 4
0 0
6
Impacto: el disparo ingresado a través de un vértice de la nave.
Puntuación
Este es el código de golf , por lo que gana el código más corto en bytes. Se aplican lagunas estándar .
0 0 -1 3 4 -1 -3 -4 3 4 6
.Respuestas:
Python 3, 252 bytes
Esta es ciertamente la mayoría de las variables que he usado en el golf de código. : ^ P
Ligeramente descamados, con comentarios:
Cómo funciona:
Ejecuciones de muestra:
fuente
Python 2.7, 235 bytes
Calcula el producto cruzado
AB x AP
entre las esquinas A, B y el punto P. Si los tres tienen el mismo signo, entonces el punto está dentro del triángulo.Sin golf:
Pruebas:
fuente
C, 247 bytes
Definitivamente no del todo golfizado todavía.
Actualmente, esto utiliza un enfoque similar a la solución de DLosc, es decir, recorre todas las coordenadas posibles en el segmento de línea para determinar si se cruza con el triángulo. (Por lo tanto, fallará si el rango es superior a 1000) Sin embargo, utiliza la fórmula de http://mathworld.wolfram.com/TriangleInterior.html para determinar si un punto está dentro del triángulo. Esto evita un montón de funciones trigonométricas.
Ejemplo de verificación, debe imprimir
1 0 0 0 1 0
.fuente
JavaScript (ES6) 320
448 522 627(¿Todavía se puede jugar más al golf?)
Pasos:
Ref:
intersección del segmento
Punto dentro del triángulo
Punto en un segmento dada una distancia
Prueba en Firefox
Sin golf
fuente