Écrire un programme ou une fonction qui permet de distinguer les 12 fonctions trigonométriques suivantes: sin
,
cos
,
tan
,
asin
,
acos
,
atan
,
sinh
,
cosh
,
tanh
,
asinh
,
acosh
,
atanh
.
Votre programme reçoit l'une des fonctions ci-dessus sous forme de boîte noire et doit afficher le nom de la fonction comme indiqué ci-dessus ou la façon dont il est nommé dans votre langue.
C'est le golf de code , donc la réponse la plus courte dans chaque langue l'emporte. Vous devez montrer que votre code fonctionne correctement en incluant des cas de test avec les 12 entrées possibles. Si le langage de votre choix n'inclut pas de build-ins pour toutes les fonctions ci-dessus, vous devez fournir vos propres implémentations sensées des manquantes.
Précisions supplémentaires
- L'utilisation de nombres complexes pour interroger la boîte noire est autorisée si les versions sous-jacentes peuvent les gérer.
- Comme lorsque vous utilisez uniquement des nombres réels, les requêtes à la fonction de boîte noire peuvent donner des erreurs de domaine. Dans ce cas, vous devez supposer que la boîte noire ne communique que l'existence d'une erreur, mais pas de quelle fonction elle provient.
- Si au lieu d'une erreur, une autre valeur, par exemple
NaN
ounull
, est renvoyée, votre soumission devrait être en mesure de les gérer.
Merci pour les commentaires utiles du bac à sable !
la source
Réponses:
Python 3.6.4 sous Linux, 99 octets
Réponse idiote, mais:
Nécessite que les fonctions trigonométriques fassent partie du
cmath
module intégré pour les entrées / sorties complexes.la source
f
estf(.029)
- appeler la fonction avec une valeur.Perl 6 , 75 octets
Essayez-le en ligne!
Il se trouve que les douze fonctions à discriminer sont intégrées et prennent toutes des arguments complexes.
[X~] ("", "a"), <sin cos tan>, ("", "h")
génère les douze noms de fonction en réduisant les trois listes d'entrée avec une concaténation entre produits. Compte tenu de ceux-ci,.min(...)
trouve celui qui présente la plus petite différence par rapport à la fonction d'entrée2i
.la source
X
peuvent être utilisés pour plusieurs termes, et quelques autres astuces pour jouer au golfC (gcc) ,
178172 octetsEssayez-le en ligne!
Vieux mais cool: C (gcc) , 194 octets
Essayez-le en ligne!
Le
-lm
commutateur dans TIO est simplement à tester. Si vous pouviez écrire une implémentation parfaite des fonctions trigonométriques standard, vous obtiendriez la bonne réponse.Explication
L'idée était de trouver une valeur d'entrée telle que lorsque j'interprète les sorties de chacune des fonctions trigonométriques comme des nombres entiers, elles aient différents restes modulo 12. Cela leur permettra d'être utilisées comme indices de tableau.
Afin de trouver une telle valeur d'entrée, j'ai écrit l'extrait suivant:
Si vous exécutez cela (qui doit être compilé avec -lm), il crachera qu'avec une valeur de 0,9247, vous obtenez des valeurs uniques.
Ensuite, j'ai réinterprété comme des nombres entiers, appliqué le module par 12 et pris la valeur absolue. Cela a donné à chaque fonction un indice. Ils étaient (de 0 à> 11): acosh, sinh, asinh, atanh, tan, cosh, asin, sin, cos, atan, tanh, acos.
Maintenant, je pourrais simplement indexer dans un tableau de chaînes, mais les noms sont très longs et très similaires, donc je les retire à la place des tranches d'une chaîne.
Pour ce faire, je construis la chaîne "asinhacoshatanh" et deux tableaux. Le premier tableau indique le caractère de la chaîne à définir sur le terminateur nul, tandis que le second indique quel caractère de la chaîne doit être le premier. Ces tableaux contiennent: 10,5,5,0,14,10,4,4,9,14,0,9 et 5,1,0,10,11,6,0,1,6,10,11, 5 respectivement.
Enfin, il s'agissait simplement d'implémenter efficacement l'algorithme de réinterprétation en C. Malheureusement, je devais utiliser le double type, et avec exactement 3 utilisations, il était plus rapide de n'utiliser que
double
trois fois puis d'utiliser#define D double\nDDD
seulement 2 caractères. Le résultat est au-dessus, une description est ci-dessous:Edit: Malheureusement, l'utilisation d'un tableau brut est en fait plus courte, donc le code devient beaucoup plus simple. Néanmoins, le tranchage des cordes était amusant. En théorie, un argument approprié pourrait en fait produire les bonnes tranches avec des mathématiques.
la source
puts(...)
parprintf("%.5s","acoshsinh asinhatanhtan cosh asin sin cos atan tanh acos "+5*(_<0?-_:_))
-DD=double
et en remplaçant tous lesdouble
s de votre code parD
. Notez que l'indicateur doit être compté pour le nombre total d'octets.char*[]
parint*[]
et en changeant l'opérateur ternaire (? :) enabs(_)
Python 3.6.5 sous Linux,
9085 octetsCela s'appuie sur la réponse de orlp ; mais au lieu de trouver 1 chiffre magique, nous en trouvons 3! Cela permet simplement d'économiser des octets en évitant de placer plusieurs fois les littéraux de chaîne pour "sin", "cos" et "tan", au lieu de cela de construire la réponse une partie à la fois.
Le premier nombre magique est utilisé pour déterminer s'il s'agit d'une des fonctions trigonométriques "arc", en ajoutant un "a" en conséquence, le second pour savoir s'il s'agit d'une des fonctions basées sur "sin", "cos" ou "tan", en sélectionnant la chaîne appropriée, et la troisième pour savoir s'il s'agit d'une des fonctions hyperboliques, en ajoutant un "h" en conséquence.
Comme la réponse d'orlp, il utilise les fonctions du
cmath
module intégré de Python en entrée.Enregistré 5 octets en utilisant l'indexation de tranche dans la chaîne du milieu
Trouver les nombres magiques
Pour être complet, voici (plus ou moins) le script que j'ai utilisé pour trouver ces nombres magiques. J'ai surtout travaillé directement dans un terminal python, donc le code est en désordre, mais il fait le travail.
la source
Python ,
1089490 octetsCompare le résultat de la fonction d'entrée aux résultats de toutes les fonctions de la valeur
.2
.Essayez-le en ligne
-14 octets par Jonathan Allen
-4 octets par Rod
la source
re
, obtenez simplement ceux dont vous avez besoin avec le découpage:lambda f,d=dir(cmath):[s for s in d[4:12]+d[22:]if eval("cmath."+s)(.2)==f(.2)][0]
(réécrit pour fonctionner sur TIO car l'importation doit avoir lieu avantd=dir(cmath)
maisF=
doit être dans l'en-tête pour ne pas être comptée).lambda f:[s for s in dir(cmath)if s[-1]in'shn'and eval("cmath."+s)(.2)==f(.2)][0]
Dyalog APL ,
252119 octetsEssayez-le en ligne!
-3 grâce à H.PWiz
-2 grâce à ngn
Va à travers toutes les fonctions trigonométriques requises (qui sont dans APL
1 2 3 5 6 7 ¯1 ¯2 ¯3 ¯5 ¯6 ¯7○2
) plus quelques autres choses (cela va à travers-7..7
), trouve celle qui correspondinput○2
, et sort celle qui "avec"○
, qui sort commenum∘○
la source
C (gcc) avec
-lm
,374346324 octetsMerci à Giacomo Garabello pour les suggestions.
J'ai pu économiser un peu plus d'espace en faisant en sorte qu'une macro d'aide effectue le collage de jetons en plus de ma macro d'origine qui effectue la chaîne.
Dans les tests, j'ai utilisé quelques fonctions trig non-bibliothèque pour confirmer la validité des résultats. Comme les résultats entre les fonctions bibliothèque et non bibliothèque n'étaient pas exactement la même valeur en virgule flottante, j'ai comparé la différence des résultats avec une petite valeur ε au lieu d'utiliser l'égalité.
Essayez-le en ligne!
la source
JavaScript,
766766 octetsPas joli mais je suis allé beaucoup trop loin dans le terrier du lapin avec ceci sur quelques bières pour ne pas le poster. Dérivé indépendamment de la solution de Nit.
Essayez-le en ligne
la source
b=>Object.getOwnPropertyNames(M=Math).find(x=>M[x](.8)+M==b(.8)+M)
? (bien que je ne sache pas vraiment pourquoi convertir en String pour comparer)NaN
comparer égal àNaN
, c'est donc ça ouObject.is
.Wolfram Language (Mathematica) , 86 octets
Essayez-le en ligne!
la source
Rubis ,
7167 octetsEssayez-le en ligne!
la source
JavaScript,
10870 octetsJe n'ai pas essayé le golf en Javascript pur depuis des lustres, donc je suis sûr qu'il y a des choses à améliorer ici.
Assez simple, vérifie chaque fonction du
Math
prototype par rapport à une valeur arbitraire (0,9, de nombreuses autres valeurs fonctionnent probablement) et compare avec le résultat de la fonction de boîte noire.Testé dans Google Chrome, se cassera si la fonction de boîte noire d'entrée n'est pas l'un des trigs.
Coupez une tonne d'octets grâce à Shaggy et Neil.
la source
0.3 -> .3
et affecterMath
à l'm
intérieurgetOwnPropertyNames()
.t=>Object.getOwnPropertyNames(m=Math).find(f=>m[f](.9,0)+''==t(.9)+'');
. J'ai également remarqué que @Shaggy était utiliséfind
. Le+''
fait une chaîne comparer, ce qui signifie que nous n'avons qu'à vérifier un point. Le,0
fait de nous sauterMath.atan2
.,0
nécessaire: tio.run/##Lc6xDoMgEMbxvU/RMEFq2TvgG1jdjYknomLkzghp7dPTqEz/…atan2
précèdeacosh
dans le tableau retourné parObject.getOwnPropertyNames
.getOwnPropertyNames
se posait la question, cette solution fonctionne car la première non-fonction de est Math.E, et toutes les fonctions trig sont énumérées avant cela.R , 75 octets
Essayez-le en ligne!
Pour l'instant (R v3.5) ça marche.
Si dans une future version R il sera ajouté une fonction correspondant à ce regex, alors qui sait: P
Find
au lieu defor
la source
1i
fonctionne aussi bien que-1i
pour -2 octets.HP 49G RPL, 88,0 octets à l'exclusion de l'en-tête de programme de 10 octets
Une autre solution utilisant des nombres complexes! Saisissez-le et exécutez-le en mode COMPLEXE, APPROX. Prend la fonction sur la pile.
(les nouvelles lignes n'ont pas d'importance)
Pour la constante 2.0, les douze fonctions trigonométriques sont définies dans le plan complexe, nous évaluons donc toutes les douze et voyons laquelle correspond. Cette fois, la solution itérative est plus longue (111,5 octets) en raison du brassage de pile nécessaire pour l'obtenir. RPL, pour autant que je sache, ne vous permet pas de sortir d'une boucle tôt.
la source
->STR DUP SIZE 3 - " " " " IFTE XOR
34,5 octets. (ceux-ci sont censés être de 4 et 3 espaces, respectivement)Perl 6 , 39 octets
Essayez-le en ligne!
Par l'apparence des choses, l'un des rares à utiliser l'introspection.
i
voici le nombre complexe, dont la valeur est unique pour chaque fonction trig, donc en parcourant toutes les méthodes, nous pouvons trouver la méthode correspondante et cracher implicitement son nom. Letry
est nécessaire car certaines méthodes (indésirables) ont une signature différente.la source
JavaScript (Node.js) , 72 octets
Essayez-le en ligne!
la source