Schreiben Sie ein Programm oder eine Funktion, die die folgenden 12 trigonometrischen Funktionen unterscheiden: sin
,
cos
,
tan
,
asin
,
acos
,
atan
,
sinh
,
cosh
,
tanh
,
asinh
,
acosh
,
atanh
.
Ihr Programm erhält eine der oben genannten Funktionen als Blackbox und sollte den Namen der Funktion entweder wie oben angegeben oder wie in Ihrer Sprache angegeben ausgeben.
Das ist Code-Golf , also gewinnt die kürzeste Antwort in jeder Sprache. Sie sollten zeigen, dass Ihr Code korrekt funktioniert, indem Sie Testfälle mit allen 12 möglichen Eingaben einschließen. Wenn die Sprache Ihrer Wahl nicht für alle oben genannten Funktionen Build-Ins enthält, müssen Sie Ihre eigenen sinnvollen Implementierungen der fehlenden Funktionen bereitstellen.
Weitere Erläuterungen
- Die Verwendung komplexer Zahlen zur Abfrage der Black Box ist zulässig, wenn die zugrunde liegenden Build-Ins damit umgehen können.
- Wie , wenn nur reelle Zahlen verwenden, Anfragen an die Black - Box - Funktion Domain - Fehler geben können. In diesem Fall sollten Sie davon ausgehen, dass die Blackbox nur das Vorhandensein eines Fehlers meldet, nicht jedoch, von welcher Funktion sie stammt.
- Wenn anstelle eines Fehlers ein anderer Wert zurückgegeben wird, z. B.
NaN
odernull
, sollte Ihre Übermittlung in der Lage sein, diesen zu verarbeiten.
Vielen Dank für das hilfreiche Sandbox-Feedback !
quelle
Antworten:
Python 3.6.4 unter Linux, 99 Byte
Eine dumme Antwort, aber:
Erfordert, dass die trigonometrischen Funktionen
cmath
für komplexe Ein- / Ausgaben eine aus dem integrierten Modul sind.quelle
f
bestehtf(.029)
, die Funktion mit einem Wert aufzurufen.Perl 6 , 75 Bytes
Probieren Sie es online!
Es ist so, dass alle zwölf zu unterscheidenden Funktionen eingebaut sind und komplexe Argumente enthalten.
[X~] ("", "a"), <sin cos tan>, ("", "h")
Generiert alle zwölf Funktionsnamen durch Reduzieren der drei Eingabelisten mit produktübergreifender Verkettung. Angesichts dessen.min(...)
findet man diejenige, bei der der kleinste Unterschied zur Eingabefunktion besteht2i
.quelle
X
können für mehrere Begriffe und ein paar andere Tricks zum Golf-Bytes verwendet werdenC (GCC) ,
178172 BytesProbieren Sie es online!
Alt aber cool: C (gcc) , 194 Bytes
Probieren Sie es online!
Der
-lm
Schalter in TIO dient lediglich zum Testen. Wenn Sie eine perfekte Implementierung der Standard-Triggerfunktionen schreiben könnten, würden Sie die richtige Antwort erhalten.Erläuterung
Die Idee war, einen Eingabewert so zu finden, dass, wenn ich die Ausgaben jeder der Triggerfunktionen als Ganzzahlen interpretiere, sie unterschiedliche Reste modulo 12 haben. Dadurch können sie als Array-Indizes verwendet werden.
Um einen solchen Eingabewert zu finden, habe ich folgendes Snippet geschrieben:
Wenn Sie das ausführen (was mit -lm kompiliert werden muss), wird darauf hingewiesen, dass Sie mit einem Wert von 0,9247 eindeutige Werte erhalten.
Als nächstes habe ich als ganze Zahlen neu interpretiert, modulo mit 12 angewendet und den absoluten Wert genommen. Dies gab jeder Funktion einen Index. Sie waren (von 0 -> 11): acosh, sinh, asinh, atanh, tan, cosh, asin, sin, cos, atan, tanh, acos.
Jetzt konnte ich nur eine Reihe von Zeichenfolgen indizieren, aber die Namen sind sehr lang und sehr ähnlich, und stattdessen nehme ich sie aus Schnitten einer Zeichenfolge heraus.
Dazu konstruiere ich den String "asinhacoshatanh" und zwei Arrays. Das erste Array gibt an, welches Zeichen in der Zeichenfolge als Nullterminator festgelegt werden soll, während das zweite angibt, welches Zeichen in der Zeichenfolge das erste sein soll. Diese Arrays enthalten: 10,5,5,0,14,10,4,4,9,14,0,9 und 5,1,0,10,11,6,0,1,6,10,11, 5 jeweils.
Schließlich ging es nur darum, den Neuinterpretationsalgorithmus in C effizient zu implementieren. Leider musste ich den Doppeltyp verwenden, und mit genau drei Verwendungen war es schneller, nur
double
drei Mal zu verwenden, als#define D double\nDDD
mit nur zwei Zeichen. Das Ergebnis ist oben, eine Beschreibung ist unten:Bearbeiten: Leider ist nur die Verwendung eines unformatierten Arrays tatsächlich kürzer, sodass der Code viel einfacher wird. Trotzdem hat das Aufschneiden der Saiten Spaß gemacht. Theoretisch könnte ein geeignetes Argument mit etwas Mathematik tatsächlich die richtigen Schichten für sich finden.
quelle
puts(...)
durchprintf("%.5s","acoshsinh asinhatanhtan cosh asin sin cos atan tanh acos "+5*(_<0?-_:_))
-DD=double
und alledouble
s in Ihrem Code durch ersetzenD
. Beachten Sie, dass das Flag für die Gesamtzahl der Bytes gezählt werden muss.char*[]
vonint*[]
und Ändern des ternären Operators (? :) in anabs(_)
Python 3.6.5 unter Linux,
90 bis85 ByteDies baut auf der Antwort von Orlp auf ; aber anstatt 1 magische Zahl zu finden, finden wir 3! Dies spart im Grunde genommen nur Bytes, indem vermieden wird, dass die String-Literale mehrmals für "sin", "cos" und "tan" gesetzt werden, anstatt die Antwort einzeln zu erstellen.
Die erste magische Zahl wird verwendet, um zu bestimmen, ob es sich um eine der "bogen" -trigonometrischen Funktionen handelt, wobei dementsprechend ein "a" vorangestellt wird, die zweite, ob es sich um eine der "sin" -, "cos" - oder "tan" -basierten Funktionen handelt die entsprechende Zeichenfolge und die dritte, um festzustellen, ob es sich um eine der hyperbolischen Funktionen handelt, wobei dementsprechend ein "h" angehängt wird.
Wie bei der Antwort von orlp werden die Funktionen des integrierten
cmath
Moduls von Python als Eingabe verwendet.5 Bytes durch Slice-Indizierung in der mittleren Zeichenfolge gespeichert
Die magischen Zahlen finden
Der Vollständigkeit halber hier (mehr oder weniger) das Skript, mit dem ich diese magischen Zahlen gefunden habe. Ich habe meistens nur direkt in einem Python-Terminal gearbeitet, der Code ist also chaotisch, aber es erledigt die Arbeit.
quelle
Python ,
1089490 BytesVergleicht das Ergebnis der Eingabefunktion mit den Ergebnissen aller Funktionen für den Wert
.2
.Probieren Sie es online aus
-14 Bytes von Jonathan Allen
-4 Bytes von Rod
quelle
re
, bekommt nur das , die mit Slicing benötigt:lambda f,d=dir(cmath):[s for s in d[4:12]+d[22:]if eval("cmath."+s)(.2)==f(.2)][0]
(neu geschriebene Arbeit auf TIO als der Import , bevor passieren mussd=dir(cmath)
nochF=
im Header sein muss , um nicht gezählt).lambda f:[s for s in dir(cmath)if s[-1]in'shn'and eval("cmath."+s)(.2)==f(.2)][0]
Dyalog APL ,
252119 BytesProbieren Sie es online!
-3 danke an H.PWiz
-2 danke an ngn
Durchläuft alle erforderlichen Triggerfunktionen (die in APL vorhanden sind
1 2 3 5 6 7 ¯1 ¯2 ¯3 ¯5 ¯6 ¯7○2
) sowie einige weitere Dinge (dies geht durch-7..7
), findet, welche übereinstimmeninput○2
, und gibt das "mit" aus○
, welches als ausgibtnum∘○
quelle
C (GCC) mit
-lm
,374346324 BytesVielen Dank an Giacomo Garabello für die Vorschläge.
Ich konnte etwas mehr Platz sparen, indem ich zusätzlich zu meinem ursprünglichen Makro, das das Stringing übernimmt, ein Hilfsmakro zum Einfügen von Token verwendete.
In den Tests habe ich einige nicht bibliothekarische Triggerfunktionen verwendet, um die Gültigkeit der Ergebnisse zu bestätigen. Da die Ergebnisse zwischen Bibliotheks- und Nicht-Bibliotheksfunktionen nicht exakt der gleiche Gleitkommawert waren, habe ich die Differenz der Ergebnisse mit einem kleinen Wert ε verglichen, anstatt Gleichheit zu verwenden.
Probieren Sie es online!
quelle
JavaScript,
766766 BytesNicht hübsch, aber ich bin mit ein paar Bier viel zu weit in den Kaninchenbau gegangen, um es nicht zu posten. Abgeleitet unabhängig von der Lösung von Nit.
Probieren Sie es online aus
quelle
b=>Object.getOwnPropertyNames(M=Math).find(x=>M[x](.8)+M==b(.8)+M)
? (obwohl ich nicht genau weiß, warum ich zu String konvertiere, um zu vergleichen)NaN
gleich vergleichenNaN
, also ist es entweder das oderObject.is
.Wolfram Language (Mathematica) , 86 Byte
Probieren Sie es online!
quelle
Ruby ,
7167 BytesProbieren Sie es online!
quelle
JavaScript,
10870 BytesIch habe lange nicht mehr versucht, in reinem Javascript zu golfen, daher bin ich mir sicher, dass es hier noch Verbesserungspotential gibt.
Ziemlich einfach, prüft jede Funktion auf der
Math
Prototyps gegen einen beliebigen Wert (0,9, viele andere Werte funktionieren wahrscheinlich) und vergleicht sie mit dem Ergebnis der Black-Box-Funktion.Getestet in Google Chrome. Bricht ab, wenn die Eingabe-Blackbox-Funktion nicht zu den Trigs gehört.
Schneiden Sie eine Menge Bytes dank Shaggy und Neil ab.
quelle
0.3 -> .3
und weisenMath
aufm
innerhalbgetOwnPropertyNames()
.t=>Object.getOwnPropertyNames(m=Math).find(f=>m[f](.9,0)+''==t(.9)+'');
. Mir ist aufgefallen, dass @Shaggy auch benutzt wirdfind
. Das+''
bedeutet, dass wir nur einen Punkt überprüfen müssen. Das,0
lässt uns überspringenMath.atan2
.,0
benötigt wird: tio.run/##Lc6xDoMgEMbxvU/RMEFq2TvgG1jdjYknomLkzghp7dPTqEz/…atan2
voracosh
dem Array, das von zurückgegeben wirdObject.getOwnPropertyNames
.getOwnPropertyNames
Nichtfunktion von Math.E ist und alle Triggerfunktionen davor aufgelistet sind.R , 75 Bytes
Probieren Sie es online!
Im Moment (R v3.5) funktioniert es.
Wenn in einer zukünftigen R-Version eine Funktion hinzugefügt wird, die dieser Regex entspricht, wer weiß dann: P
Find
anstelle vonfor
quelle
1i
funktioniert genauso gut wie-1i
für -2 Bytes.HP 49G RPL, 88,0 Byte ohne 10-Byte-Programm-Header
Eine andere Lösung mit komplexen Zahlen! Geben Sie es im Modus KOMPLEX, CA. ein und führen Sie es aus. Übernimmt die Funktion auf dem Stapel.
(die Zeilenumbrüche spielen keine Rolle)
Für die Konstante 2.0 sind alle zwölf Triggerfunktionen in der komplexen Ebene definiert. Wir werten also nur alle zwölf aus und sehen, welche übereinstimmen. Diesmal ist die iterative Lösung länger (111,5 Byte), da der Stack gemischt werden muss, um sie abzurufen. RPL lässt Sie, soweit ich weiß, nicht früh aus einer Schleife ausbrechen.
quelle
->STR DUP SIZE 3 - " " " " IFTE XOR
34,5 Byte in Kleinbuchstaben geändert werden . (diese sollen 4 bzw. 3 Leerzeichen sein)Perl 6 , 39 Bytes
Probieren Sie es online!
So wie es aussieht, einer der wenigen, der Selbstbeobachtung anwendet.
i
Hier ist die komplexe Zahl, deren Wert für jede Triggerfunktion eindeutig ist. Wenn wir also alle Methoden durchlaufen, können wir die passende Methode finden und implizit ihren Namen ausspucken. Dastry
wird benötigt, da einige (unerwünschte) Methoden eine andere Signatur haben.quelle
JavaScript (Node.js) , 72 Byte
Probieren Sie es online!
quelle