¡Es hora de desenterrar tus viejas notas de trigonometría de la escuela secundaria! El desafío es resolver los lados y ángulos desconocidos de diferentes triángulos. Y como es habitual en el código de golf, gana el código de trabajo más pequeño.
Este no es un problema trivial; mi implementación de referencia en python actualmente se reduce a 838 837 caracteres, pero estoy seguro de que podrás encontrar soluciones de golf mucho más pequeñas.
Además, si está atascado, esta sección en Wikipedia debería ayudarlo: Triángulo: Calcular los lados y los ángulos .
Entrada
El siguiente triángulo muestra los nombres de los lados y ángulos utilizados en este desafío. Tenga en cuenta que los lados son minúsculas y los ángulos son mayúsculas.
La entrada se proporciona como seis valores separados por espacios, ya sea en stdin
o como argumentos de línea de comandos (a elección). Los seis valores corresponden a los lados a, b, c
y los ángulos A, B, C
. Los lados desconocidos se dan como signos de interrogación ( ?
). Los ángulos de entrada y salida deben estar en radianes. Puede suponer que los valores de entrada son correctos (no tiene que validar nada). También puede suponer que el triángulo de entrada no está degenerado y que todos los lados y ángulos son distintos de cero.
La siguiente entrada de ejemplo le dice que lado a
es 8
, lado b
es 12
y ángulo A
es 0.5
radianes:
8 12 ? 0.5 ? ?
Salida
La salida se da en el mismo formato que la entrada: seis números separados por espacios stdout
. La única excepción es cuando no es posible resolver el triángulo de entrada, entonces se "No solution"
debe escribir en la cadena stdout
. Si son posibles dos soluciones, ambas salen con una nueva línea entre ellas.
A continuación se muestra la salida para la entrada anterior:
8.0 12.0 16.0899264342 0.5 0.802561439714 1.83903121388
8.0 12.0 4.97205505116 0.5 2.33903121388 0.302561439714
No se requiere que la salida tenga mucha precisión, pero se requieren al menos un par de decimales.
Reglas
- La entrada se lee desde
stdin
o argumentos de línea de comandos - La salida se escribe en
stdout
- Si son posibles dos soluciones con la entrada dada, envíe ambas
- Si hay muy poca información para obtener una o dos soluciones claras, considérelo un
"No solution"
caso - No se puede usar código incorporado o preexistente (por supuesto, puede usar funciones trigonométricas, pero no "
solveTriangle
" o tal) - El código más corto gana
Casos de prueba
En 3 4 5 ? ? ?
Fuera 3.0 4.0 5.0 0.643501108793 0.927295218002 1.57079630572
En ? 4 ? 0.64 0.92 1.57
Fuera 3.00248479301 4.0 5.02764025486 0.64 0.92 1.57
En ? ? 5 ? 0.92 ?
Fuera No solution
En ? ? 5 ? 0.92 1.57
Fuera 3.03226857833 3.97800936148 5.0 0.65159265359 0.92 1.57
En 8 12 ? 0.5 ? ?
Fuera (dos soluciones)
8.0 12.0 16.0899264342 0.5 0.802561439714 1.83903121388
8.0 12.0 4.97205505116 0.5 2.33903121388 0.302561439714
En 8 12 ? ? .5 ?
Fuera 8.0 12.0 18.3912222133 0.325325285223 0.5 2.31626736837
¡Buena suerte!
fuente
Respuestas:
Python, 441 caracteres
¿Tu trigonometría típica para calcular la respuesta? Las posibles soluciones actuales se almacenan como tuplas en V. Cualquier valor desconocido se registra como 0. Una séptima variable R es el valor
a/sin(A)==b/sin(B)==c/sin(C)
.Utilizo un truco donde los valores de a / b / c se reciclan cada iteración para evitar mucha lógica redundante. El bucle interno solo necesita calcular valores del lado o ángulo A.
fuente
8 12 ? ? .5 ?
.if a
conif not a
y aplanar por las condicionales a 1 nivel.Llano C,
565555530 caracteresC no es el mejor lenguaje para Code Golf, supongo, así que es solo por diversión.
Compilado con
cc -o trig trig.c -lm
. Lee la entrada como argumentos de línea de comando.fuente
8 12 ? ? .5 ?
: la agregué como un caso de prueba adicional en el OP.Perl - 412 caracteres
Como un perl one-liner, basado en la solución Python de Keith Randall:
Aquí en una forma más legible:
fuente