Schreiben Sie den kürzesten Code, der eine reelle Zahl größer als 1 als Eingabe akzeptiert und dessen positive Inverse Factorial ausgibt. Mit anderen Worten, es beantwortet die Frage "Welche Fakultät ist gleich dieser Zahl?". Verwenden Sie die Gamma-Funktion, um die Definition für Fakultät auf eine beliebige reelle Zahl zu erweitern, wie hier beschrieben .
Beispielsweise:
input=6 output=3
input=10 output=3.390077654
weil 3! = 6
und3.390077654! = 10
Regeln
- Es ist verboten, eingebaute Fakultätsfunktionen oder Gammafunktionen oder Funktionen zu verwenden, die auf diesen Funktionen beruhen.
- Das Programm sollte in der Lage sein, es mit 5 Dezimalstellen zu berechnen, mit der theoretischen Fähigkeit, es mit einer beliebigen Genauigkeit zu berechnen. (Es sollte eine Zahl enthalten, die beliebig groß oder klein gemacht werden kann, um eine beliebige Genauigkeit zu erhalten.)
- Jede Sprache ist erlaubt, der kürzeste Code in Zeichen gewinnt.
Ich habe ein funktionierendes Beispiel hier . Guck mal.
Antworten:
Javascript (116)
Schwarze Magie hier! Gibt ein Ergebnis in wenigen Millisekunden .
Nur elementare mathematische Funktionen verwendet:
ln
,pow
,exponential
Schade LaTeX ist nicht auf codegolf unterstützt , aber im Grunde genommen, ich codiert ein newtonLöser für
f(y)=gamma(y)-n=0
undx=y-1
(dax!
istgamma(x+1)
) und Näherungswerte für Gamma und digamma Funktionen.Die Gamma-Approximation ist die Stirling-Approximation. Die
Digamma-Approximation verwendet die Euler-Maclaurin-Formel.
Die Digamma-Funktion ist die Ableitung der Gamma-Funktion geteilt durch die Gamma-Funktion:
f'(y)=gamma(y)*digamma(y)
Ungolfed:
Testfälle:
quelle
n=prompt(M=Math)
Mathematica -
745449Der richtige Weg wird sein
Wenn wir den Test einfach fallen
?NumberQ
lassen, funktioniert er immer noch, wirft aber einige üble Warnungen, die verschwinden, wenn wir auf symbolische Integration umstellen.Integrate
Dies wäre jedoch illegal (ich nehme an), da die Funktion automatisch in konvertiert würdeGamma
Funktion . Auch können wir auf diese Weise die externe Funktion loswerden.Sowieso
Um mit der richtigen Eingabe fertig zu werden, einfach Funktionsdefinition (MatLab kann nicht gewinnen)
Wenn eingebaute Fakultät erlaubt wäre
Das obige gibt keine ganze Zahl an (was das Argument für eine wahre Fakultätsfunktion ist). Das Folgende tut:
quelle
NumberQ
Mustertest erforderlich? Oder parens inE^(-t)
? Ist es Betrug drehenNIntegrate
zuIntegrate
? Wahrscheinlich ... :)ised:
7246 ZeichenDas passt fast perfekt ... es gibt da draußen eine "Sprache", die genau für Mathe-Golf gedacht zu sein scheint: ised . Seine verschleierte Syntax sorgt für einen sehr kurzen Code (keine benannten Variablen, nur ganzzahlige Speicherplätze und viele vielseitige einzelne Zeichenoperatoren). Wenn ich die Gammafunktion mit einem Integral definiere, habe ich sie auf 80 scheinbar zufällige Zeichen gebracht
Hier ist der Speicherplatz $ 4 eine Fakultätsfunktion, und es wird erwartet, dass der Speicherplatz $ 6 als Bisektionsfunktion und der Speicherplatz $ 2 als Eingabe festgelegt werden (angegeben, bevor dieser Code bezogen wird). Die Slots $ 0 und $ 1 sind die Halbierungsgrenzen. Aufrufbeispiel (vorausgesetzt obiger Code ist in Datei
inversefactorial.ised
)Natürlich könnte man das eingebaute benutzen! Operator, in diesem Fall erhalten Sie bis zu 45 Zeichen
Vorsicht, Bedienerpräzision ist manchmal seltsam.
Bearbeiten: Es wurde daran gedacht, die Funktionen zu integrieren, anstatt sie zu speichern. Besiege Mathematica mit 72 Charakteren!
Und mit dem! Eingebaut bekommst du 41.
Ein Jahr überfälliges Update:
Mir ist gerade aufgefallen, dass dies sehr ineffizient ist. Golf bis zu 60 Zeichen:
Wenn utf-8 verwendet wird (Mathematica tut es auch), erhalten wir zu 57:
Ein etwas anderes Umschreiben kann es auf 46 (oder 27, wenn es eingebaut ist!) Reduzieren:
Die letzten beiden Zeichen können entfernt werden, wenn die Antwort zweimal gedruckt werden muss.
quelle
MATLAB
5447Wenn ich die richtigen Herausforderungen wähle, ist MATLAB wirklich gut zum Golfen geeignet :). In meinem Code finde ich die Lösung für die Gleichung (ux!) = 0, in der u die Benutzereingabe und x die zu lösende Variable ist. Dies bedeutet, dass u = 6 zu x = 3 usw. führt.
Die Genauigkeit kann durch Ändern der Obergrenze des Integrals, die auf 99 eingestellt ist, geändert werden. Wenn Sie diese verringern, ändert sich die Genauigkeit der Ausgabe wie folgt. Zum Beispiel für eine Eingabe von 10:
etc.
quelle
Python - 199 Zeichen
Ok, du wirst also viel Stapelplatz und viel Zeit brauchen, aber hey, es wird dort ankommen!
Hier ist ein weiterer Ansatz mit noch mehr Rekursion.
Beide können mit getestet werden
>>>f(10,1)
vorausgesetzt, Sie legen das Rekursionslimit auf 10000 fest. Bei mehr als einer Dezimalstelle wird wahrscheinlich kein realistisches Rekursionslimit erreicht.Mit Kommentaren und ein paar Modifikationen, bis zu 199 Zeichen.
quelle
code-golf
Frage ist, müssen Sie die kürzeste Antwort geben und die Länge Ihrer Lösung angeben.Python 2.7 -
215189 ZeichenVerwendung:
So ändern Sie die Präzision: Ändern Sie die Genauigkeit
1e-5
auf eine kleinere Zahl, um eine höhere Genauigkeit zu erzielen, und auf eine größere Zahl, um eine schlechtere Genauigkeit zu erzielen. Für eine bessere Genauigkeit möchten Sie wahrscheinlich einen besseren Wert für angebene
.Dies implementiert lediglich die Fakultätsfunktion as
f
und führt dann eine binäre Suche durch, um den genauesten Wert der Inverse der Eingabe zu ermitteln. Angenommen, die Antwort ist kleiner oder gleich 99 (bei einer Antwort von 365 würde dies nicht funktionieren, da ich einen mathematischen Überlauffehler erhalte). Sehr vernünftige Raum- und Zeitnutzung, endet immer.Alternativ ersetzt
if abs(n-f(x))<=10**-5: print x;break
mitprint x
abrasieren 50 Zeichen . Es wird für immer wiederholt und gibt Ihnen eine immer genauere Schätzung. Ich bin mir nicht sicher, ob dies mit den Regeln übereinstimmt.quelle
cat file | wc -c
.dg -
131133 BytesDa dg CPython-Bytecode erzeugt, sollte dies auch für Python gelten, aber oh ... Einige Beispiele:
BEARBEITEN: Zwei Bytes hinzugefügt, weil ich mich nicht daran erinnerte, dass es auch Floats akzeptieren sollte!
quelle
42.8006566063
, damit sie innerhalb von 5 Stellen der Genauigkeit übereinstimmen!1e100
sie gibt:69.95780520000001
für1e150
sie gibt96.10586423000002
, während für1e200
sie explodiert. Aber ich weiß wirklich nicht, ob diese Ergebnisse zuverlässig sind ...R , 92 Bytes
Eine Funktion,
g
diez
die inverse Fakultät dieser Zahl annimmt und ausgibtEs gibt mit ziemlicher Sicherheit noch mehr zu tun. Wenn Sie also etwas sehen, das ich verbessern kann, lassen Sie es mich bitte wissen.
Probieren Sie es online!
Ungolfed und Kommentiert
Probieren Sie es online!
quelle
Javascript (ohne Schleifen!)
Zu diesem Zweck habe ich eine bekannte numerische Approximation der Umkehrung der Stirling-Faktoriellen Approximation verwendet (und mich auch von diesem ... Husten ... Husten ... Code von jemand anderem inspirieren lassen ...).
quelle