Determina 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. (Por vezes, é definido como tendo exatamente dois lados com o mesmo comprimento, mas, para os objetivos deste exercício, vamos considerar pelo menos dois.)
Um triângulo scalene tem todos os lados com comprimentos diferentes.
Para que uma forma seja sequer um triângulo, todos os lados têm de ter comprimento > 0, e a soma dos comprimentos de dois lados quaisquer tem de ser maior ou igual ao comprimento do terceiro lado.
Os 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.
Optámos por não incluir testes para triângulos degenerados neste exercício.
Podes tratar dessas situações, se quiseres, ou simplesmente ignorá-las.
Em equações:
Sejam a, b e c os lados do triângulo.
Então, as três expressões seguintes têm de ser verdadeiras:
a + b ≥ c
b + c ≥ a
a + c ≥ b
A implementação disto pode assumir muitas formas. Aqui ficam alguns tópicos que te podem ajudar, dependendo da abordagem que seguires.
Ou talvez encontres uma abordagem que não usa nada disto!
O exercício base testa a identificação de triângulos cujos lados são todos números inteiros. No entanto, há triângulos que não podem ser representados apenas com números inteiros. Um exemplo simples é um triângulo com um ângulo de 90 graus entre dois lados iguais de comprimento 1. O terceiro lado tem o comprimento da 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).
Reescrever as funções de análise para lidar tanto com inteiros como com números de vírgula flutuante seria tedioso, e particularmente tedioso fazê-lo para todos os tipos possíveis de inteiros e de vírgula flutuante: com variantes com sinal e sem sinal de 8, 16, 32, 64 e 128 bits, seriam 10 reimplementações de um código fundamentalmente igual, e isto antes mesmo de pensar nos números de vírgula flutuante!
Há uma forma melhor: os genéricos. Ao reescreveres o teu Triangle como um Triangle<T>, escreves o código uma só vez e entregas ao compilador o trabalho de gerar todas essas especializações. Repara que, para usares operações matemáticas, tens de restringir o teu tipo genérico a tipos que suportem essas operações através de traits.
Há alguns testes extra que podes correr para testar a tua implementação com números de vírgula flutuante. Para os ativares, corre os testes com a flag de funcionalidade generic, assim:
cargo test --features generic
Inscreve-te no Exercism para aprenderes e dominares Rust com 99 exercícios, e mentoria humana real, tudo grátis.