Determine se um triângulo é equilateral, isosceles ou scalene.
Um triângulo equilateral tem os três lados com o mesmo comprimento.
Um triângulo isosceles tem pelo menos dois lados com o mesmo comprimento. (Às vezes é definido como tendo exatamente dois lados com o mesmo comprimento, mas, para os fins deste exercício, vamos dizer pelo menos dois.)
Um triângulo scalene tem todos os lados com comprimentos diferentes.
Para uma forma ser um triângulo, todos os lados precisam ter comprimento > 0, e a soma dos comprimentos de dois lados quaisquer deve ser maior ou igual ao comprimento do terceiro lado.
Triângulos degenerados são triângulos em que a soma do comprimento de dois lados é igual ao comprimento do terceiro lado, por exemplo 1, 1, 2.
Optamos por não incluir testes para triângulos degenerados neste exercício.
Você pode lidar com essas situações se quiser, ou simplesmente ignorá-las.
Em equações:
Sejam a, b e c os lados do triângulo.
Então as três expressões a seguir precisam ser verdadeiras:
a + b ≥ c
b + c ≥ a
a + c ≥ b
A implementação disso pode assumir muitas formas. Aqui estão alguns tópicos que podem ajudar você, dependendo da abordagem que você escolher.
Ou talvez você encontre uma abordagem que não use nada disso!
O exercício base testa a identificação de triângulos cujos lados são todos números inteiros. No entanto, alguns triângulos não podem ser representados apenas por números inteiros. Um exemplo simples é um triângulo com um ângulo de 90 graus entre dois lados iguais de comprimento 1. Seu terceiro lado tem comprimento igual à raiz quadrada de 2, que é um número irracional (ou seja, não pode ser escrito como um número inteiro nem como uma fração).
Seria entediante reescrever as funções de análise para lidar tanto com casos de números inteiros quanto de ponto flutuante, e particularmente entediante fazer isso para todos os tipos possíveis de inteiros e de ponto flutuante: considerando as variantes com sinal e sem sinal de 8, 16, 32, 64 e 128 bits, seriam 10 reimplementações de um código fundamentalmente igual, antes mesmo de considerar os números de ponto flutuante!
Existe uma forma melhor: genéricos. Ao reescrever seu Triangle como um Triangle<T>, você pode escrever seu código uma única vez e deixar para o compilador o trabalho de gerar todas essas especializações. Repare que, para usar operações matemáticas, você precisa restringir seu tipo genérico a tipos que suportem essas operações, usando traits.
Existem alguns testes bônus que você pode rodar para testar sua implementação com números de ponto flutuante. Para habilitá-los, rode seus testes com a flag de recurso generic, assim:
cargo test --features generic
Crie sua conta no Exercism para aprender e dominar Rust com 99 exercícios e mentoria humana de verdade, tudo de graça.