Você é o capitão de um navio de guerra. O departamento de engenharia cortou os cantos com projetos este ano, para que o navio em que você está tenha a forma de um triângulo simples.
Você sai para o convés e aprecia a brisa do mar ... embora não por muito tempo. Um inimigo atirou em você! - mas o tiro será acertado?
Entrada
Você pode escrever uma função ou um programa completo para esse desafio.
Seu programa terá 11 números inteiros, dez dos quais estão emparelhados:
Os três primeiros pares de números inteiros (x 1 , y 1 ), (x 2 , y 2 ), (x 3 , y 3 ) especificarão os vértices de sua nave. O triângulo formado terá área diferente de zero.
O próximo par de números inteiros (e x , e y ) especifica a localização do canhão do inimigo. O canhão inimigo nunca ficará sobre ou dentro dos limites do seu navio. *
O par (a x , a y ) depois especifica para onde o inimigo mirou. Isso será diferente de (e x , e y ).
O número inteiro positivo final R especifica o alcance do tiro do inimigo
* Você seria um péssimo capitão se nem percebesse isso!
Resultado
Você deve imprimir / retornar um truthy valor (por exemplo, verdadeiro, 1) se o navio de guerra vai ser atingido, caso contrário, um valor Falsas (por exemplo falsa, 0).
O que é um sucesso?
O tiro inimigo é um segmento de linha reta de comprimento R de (e x , e y ) na direção de (a x , a y ). Se esse segmento de linha se sobrepuser a qualquer parte do interior do seu navio de guerra triangular, isso conta como um golpe. Caso contrário, não é um sucesso.
Tiros que pastam ao longo ou atingem apenas o limite do triângulo não contam como acerto.
Exemplos
0 0 0 1 1 0
1 1
0 0
2
Hit: O inimigo disparou através do centro do seu navio!
2 0 0 2 4 4
0 0
1 1
1
Sem acerto: o alcance do inimigo é muito curto, então você está seguro.
0 0 1 2 3 0
-4 0
0 0
8
Sem acerto: o inimigo roçou o lado do seu navio, então isso não conta como acerto. Por sorte!
0 0 -1 3 4 -1
-3 -4
3 4
5
Sem acerto: o tiro inimigo apenas pára antes do navio, então você está seguro. Se o canhão do inimigo tivesse um alcance ainda melhor, você seria atingido! Ufa!
-2 -3 -3 6 7 -2
-6 2
1 -4
7
Sucesso: Mesmo que o tiro não tenha penetrado no outro lado, este ainda é um sucesso.
-3 2 2 -4 7 -3
-3 -4
-3 0
10
Sem sucesso: para o registro, este é outro erro.
Casos de teste adicionais
0 0 6 0 6 8
-6 -8
6 8
20
Sem acerto: este é outro problema, mas em ângulo.
0 0 -2 -5 5 3
-3 4
0 0
6
Golpe: O tiro entrou através de um vértice do navio.
Pontuação
Isso é código-golfe , então o código mais curto em bytes vence. Aplicam-se brechas padrão .
0 0 -1 3 4 -1 -3 -4 3 4 6
.Respostas:
Python 3, 252 bytes
Esta é certamente a maioria das variáveis que eu já usei no código golf. : ^ P
Ligeiramente não-destruído, com comentários:
Como funciona:
Amostras de execuções:
fonte
Python 2.7, 235 bytes
Calcula o produto cruzado
AB x AP
entre os cantos A, B e o ponto P. Se todos os três tiverem o mesmo sinal, o ponto estará dentro do triângulo.Ungolfed:
Testes:
fonte
C, 247 bytes
Definitivamente ainda não jogou golfe.
Atualmente, isso usa uma abordagem semelhante à solução do DLosc, ou seja, itera através de todas as coordenadas possíveis no segmento de linha para determinar se ele se cruza com o triângulo. (Portanto, falhará se o intervalo for superior a 1000) No entanto, ele usa a fórmula de http://mathworld.wolfram.com/TriangleInterior.html para determinar se um ponto está dentro do triângulo. Isso evita várias funções trigonométricas.
Exemplo de verificação, deve ser impresso
1 0 0 0 1 0
.fonte
JavaScript (ES6) 320
448 522 627(Ainda pode ser jogado mais?)
Passos:
Ref:
Interseção do segmento
Ponto dentro do triângulo
Ponto em um segmento dado uma distância
Teste no Firefox
Ungolfed
fonte