Das Ziel dieses Codegolfs ist es, ein Programm oder eine Funktion zu erstellen, die die Kubikwurzel einer Zahl berechnet und ausgibt, die als Eingabe angegeben wird.
Die Regeln:
- Keine externen Ressourcen
- Keine Verwendung der eingebauten Kubikwurzelfunktionen.
- Keine Verwendung von Methoden / Operatoren, die eine Zahl zur Potenz erheben können (einschließlich Quadratwurzel, 4. Wurzel usw.).
- Ihre Funktion / Ihr Programm muss Gleitkommazahlen und negative Zahlen als Eingabe akzeptieren können.
- Wenn die Kubikwurzel eine Gleitkommazahl ist, runden Sie sie auf 4 Nachkommastellen.
- Dies ist ein Code Golf, der kürzeste Code in Bytes gewinnt.
Testfälle:
27 --> 3
64 --> 4
1 --> 1
18.609625 --> 2.65
3652264 --> 154
0.001 --> 0.1
7 --> 1.9129
Sie können alle obigen Testfälle verwenden, um negative Zahlen ( -27 --> -3
, -64 --> -4
...) zu testen.
Antworten:
J: 16 Zeichen
Lose Übersetzung der Haskell-Antwort:
Testfälle:
Das funktioniert so:
In Worten:
Keine der besten wortreichen Übersetzungen, da es eine dyadische Gabel und ein
~
Recht am Ende gibt.quelle
Haskell - 35
Beispiel läuft:
Außerdem, wenn Sie importieren
Data.Complex
, funktioniert es sogar bei komplexen Zahlen, es gibt eine der Wurzeln der Zahl zurück (es gibt 3):Der
:+
Operator sollte als 'plus i times' gelesen werdenquelle
x=(2*x+n/x/x)/3
Sie anhand der Newton-Methode erklären, warum Sie sie anwenden könnenx=(x+n/x/x)/2
? Es konvergiert langsamer, aber ich kann nicht erklären, warum es konvergiert ...x=cbrt(n)
, dannx=(x+n/x/x)/2
stimmt das. So ist es wahr für Ihren AusdruckSageMath, (69) 62 Bytes
Glauben Sie jedoch nicht, dass Sie das Ergebnis erhalten, es ist sehr schwierig, alle Zahlen zufällig durchzugehen:
Wenn Sie nicht darauf bestanden haben, abzuschneiden:
SageMath, 12 Bytes, wenn
exp
zulässigFunktioniert für alle Dinge: positiv, negativ, null, komplex, ...
quelle
exp
es jedoch erlaubt ist, bin ich auf 12 und überhaupt nicht dumm :)exp
ist die Abkürzung für "Exponentialfunktion". Dabei handelt es sich um eine Funktion, deren Wert eine Konstante ist, die auf die Potenz des Arguments angehoben wird, insbesondere die Funktion, bei der die Konstante e ist kann eine Zahl zur Potenz erheben ",exp
ist nicht erlaubt.Python - 62 Bytes
Wertet mit voller Gleitkommapräzision aus. Die verwendete Methode ist die von Halley . Da jede Iteration dreimal so viele korrekte Stellen wie die letzte erzeugt, sind 99 Iterationen ein wenig übertrieben.
Input-Output:
quelle
0
-2
, tut mir leid.v**(1/.3)
wäre ein sicherer Gewinner.Javascript (55)
function f(n){for(i=x=99;i--;)x=(2*x+n/x/x)/3;return x}
BONUS, allgemeine Formulierung für alle Wurzeln
function f(n,p){for(i=x=99;i--;)x=x-(x-n/Math.pow(x,p-1))/p;return x}
Verwenden Sie für die Kubikwurzel einfach
f(n,3)
Quadratwurzelf(n,2)
usw. Beispiel:f(1024,10)
return2
.Erläuterung
Basierend auf der Newton-Methode:
Suchen:
f(x) = x^3 - n = 0
Die Lösung lautetn = x^3
Die Ableitung:
f'(x) = 3*x^2
Iterieren:
x(i+1) = x(i) - f(x(i))/f'(x(i)) = x(i) + (2/3)*x + (1/3)*n/x^2
Tests
quelle
function f(n){for(i=x=99;i--;)x-=(x-n/x/x)/3;return x}
f=(n)=>eval('for(i=x=99;i--;)x=(2*x+n/x/x)/3')
PHP - 81 Bytes
Iterative Lösung:
quelle
0.0001
kann nach1e-4
und0.00001
nach ersetzt werden1e.5
.0/0
gibtNAN
in PHP 7).$i=0;
ist unnötig (-5 Byte. Wenn nicht,for
würde ein Byte gespart.) Der Platz danachprint
ist nicht erforderlich (-1 Byte).-R
kann mit 3 Bytes sparen$argn
.while(1e-4+$i*$i*$i<$y=abs($x=$argn))
(-2 Bytes).Perl, 92 Bytes
a
gibt einen String mit der Nummer ohne unnötigen Bruchteil oder unbedeutende Nullen am rechten Ende zurück.Ergebnis:
Generiert von
Die Berechnung basiert auf Newtons Methode :
quelle
APL - 31
Nutzt die Tatsache, dass
cbrt(x)=e^(ln(x)/3)
, aber anstatt naiv zu tun⋆
Exponentiatione^x
Taylor / Maclaurin-Reihen verwendet werden.Probeläufe:
Da es in 16 Zeichen eine J-Antwort gibt , muss ich bei APL wirklich schrecklich sein ...
quelle
Java,
207182181Manchmal, wenn ich Golf spiele, trinke ich zwei Bier und spiele wirklich sehr, sehr schlecht
Iterative Newtons Approximationsmethode führt 99 Iterationen aus.
Hier ist der UnGolfed:
quelle
args
Variable in so etwas wie umbenennenz
und 6 Zeichen reduzieren. Sie können das Leerzeichen und die geschweiften Klammern im Körper der for-Schleife entfernen und 3 Zeichen reduzieren. Sie ersetzen10000.0
durch1e4
, wodurch 6 Zeichen. Die Klasse muss nicht öffentlich sein, sodass Sie mehr als 7 Zeichen reduzieren können. Auf diese Weise wird es auf 185 Zeichen reduziert.TI-Basic,
2624 Bytesquelle
^
Operator, nicht wahr?e^
ein einzelner Operator bei der TI-83-Serie? Ich erinnere mich nicht. In jedem Fall verstößt es gegen den Geist der Regeln.exp(ln(x)/3)
oder erlaubene^(ln(x/3))
. Aber irgendwie verstehe ich dasexp(ln(x)/a)
als zu viel Äquivalent,x^(1/a)
um es nach den RegelnJs 57 Bytes
f=(x)=>eval('for(w=0;w**3<1e12*x;w++);x<0?-f(-x):w/1e4')
quelle
Javascript: 73/72 Zeichen
Dieser Algorithmus ist lahm und nutzt die Tatsache, dass diese Frage auf 4 Nachkommastellen begrenzt ist. Es ist eine modifizierte Version des Algorithmus, den ich in der Sandbox vorgeschlagen habe, um die Frage zu überarbeiten. Es zählt von Null bis unendlich
h*h*h<a
, nur mit einem Multiplikations- und Divisionstrick, um die 4-Dezimalstellen-Genauigkeit zu handhaben.Bearbeiten, 4 Jahre später: Wie von Luis Felipe De Jesus Munoz vorgeschlagen, ist die Verwendung
**
des Codes kürzer, aber diese Funktion war 2014 nicht verfügbar, als ich diese Antwort schrieb. Wie auch immer, indem wir es benutzen, rasieren wir einen zusätzlichen Charakter:quelle
h*h*h
können Sieh**3
1 Byte ausführen und speichern**
Operator wurde im Jahr 2015 vorgeschlagen und als Teil von ECMAScript 7 im Jahr 2016 akzeptiert. Zu dem Zeitpunkt, als ich das schrieb, war**
in der Sprache also nichts vorhanden .Javascript - 157 Zeichen
Diese Funktion:
Ungolfed erklärte Version:
quelle
PHP, 61
Basierend auf Newtons Methode. Leicht modifizierte Version von Michaels Antwort :
Es funktioniert mit negativen Zahlen, kann Gleitkommazahlen verarbeiten und rundet das Ergebnis auf 4 Zahlen nach dem Komma, wenn das Ergebnis eine Gleitkommazahl ist.
Arbeitsdemo
quelle
for($x=1;++$i<100;)...
. Die Verwendung vordefinierter Variablen als Eingabe wird jedoch im Allgemeinen verpönt . Besser nutzen$argv[1]
oder$argn
.Befunge 98 - In Arbeit
Diese Sprache unterstützt keine Gleitkommazahlen. Dies versucht, sie zu emulieren. Es funktioniert derzeit für positive Zahlen, die nicht
0
nach dem Komma beginnen (meistens). Es werden jedoch nur 2 Dezimalstellen ausgegeben.Es funktioniert, indem der Teil vor dem Dezimalpunkt eingegeben und mit multipliziert wird
100000
, dann den Teil nach dem Punkt eingeben und die beiden Zahlen addieren. Die zweite Zeile zählt solange, bis der Würfel größer als die eingegebene Zahl ist. Dann extrahiert die dritte Zeile die Dezimalzahl aus der Ganzzahl.Wenn mir jemand sagen kann, warum die dritte Zeile nur durch teilt
100
, um die korrekten Werte zu erhalten, sagen Sie es mir bitte.IOs:
quelle
Smalltalk, 37
Kredit geht an Mniip für den Algorithmus; Smalltalk-Version seines Codes:
Eingabe in n; Ausgabe in x:
oder als Block
quelle
GameMaker-Sprache, 51 Byte
quelle
Haskell: 99 ° C
Kann @mniip in der Klugheit nicht schlagen. Ich habe gerade eine binäre Suche durchgeführt.
Ungolfed:
quelle
d
(like(l#h)x
) verwenden, um ein Byte für jeden Aufruf zu speichern.c
dann wirdid>>=(0#)
.c < x
.1>0
anstelle von verwendenTrue
.J 28
Mit der Newton-Methode finden Sie die Wurzel von
x^3 - X
Aktualisierungsschritts gefundenx - (x^3 - C)/(3*x^2)
, wobei x die aktuelle Schätzung und C die Eingabe ist. Nachrechnen ergibt den lächerlich einfachen Ausdruck von(2*x+C/x^2) /3
. Bei negativen Zahlen ist Vorsicht geboten.Implementiert in J, von rechts nach links:
|
Nimm abs von beiden Argumenten, gib sie weiter^:_
Bis zur Konvergenz tun(%*~@])
istC / x^2
(*~ y
ist äquivalent zuy * y
)+:@]
ist2 x
3%~
durch drei teilen. Dies ergibt die positive Wurzel*@[ * positive_root
multipliziert positive Wurzel mit dem Zeichen von C.Testlauf:
quelle
AWK, 53 Bytes
Beispielverwendung:
Vielen Dank an @Mig für die
JavaScript
Lösung, von der diese abgeleitet ist. Es läuft überraschend schnell, da diefor
Schleife die Iteration benötigt, um nicht mehr geändert zu werden.quelle
C 69 Bytes
Nur eine weitere Implementierung von Newtons Methode. Probieren Sie es online!
quelle
Stax , 10 Bytes CP437
Online ausführen und debuggen!
Erläuterung
Verwendet die entpackte Version, um zu erklären.
quelle
JAVA-Lösung
public BigDecimal cubeRoot (BigDecimal number) {
quelle
Python-Lösung
quelle