De http://en.wikipedia.org/wiki/Triangle :
Escreva um programa que use três tuplas de coordenadas 2D (cartesianas) e classifique o formato que esses três pontos descrevem.
Em quase todos os casos, esses pontos descreverão um triângulo de tipos variados. Em alguns casos degenerados, os pontos descrevem um ponto singular ou uma linha reta. O programa determinará quais das seguintes tags se aplicam à forma descrita:
- Ponto (3 pontos são co-incidentes)
- Linha (3 pontos em uma linha reta - não mais que 2 pontos podem ser co-incidentes)
- Equilateral (3 lados iguais, 3 ângulos iguais)
- Isósceles (2 lados iguais, 2 ângulos iguais)
- Escaleno (0 lados iguais, 0 ângulos iguais)
- Direita (1 ângulo exatamente π / 2 (ou 90 °))
- Oblíquo (0 ângulo exatamente π / 2 (ou 90 °))
- Obtuso (1 ângulo> π / 2 (ou 90 °))
- Agudo (3 ângulos <π / 2 (ou 90 °))
Observe que, para algumas formas descritas, mais de uma das tags acima será aplicada. Por exemplo, qualquer ângulo reto também será isósceles ou escaleno.
Entrada
- O programa pode ler as 3 coordenadas de entrada de STDIN, linha de comando, variáveis de ambiente ou qualquer outro método conveniente para o seu idioma de escolha.
- A entrada coordena minha formatação, mas é conveniente para o seu idioma de escolha. Pode-se supor que todos os números de entrada sejam bem formados com relação aos tipos de dados que você acaba usando.
- Nada pode ser assumido sobre a ordem das coordenadas de entrada.
Saída
- O programa exibirá STDOUT, caixa de diálogo ou qualquer outro método de exibição conveniente para o seu idioma de escolha.
- A saída exibirá todos os tags aplicáveis à forma descrita pelas coordenadas de entrada.
- As tags podem ser exibidas em qualquer ordem.
Outras regras
- As bibliotecas / APIs trigonométricas do seu idioma são permitidas, mas quaisquer APIs que calculam especificamente tipos de triângulo são proibidas.
- Ao determinar a igualdade de ângulos ou comprimentos de lados, você provavelmente acabará comparando valores de ponto flutuante. Dois desses valores devem ser considerados "iguais" se um estiver dentro de 1% do outro.
- “Brechas” padrão que não são mais engraçadas
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Exemplos
Input Output
(1,2) (1,2) (1,2) Point
(1,2) (3,4) (5,6) Line
(0,0) (1,1) (2,0) Isosceles Right
(0,0) (2,1) (10,1) Scalene Oblique Obtuse
Respostas:
C (451 bytes)
Usa apenas comprimentos e inclinações ao quadrado.
Ungolfed (e operador ternário substituído por if / else):
Formato de entrada (através de stdin): xyxyxy
ex. 0 0 1 1 2 0 para Isosceles Right
fonte
./triangle <<< "1 2 1 2 1 2"
deve ser usado, com as aspas.C, 333
Deixei o espaço em branco por enquanto. Isso funciona, mas provavelmente poderia funcionar com algumas tarefas de arrumação e golfe. Matemática semelhante à
@es1024
resposta, mas usa um loop e matrizes. Formato de entradax y x y x y
Variáveis
t[]
armazena a entrada e os quadrados dos comprimentos. No final do programa, ele se parece com a tabela abaixo (aumentar o número de iterações do loop levaria a uma repetição indefinida dos comprimentos quadrados). No início do loop, quadrados de comprimentos (lixo, pois nem todos os dados estão disponíveis ) são desnecessariamente armazenados nas células 1,3 e 5, mas são imediatamente substituídos porscanf.
Dados úteis são gravados emz,b,c
ahds
quandoi
= 9,11,13 (t[i]
et[i-2]
são acessados.)g[]
foi adicionado tarde para manter os valores dx e dy necessários para o cálculo da inclinação. As únicas células usadas são de 6 a 9 (0 a 5 não são confiáveis, pois nem todos os dados estão disponíveis quando são gravados.) Seg[6]/g[7]==g[8]/g[9]
as inclinações de 2 linhas forem iguais e o triângulo for apenas uma linha (ou um ponto). A equação é reorganizado no programa para evitar divisão.r
é um valor intermediário usado para quadraturaz
conta o número de lados do comprimento zero. Ele tem um deslocamento de +3 porque o loop lê 3 células em brancot[]
.c
conta o número de lados de comprimento idêntico. Ele também tem um deslocamento de +3. Observe que o ladoa
é gravadot[]
duas vezes para poder verificar a = b, b = c, c = a.b
é o maior comprimento de um lado ao quadrado.s
é a soma dos quadrados de todos os lados.Observe que comparar comprimentos laterais A ^ 2 + B ^ 2 + C ^ 2 com 2 * B ^ 2 é o mesmo que comparar A ^ 2 + C ^ 2 com B ^ 2 (basta subtrair B ^ 2 de ambos os lados.) se B ^ 2 = A ^ 2 + C ^ 2, é um triângulo retângulo. se B ^ 2 é maior, é obtuso; se menor, é agudo.
fonte
Golfscript (175 bytes)
Você pode testá-lo aqui (conjunto de testes incluído).
Formato de entrada:
Versão comentada:
NOTA:
A razão pela qual meu código não contém saída "equilateral" é porque:
fonte
Mathematica (
313307 caracteres)Golfe:
Ungolfed:
O formato de entrada é uma lista de pontos, sobre os quais a função é chamada:
fonte