Il est temps de déterrer vos vieilles notes de trigonométrie du lycée! Le défi consiste à résoudre les côtés et les angles inconnus de différents triangles. Et comme d'habitude dans le golf de code, le plus petit code de travail gagne.
Ce n'est pas un problème trivial; mon implémentation de référence en python est actuellement réduite à 838 837 caractères, mais je suis sûr que vous pourrez jouer à des solutions beaucoup plus petites.
De plus, si vous êtes coincé, cette section sur Wikipédia devrait vous aider: Triangle: calcul des côtés et des angles .
Contribution
Le triangle suivant montre les noms des côtés et des angles utilisés dans ce défi. Notez que les côtés sont en minuscules et les angles en majuscules.
L'entrée est donnée sous la forme de six valeurs séparées par des espaces, sur stdin
ou sous forme d'arguments de ligne de commande (votre choix). Les six valeurs correspondent aux côtés a, b, c
et aux angles A, B, C
. Les côtés inconnus sont indiqués comme des points d'interrogation ( ?
). Les angles d'entrée et de sortie doivent être exprimés en radians. Vous pouvez supposer que les valeurs d'entrée sont correctes (vous n'avez rien à valider). Vous pouvez également supposer que le triangle d'entrée n'est pas dégénéré et que tous les côtés et angles ne sont pas nuls.
L'exemple d'entrée suivant vous indique que côté a
est 8
, côté b
est 12
et angle A
est 0.5
radians:
8 12 ? 0.5 ? ?
Production
La sortie est donnée dans le même format que l'entrée - six nombres séparés par des espaces sont activés stdout
. La seule exception est quand il n'est pas possible de résoudre le triangle d'entrée - alors la chaîne "No solution"
doit être écrite stdout
. Si deux solutions sont possibles, elles sont toutes deux émises avec une nouvelle ligne entre elles.
Voici la sortie pour l'entrée ci-dessus:
8.0 12.0 16.0899264342 0.5 0.802561439714 1.83903121388
8.0 12.0 4.97205505116 0.5 2.33903121388 0.302561439714
La sortie n'est pas requise pour avoir beaucoup de précision, mais au moins quelques décimales sont nécessaires.
Règles
- L'entrée est lue à partir des
stdin
arguments de la ligne de commande - La sortie est écrite dans
stdout
- Si deux solutions sont possibles avec l'entrée donnée, sortez les deux
- S'il y a trop peu d'informations pour obtenir une ou deux solutions claires, considérez-le comme un
"No solution"
cas - Aucun code intégré ou préexistant ne peut être utilisé (bien sûr, vous pouvez utiliser les fonctions trig, mais pas "
solveTriangle
" ou autre) - Victoires de code les plus courtes
Cas de test
Dans 3 4 5 ? ? ?
En dehors 3.0 4.0 5.0 0.643501108793 0.927295218002 1.57079630572
Dans ? 4 ? 0.64 0.92 1.57
En dehors 3.00248479301 4.0 5.02764025486 0.64 0.92 1.57
Dans ? ? 5 ? 0.92 ?
En dehors No solution
Dans ? ? 5 ? 0.92 1.57
En dehors 3.03226857833 3.97800936148 5.0 0.65159265359 0.92 1.57
Dans 8 12 ? 0.5 ? ?
Out (deux solutions)
8.0 12.0 16.0899264342 0.5 0.802561439714 1.83903121388
8.0 12.0 4.97205505116 0.5 2.33903121388 0.302561439714
Dans 8 12 ? ? .5 ?
En dehors 8.0 12.0 18.3912222133 0.325325285223 0.5 2.31626736837
Bonne chance!
la source
Réponses:
Python, 441 caractères
Fait votre trig typique pour calculer la réponse. Les solutions possibles actuelles sont stockées sous forme de tuples en V. Toutes les valeurs inconnues sont enregistrées comme 0. Une septième variable R est la valeur
a/sin(A)==b/sin(B)==c/sin(C)
.J'utilise une astuce où les valeurs a / b / c sont cyclées à chaque itération pour éviter beaucoup de logique redondante. La boucle intérieure n'a besoin que de calculer les valeurs du côté ou de l'angle A.
la source
8 12 ? ? .5 ?
.if a
avecif not a
et aplatir les conditionals à 1 niveau.Ordinaire C,
565555530 caractèresC n'est pas le meilleur langage pour Code Golf, je suppose, donc c'est juste pour le plaisir.
Compilé avec
cc -o trig trig.c -lm
. Lit l'entrée sous forme d'arguments de ligne de commande.la source
8 12 ? ? .5 ?
- je l'ai ajoutée comme cas de test supplémentaire dans l'OP.Perl - 412 caractères
En tant que Perl one-liner, basé sur la solution Python de Keith Randall:
Ici sous une forme plus lisible:
la source