Napisz najkrótszy kod, który przyjmie dowolną liczbę rzeczywistą większą niż 1 jako dane wejściowe i wyświetli dodatnią odwrotną silnię. Innymi słowy, odpowiada na pytanie „jaka liczba czynnikowa jest równa tej liczbie?”. Użyj funkcji Gamma, aby rozszerzyć definicję silni do dowolnej liczby rzeczywistej, jak opisano tutaj .
Na przykład:
input=6 output=3
input=10 output=3.390077654
ponieważ 3! = 6
i3.390077654! = 10
Zasady
- Zabronione jest używanie wbudowanych funkcji silni lub funkcji gamma lub funkcji zależnych od tych funkcji.
- Program powinien być w stanie obliczyć go z dokładnością do 5 cyfr dziesiętnych, z teoretyczną możliwością obliczenia z dowolną dokładnością (powinien zawierać liczbę, która może być dowolną dużą lub małą wartością, aby uzyskać dowolną dokładność)
- Dowolny język jest dozwolony, wygrywa najkrótszy kod ze znaków.
Dałem tutaj przykład działania . Spójrz.
Odpowiedzi:
JavaScript (116)
Czarna magia tutaj! Daje wynik w ciągu kilku milisekund .
Tylko funkcje elementarne matematyczne stosowane:
ln
,pow
,exponential
Szkoda, że LaTeX nie jest obsługiwany na codegolfie, ale w zasadzie napisałem solver Newtona dla
f(y)=gamma(y)-n=0
ix=y-1
(ponieważx!
jestgamma(x+1)
) oraz aproksymacje dla funkcji gamma i digamma.Przybliżenie gamma jest aproksymacją Stirlinga Przybliżenie
digammy użycie formuły Eulera Maclaurina
Funkcja digamma jest pochodną funkcji gamma podzielonej przez funkcję gamma:
f'(y)=gamma(y)*digamma(y)
Nie golfowany:
Przypadki testowe :
źródło
n=prompt(M=Math)
Matematyka -
745449Tak będzie
Gdybyśmy po prostu zrezygnowali z testu
?NumberQ
, nadal działałby, ale rzuciłby kilka nieprzyjemnych ostrzeżeń, które zniknęłyby, gdybyśmy przestawili się na integrację symbolicznąIntegrate
, ale byłoby to nielegalne (przypuszczam), ponieważ funkcja zostałaby automatycznie przekonwertowana naGamma
funkcję. W ten sposób możemy również pozbyć się funkcji zewnętrznych.Tak czy inaczej
Aby sprawdzić poprawne wprowadzanie danych, wystarczy zdefiniować funkcję (nie można pozwolić MatLabowi wygrać)
Jeśli wbudowane silnie były dozwolone
Powyższe nie podaje liczby całkowitej (która jest argumentem dla prawdziwej funkcji silni). Następujące czynności:
źródło
NumberQ
wymagany jest test wzoru? A może parensE^(-t)
? Jest to oszustwo, aby włączyćNIntegrate
sięIntegrate
? Prawdopodobnie ... :)Ised:
7246 znakówJest to prawie idealne dopasowanie ... istnieje „język”, który wydaje się być przeznaczony właśnie do matematyki golfa: ised . Jego zaciemniona składnia sprawia, że kod jest bardzo krótki (bez nazwanych zmiennych, tylko całkowite gniazda pamięci i wiele uniwersalnych operatorów jednokolumnowych). Definiując funkcję gamma za pomocą całki, dostałem ją do 80 pozornie przypadkowych postaci
W tym przypadku gniazdo pamięci $ 4 jest funkcją silniową, funkcja podziału na 6 $ pamięci i gniazdo pamięci 2 $ powinny być ustawione na wejście (podane przed pozyskaniem tego kodu). Miejsca 0 USD i 1 USD to granice przedziałów. Przykład wywołania (przy założeniu, że powyższy kod znajduje się w pliku
inversefactorial.ised
)Oczywiście możesz użyć wbudowanego! operator, w którym to przypadku dochodzi do 45 znaków
Ostrożnie, operator jest czasem dziwny.
Edycja: zapamiętany, aby wstawić funkcje zamiast je zapisać. Pokonaj Mathematica 72 znakami!
I używając! Wbudowany dostajesz 41.
Roczna zaległa aktualizacja:
Właśnie zdałem sobie sprawę, że to było bardzo nieefektywne. Gra w golfa do 60 znaków:
Jeśli użyjemy utf-8 (robi to także Mathematica), otrzymamy 57:
Trochę inny przepisanie może zmniejszyć do 46 (lub 27, jeśli używasz wbudowanego!):
Ostatnie dwa znaki można usunąć, jeśli masz ochotę wydrukować odpowiedź dwukrotnie.
źródło
MATLAB
5447Jeśli wybiorę odpowiednie wyzwania, MATLAB jest naprawdę fajny do gry w golfa :). W moim kodzie znajduję rozwiązanie równania (ux!) = 0, w którym u jest danymi wejściowymi użytkownika, a x jest zmienną do rozwiązania. Oznacza to, że u = 6 doprowadzi do x = 3 itd.
Dokładność można zmienić, zmieniając górną granicę całki, która jest ustawiona na 99. Obniżenie tego spowoduje zmianę dokładności wyjścia w następujący sposób. Na przykład dla wejścia 10:
itp.
źródło
Python - 199 znaków
Ok, więc będziesz potrzebować dużo miejsca na stosy i dużo czasu, ale hej, dostaniesz się tam!
Oto inne podejście z jeszcze większą rekurencją.
Oba z nich można przetestować
>>>f(10,1)
pod warunkiem, że ustawisz limit rekurencji na około 10000. Więcej niż jedno miejsce dziesiętne dokładności prawdopodobnie nie zostanie uzupełnione żadnym realistycznym limitem rekurencji.Uwzględniając komentarze i kilka modyfikacji, do 199 znaków.
źródło
code-golf
pytanie, dlatego musisz podać najkrótszą odpowiedź, podając długość swojego rozwiązania.Python 2.7 -
215189 znakówStosowanie:
Aby zmienić precyzję: zmień
1e-5
na mniejszą liczbę dla większej precyzji, większą liczbę dla gorszej precyzji. Aby uzyskać większą precyzję, prawdopodobnie chcesz uzyskać lepszą wartośće
.To po prostu implementuje funkcję silnią jako
f
, a następnie wykonuje wyszukiwanie binarne w celu dopracowania najbardziej dokładnej wartości odwrotności danych wejściowych. Zakłada, że odpowiedź jest mniejsza lub równa 99 (na pewno nie zadziałałoby dla odpowiedzi 365, pojawia się błąd przepełnienia matematyki). Bardzo rozsądne wykorzystanie przestrzeni i czasu, zawsze kończy się.Ewentualnie wymienić
if abs(n-f(x))<=10**-5: print x;break
zprint x
ogolił 50 znaków . Zapętli się na zawsze, dając ci coraz dokładniejsze oszacowanie. Nie jestem jednak pewien, czy byłoby to zgodne z zasadami.źródło
cat file | wc -c
.dg -
131133 bajtówPonieważ dg tworzy kod bajtowy CPython, to również powinno się liczyć dla Pythona, ale och ... Kilka przykładów:
EDYCJA: Dodano dwa bajty, ponieważ nie pamiętam, że powinien akceptować również zmiennoprzecinkowe!
źródło
42.8006566063
, więc pasują z dokładnością do 5 cyfr!1e100
daje:,69.95780520000001
dla1e150
wyjścia96.10586423000002
, a dla1e200
wysadzenia. Ale tak naprawdę nie wiem, czy te wyniki są wiarygodne ...R , 92 bajty
Funkcja,
g
która pobiera dane wejściowez
i wyjściowe odwrotnej silni tej liczbyPrawie na pewno można z tego grać w golfa, więc jeśli zobaczysz coś, co mogę poprawić, daj mi znać.
Wypróbuj online!
Niegolfowany i komentowany
Wypróbuj online!
źródło
JavaScript (bez użycia pętli!)
Aby to zrobić, użyłem dobrze znanego przybliżenia numerycznego odwrotności aproksymacji Stirlinga Factoriala (i inspirowałem się również tym ... kaszlem ... kaszlem ... kodem kogoś innego ...)
źródło