¡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 stdino como argumentos de línea de comandos (a elección). Los seis valores corresponden a los lados a, b, cy 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 aes 8, lado bes 12y ángulo Aes 0.5radianes:
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
stdino 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 aconif not ay 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