Napisać program lub funkcję, które można wyróżnić następujące funkcje trygonometryczne 12: sin
,
cos
,
tan
,
asin
,
acos
,
atan
,
sinh
,
cosh
,
tanh
,
asinh
,
acosh
,
atanh
.
Wasz program otrzymuje jedną z powyższych funkcji jako czarną skrzynkę i powinien wypisać nazwę funkcji, jak podano powyżej, lub sposób, w jaki jest ona nazwana w twoim języku.
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w każdym języku. Powinieneś pokazać, że kod działa poprawnie, włączając przypadki testowe ze wszystkimi 12 możliwymi danymi wejściowymi. Jeśli wybrany język nie zawiera wbudowanych funkcji dla wszystkich powyższych funkcji, musisz podać własne rozsądne implementacje brakujących.
Dalsze wyjaśnienia
- Używanie liczb zespolonych do zapytania do czarnej skrzynki jest dozwolone, jeśli odpowiednie wbudowane poradzą sobie z nimi.
- Ponieważ przy użyciu tylko liczb rzeczywistych, zapytania do funkcji czarnej skrzynki mogą powodować błędy domeny. W takim przypadku należy założyć, że czarna skrzynka informuje tylko o błędzie, ale nie od jakiej funkcji pochodzi.
- Jeśli zamiast błędu zostanie zwrócona jakaś inna wartość, np.
NaN
Lubnull
, wówczas przesłanie powinno być w stanie je obsłużyć.
Dziękujemy za pomocną opinię w piaskownicy !
code-golf
function
trigonometry
Laikoni
źródło
źródło
Odpowiedzi:
Python 3.6.4 w systemie Linux, 99 bajtów
Trochę głupia odpowiedź, ale:
Wymaga, aby funkcje trygonometryczne były jednym z wbudowanego
cmath
modułu dla złożonych wejść / wyjść.źródło
f
jestf(.029)
- wywołanie funkcji z wartością.Perl 6 , 75 bajtów
Wypróbuj online!
Tak się składa, że wszystkie dwanaście funkcji, które należy rozróżnić, są wbudowane i wszystkie przyjmują złożone argumenty.
[X~] ("", "a"), <sin cos tan>, ("", "h")
generuje wszystkie dwanaście nazw funkcji, redukując trzy listy danych wejściowych przez łączenie różnych produktów. Biorąc pod uwagę te,.min(...)
znajduje tę, w której najmniejsza różnica od funkcji wejściowej2i
.źródło
X
można użyć dla wielu terminów i kilka innych sztuczek do bajtów golfaC (gcc) ,
178172 bajtówWypróbuj online!
Stare, ale fajne: C (gcc) , 194 bajty
Wypróbuj online!
-lm
Przełącznik w TIO jest jedynie do testu. Jeśli potrafisz napisać idealną implementację standardowych funkcji trig, uzyskasz właściwą odpowiedź.Wyjaśnienie
Pomysł polegał na znalezieniu pewnej wartości wejściowej, takiej, że kiedy interpretuję wyniki każdej z funkcji triggera jako liczby całkowite, mają one pozostałe resztki modulo 12. Pozwoli to na ich wykorzystanie jako indeksów tablicowych.
Aby znaleźć taką wartość wejściową, napisałem następujący fragment:
Jeśli uruchomisz to (które należy skompilować z -lm), wypluje to, że o wartości 0.9247 otrzymasz unikalne wartości.
Następnie ponownie zinterpretowałem jako liczby całkowite, zastosowałem modulo przez 12 i przyjąłem wartość bezwzględną. To dało każdej funkcji indeks. Byli to (od 0 -> 11): acosh, sinh, asinh, atanh, tan, cosh, asin, sin, cos, atan, tanh, acos.
Teraz mógłbym po prostu zaindeksować tablicę ciągów, ale nazwy są bardzo długie i bardzo podobne, więc zamiast tego wyciągam je z kawałków łańcucha.
Aby to zrobić, tworzę ciąg „asinhacoshatanh” i dwie tablice. Pierwsza tablica wskazuje, który znak w ciągu ma zostać ustawiony na zerowy terminator, a druga wskazuje, który znak w ciągu powinien być pierwszym. Tablice te zawierają: 10,5,5,0,14,10,4,4,9,14,0,9 i 5,1,0,10,11,6,0,1,6,10,11, 5 odpowiednio.
Ostatecznie chodziło tylko o wydajne wdrożenie algorytmu reinterpretacji w C. Niestety niestety musiałem użyć podwójnego typu, a przy dokładnie 3 zastosowaniach szybsze było użycie tylko
double
trzy razy, niż użycie#define D double\nDDD
tylko 2 znaków. Wynik jest powyżej, a opis poniżej:Edycja: Niestety użycie surowej tablicy jest w rzeczywistości krótsze, więc kod staje się znacznie prostszy. Mimo to krojenie sznurka było fajne. Teoretycznie odpowiedni argument może faktycznie sam wyprowadzić właściwe wycinki z pewną matematyką.
źródło
puts(...)
zprintf("%.5s","acoshsinh asinhatanhtan cosh asin sin cos atan tanh acos "+5*(_<0?-_:_))
-DD=double
i zamieniając wszystkiedouble
s w kodzie naD
. Zauważ, że flaga musi być zliczona dla wszystkich bajtów.char*[]
jeint*[]
i zmieniając operator trójskładnikowy (? :) naabs(_)
Python 3.6.5 w systemie Linux,
9085 bajtówTo opiera się na odpowiedzi orlp ; ale zamiast znaleźć 1 magiczną liczbę, znajdziemy 3! To w zasadzie oszczędza bajty, unikając wielokrotnego wstawiania literałów ciągów „sin”, „cos” i „tan”, zamiast budować odpowiedź pojedynczo.
Pierwsza magiczna liczba służy do określenia, czy jest to jedna z funkcji trygonometrycznych „łuku”, odpowiednio poprzedzająca „a”, druga do tego, czy jest to jedna z funkcji opartych na „sin”, „cos” lub „tan”, wybierając odpowiedni ciąg, a trzeci dla tego, czy jest to jedna z funkcji hiperbolicznych, dodając odpowiednio „h”.
Podobnie jak odpowiedź orlp, wykorzystuje funkcje z wbudowanego
cmath
modułu Pythona jako dane wejściowe.Zapisano 5 bajtów, stosując indeksowanie plasterków w środkowym ciągu
Znalezienie magicznych liczb
Dla kompletności, oto (mniej więcej) skrypt, którego użyłem do znalezienia tych magicznych liczb. Przeważnie po prostu pracowałem prosto w terminalu python, więc kod jest nieporządny, ale wykonuje zadanie.
źródło
Python ,
1089490 bajtówPorównuje wynik funkcji wejściowej z wynikami wszystkich funkcji dla wartości
.2
.Wypróbuj online
-14 bajtów Jonathana Allena
-4 bajty Rod
źródło
re
, po prostu zdobądź te, które są potrzebne przy krojeniu:lambda f,d=dir(cmath):[s for s in d[4:12]+d[22:]if eval("cmath."+s)(.2)==f(.2)][0]
(przepisany do pracy na TIO, ponieważ import musi nastąpić wcześniej,d=dir(cmath)
aleF=
musi znajdować się w nagłówku, aby nie zostać policzony).lambda f:[s for s in dir(cmath)if s[-1]in'shn'and eval("cmath."+s)(.2)==f(.2)][0]
Dyalog APL ,
252119 bajtówWypróbuj online!
-3 dzięki H.PWiz
-2 dzięki ngn
Przechodzi przez wszystkie wymagane funkcje wyzwalania (które są w APL
1 2 3 5 6 7 ¯1 ¯2 ¯3 ¯5 ¯6 ¯7○2
) plus kilka innych rzeczy (to idzie koryta-7..7
), znajduje, która z nich pasujeinput○2
, i wyprowadza to „z”○
, które wyprowadza jakonum∘○
źródło
C (gcc) z
-lm
,374346324 bajtówDzięki Giacomo Garabello za sugestie.
Byłem w stanie zaoszczędzić trochę więcej miejsca, mając makro pomocnika do wklejania tokenów oprócz mojego oryginalnego makra, które wykonuje przeciąganie.
W testach użyłem kilku niebibliotecznych funkcji wyzwalających, aby potwierdzić poprawność wyników. Ponieważ wyniki między funkcjami bibliotecznymi a pozabibliotecznymi nie były dokładnie takie same, jak zmiennoprzecinkowe, porównałem różnicę wyników z małą wartością ε zamiast używania równości.
Wypróbuj online!
źródło
JavaScript,
766766 bajtówNie ładnie, ale poszedłem z tym zbyt daleko w dół króliczej nory, aby nie opublikować tego. Pochodzi niezależnie od rozwiązania Nit.
Wypróbuj online
źródło
b=>Object.getOwnPropertyNames(M=Math).find(x=>M[x](.8)+M==b(.8)+M)
? (choć nie do końca wiem, dlaczego przekonwertować na String, aby porównać)NaN
porównać równeNaN
, więc albo to, alboObject.is
.Wolfram Language (Mathematica) , 86 bajtów
Wypróbuj online!
źródło
Ruby ,
7167 bajtówWypróbuj online!
źródło
JavaScript,
10870 bajtówOd wieków nie grałem w golfa w czystym JavaScript, więc jestem pewien, że jest coś, co można poprawić.
Całkiem prosto,
Math
porównuje każdą funkcję prototypu z dowolną wartością (0,9, prawdopodobnie wiele innych wartości działa) i porównuje z wynikiem funkcji czarnej skrzynki.Testowany w Google Chrome, zepsuje się, jeśli wejściowa funkcja czarnej skrzynki nie jest jednym z wyzwalaczy.
Odciąć mnóstwo bajtów dzięki Kudłatemu i Neilowi.
źródło
0.3 -> .3
i przypisaćMath
dom
wewnątrzgetOwnPropertyNames()
.t=>Object.getOwnPropertyNames(m=Math).find(f=>m[f](.9,0)+''==t(.9)+'');
. Zauważyłem również @Shaggyfind
.+''
Robi ciąg porównać, co oznacza, że tylko trzeba sprawdzić jeden punkt. To,0
sprawia, że pomijamyMath.atan2
.,0
to, że jest potrzebne: tio.run/##Lc6xDoMgEMbxvU/RMEFq2TvgG1jdjYknomLkzghp7dPTqEz/…atan2
poprzedzaacosh
tablicę zwróconą przezObject.getOwnPropertyNames
.getOwnPropertyNames
jest Math.E, a wszystkie funkcje trygoniczne wyliczają wcześniej.R , 75 bajtów
Wypróbuj online!
Na razie (R v3.5) to działa.
Jeśli w przyszłej wersji R zostanie dodana funkcja pasująca do tego wyrażenia regularnego, to kto wie: P
Find
zamiastfor
źródło
1i
działa równie dobrze jak-1i
na -2 bajty.HP 49G RPL, 88,0 bajtów z wyłączeniem 10-bajtowego nagłówka programu
Kolejne rozwiązanie wykorzystujące liczby zespolone! Wejdź i uruchom go w trybie COMPLEX, APPROX. Pobiera funkcję na stosie.
(nowe linie nie mają znaczenia)
W przypadku stałej 2.0 wszystkie dwanaście funkcji wyzwalających jest zdefiniowanych w płaszczyźnie złożonej, więc po prostu oceniamy wszystkie dwanaście i sprawdzamy, która z nich pasuje. Tym razem iteracyjne rozwiązanie jest dłuższe (111,5 bajtów) z powodu przetasowania stosu potrzebnego do jego uzyskania. O ile mi wiadomo, RPL nie pozwala wcześnie wyjść z pętli.
źródło
->STR DUP SIZE 3 - " " " " IFTE XOR
, 34,5 bajtów. (powinny to być odpowiednio 4 i 3 spacje)Perl 6 , 39 bajtów
Wypróbuj online!
Wygląda na to, że jeden z niewielu korzysta z introspekcji.
i
oto liczba zespolona, której wartość jest unikalna dla każdej funkcji triggera, więc iterując wszystkie metody, możemy znaleźć pasującą metodę i niejawnie wypluć jej nazwę. Jesttry
to konieczne, ponieważ niektóre (niepożądane) metody mają inną sygnaturę.źródło
JavaScript (Node.js) , 72 bajty
Wypróbuj online!
źródło