Hora de desenterrar suas notas antigas de trigonometria do ensino médio! O desafio é resolver os lados e ângulos desconhecidos de diferentes triângulos. E como é habitual no código de golfe, o menor código de trabalho vence.
Este não é um problema trivial; minha implementação de referência em python atualmente tem 838 837 caracteres, mas tenho certeza de que você poderá usar soluções muito menores.
Além disso, se você estiver preso, esta seção da Wikipedia deve ajudá-lo: Triângulo: Computando os lados e os ângulos .
Entrada
O triângulo a seguir mostra os nomes dos lados e ângulos usados neste desafio. Observe que os lados são minúsculos e os ângulos são maiúsculos.
A entrada é fornecida como seis valores separados por espaço, stdin
como argumentos de linha de comando ou (sua escolha). Os seis valores correspondem aos lados a, b, c
e ângulos A, B, C
. Os lados desconhecidos são dados como pontos de interrogação ( ?
). Os ângulos de entrada e saída devem estar em radianos. Você pode assumir que os valores de entrada estão corretos (não é necessário validar nada). Você também pode assumir que o triângulo de entrada não é degenerado e que todos os lados e ângulos são diferentes de zero.
A entrada de exemplo a seguir informa que lado a
é 8
, lado b
é 12
e ângulo A
é 0.5
radianos:
8 12 ? 0.5 ? ?
Resultado
A saída é fornecida no mesmo formato da entrada - seis números separados por espaço ativados stdout
. A única exceção é quando não é possível resolver o triângulo de entrada - a sequência "No solution"
deve ser gravada stdout
. Se duas soluções são possíveis, ambas são produzidas com uma nova linha entre elas.
A seguir, é apresentada a saída da entrada acima:
8.0 12.0 16.0899264342 0.5 0.802561439714 1.83903121388
8.0 12.0 4.97205505116 0.5 2.33903121388 0.302561439714
A saída não é necessária para ter muita precisão, mas pelo menos algumas casas decimais são necessárias.
Regras
- A entrada é lida
stdin
ou argumentos de linha de comando - A saída é gravada em
stdout
- Se duas soluções são possíveis com a entrada fornecida, produza
- Se houver pouca informação para obter uma ou duas soluções claras, considere um
"No solution"
caso - Nenhum código embutido ou pré-existente pode ser usado (é claro que você pode usar funções trigonométricas, mas não "
solveTriangle
" ou coisa parecida) - O código mais curto vence
Casos de teste
Dentro 3 4 5 ? ? ?
Fora 3.0 4.0 5.0 0.643501108793 0.927295218002 1.57079630572
Dentro ? 4 ? 0.64 0.92 1.57
Fora 3.00248479301 4.0 5.02764025486 0.64 0.92 1.57
Dentro ? ? 5 ? 0.92 ?
Fora No solution
Dentro ? ? 5 ? 0.92 1.57
Fora 3.03226857833 3.97800936148 5.0 0.65159265359 0.92 1.57
Dentro 8 12 ? 0.5 ? ?
Fora (duas soluções)
8.0 12.0 16.0899264342 0.5 0.802561439714 1.83903121388
8.0 12.0 4.97205505116 0.5 2.33903121388 0.302561439714
Dentro 8 12 ? ? .5 ?
Fora 8.0 12.0 18.3912222133 0.325325285223 0.5 2.31626736837
Boa sorte!
fonte
Respostas:
Python, 441 caracteres
Seu trigonométrico típico calcula a resposta. As soluções possíveis atuais são armazenadas como tuplas em V. Quaisquer valores desconhecidos são registrados como 0. Uma sétima variável R é o valor
a/sin(A)==b/sin(B)==c/sin(C)
.Eu uso um truque em que os valores a / b / c são alternados a cada iteração para evitar muita lógica redundante. O loop interno precisa apenas calcular valores do lado ou ângulo A.
fonte
8 12 ? ? .5 ?
.if a
comif not a
e achatar as condicionais para um nível.Plain C,
565555530 caracteresC não é o melhor idioma para o Code Golf, eu acho, então é só por diversão.
Compilado com
cc -o trig trig.c -lm
. Lê a entrada como argumentos da linha de comando.fonte
8 12 ? ? .5 ?
- eu a adicionei como um caso de teste adicional no OP.Perl - 412 caracteres
Como one-liner perl, baseado na solução Python de Keith Randall:
Aqui de uma forma mais legível:
fonte