Herausforderung
Die Herausforderung besteht darin, ein Programm zu schreiben, das eine positive Zahl a
und eine Zahl ungleich Null annimmt b
und ausgibt a^b
(a wird zur Potenz erhoben b). Sie können nur + - * / abs()
als mathematische Funktionen / Operatoren verwenden. Diese können nur auf skalare Werte angewendet werden, nicht jedoch auf ganze Listen oder Arrays.
Beispiele:
1.234 ^ 5.678 = 3.29980
4.5 ^ 4.5 = 869.874
4.5 ^-4.5 = 0.00114959
Relevant: http://xkcd.com/217/
Einzelheiten
Sie können eine Funktion oder ein ähnliches Konstrukt für die Verwendung in der Konsole schreiben. Wenn Sie die Konsoleneingabe nicht verwenden können, können Sie davon ausgehen, dass beide Nummern in Variablen und Ausgaben über die Standardausgabe oder das Schreiben in eine Datei gespeichert werden. Die Ausgabe muss auf mindestens 4 Stellen genau sein. Sie können davon ausgehen, dass beide a
und b
ungleich Null sind. Eine Laufzeit von deutlich mehr als 1 Minute ist nicht akzeptabel. Die geringste Anzahl von Bytes gewinnt. Bitte erläutern Sie Ihr Programm und Ihren Algorithmus.
EDIT: Nur positive Basen müssen berücksichtigt werden. Sie können davon ausgehen a>0
. Beachten Sie, dass beide Zahlen keine ganzen Zahlen sein müssen !!!
quelle
-0.5 ** 0.5
sein?Antworten:
Python, 77
Wie bei einigen anderen Antworten basiert dies auf log und exp. Die Funktionen werden jedoch durch numerisches Lösen gewöhnlicher Differentialgleichungen berechnet.
Entspricht es den Anforderungen? Für die Beispiele in der Frage ja. Für große a wird es sehr lange dauern. Für große a oder b wird es ungenau.
Beispiele:
Update: flawr bat um mehr Details zur Mathematik, also los geht's. Ich habe folgende Anfangswertprobleme betrachtet:
Wenn ich den Wert von t so finde, dass x (t) = a, dann habe ich y (t) = exp (bt) = a ^ b. Der einfachste Weg, ein Anfangswertproblem numerisch zu lösen, ist die Euler-Methode . Sie berechnen die Ableitung, die die Funktion haben soll, und machen dann einen Schritt in Richtung der Ableitung und proportional dazu, aber skaliert durch eine winzige Konstante. Also mache ich das, mache winzige Schritte, bis x so groß wie a ist, und sehe dann, was y zu dieser Zeit ist. Nun, so habe ich es mir vorgestellt. In meinem Code wird t nie explizit berechnet (es ist 1e-7 * die Anzahl der Schritte der while-Schleife), und ich habe einige Zeichen gespeichert, indem ich stattdessen die Berechnungen für x mit a durchgeführt habe.
quelle
JavaScript (E6) 155
174 191Edit 2 Wie von @bebe vorgeschlagen, mit rekursiver Funktion (schlechter, aber kürzer).
Leicht geänderte R-Funktion, um zu viel Rekursion zu vermeiden.
Test-Suite hinzugefügt. Die Funktion funktioniert gut für Basen <3000 und Exponenten im Bereich -50..50. Mehr und bessere Präzision golfen
bearbeiten
Jede reelle Zahl kann mit einer rationalen Zahl angenähert werden (und IEEE-Standard-'reale'-Zahlen speichern tatsächlich Rationen). Jede rationale Zahl kann als Bruch a / b mit den ganzen Zahlen a und b ausgedrückt werden. x ^ (a / b) ist Wurzel b von (x ^ a) oder (Wurzel b von x) ^ a. Die ganzzahlige Potenzierung ist durch Quadrieren recht einfach. Die Ganzzahlwurzel kann mit numerischen Methoden approximiert werden.
Code
Test In FireFox oder Firebug - Konsole
quelle
e&1&&(r*=b)
außer der Multiplikationr
mit bedeutetb
?if(e&1 != 0) r *= b
P=(x,e)=>(F=(b,e,r=1)=>e?F(b*b,e>>1,e&1?r*b:r):r,R=(b,e,g=1,y=1e-16,d=(b/F(g,e-1)-g)/e)=>d>y|d<-y?R(b,e,g+d):g,e<0&&(x=1/x,e=-e),f=1<<24,F(R(x,f),e*f))
(Ich muss müde sein)Haskell, 85
90Standard-Exp-Log-Algorithmus. Jetzt mit anderem Namen, ein paar Zeichen mehr abschneiden:
raise
heißt jetzt(%)
oder%
in der Infixnotation und verbraucht sogar weniger Bytes:4.5%(-4.5)
Die ungolfed Version verwendet auch nur 172 Bytes:
quelle
JS (ES6), 103 Bytes
Beispiele:
Verwenden Sie Taylor-Serien.
b^x = 1 + ln(b)*x/1! + (ln(b)*x)^2/2! + (ln(b)*x)^3/3! + (ln(b)*x)^4/4! + ...
mit natürlicher Logarithmusnäherung :
ln(b) = (1-1/x) + (1-1/x)^2/2 + (1-1/x)^3/3 + (1-1/x)^4/4 + ...
Ich habe 128 Iterationen zum Berechnen verwendet
b^x
(mehr Iterationen sind aufgrund der Fakultät schwierig) und 262144 Iterationen fürln(b)
quelle
e(80,5) ->1555962210.2240903
- sollte 3276800000 seinGolflua 120
Ich nutze die Tatsache, dass
und schrieb meine eigenen
log
&exp
Funktionen. Die Wertea
undb
müssen in Zeilenumbrüchen eingegeben werden, wenn sie im Terminal ausgeführt werden:Probeläufe:
Eine ungolfed Lua Version ist,
quelle