Die Herausforderung
Die plastische Zahl ist eine Zahl im Zusammenhang mit dem Goldenen Schnitt mit vielen interessanten mathematischen Eigenschaften. Daher gibt es viele Ansätze, mit denen die Anzahl berechnet werden kann.
Um die Nummer für die Zwecke dieser Herausforderung genau anzugeben, verwenden wir die folgende Definition (obwohl es viele gleichwertige Definitionen gibt und Sie jede beliebige Definition verwenden können, solange es sich um dieselbe Nummer handelt):
Die plastische Zahl ist eine reelle Zahl ρ, so dass ρ ³ = ρ +1 ist.
Ihre Herausforderung besteht darin, ein Programm oder eine Funktion zu schreiben, die eine Ganzzahl x als Eingabe (mit x > 1) verwendet und eine Annäherung an ρ als Ausgabe erzeugt. Je größer der Wert von x, desto näher kommt die Ausgabe an ρ ( mit höchstens endlich vielen Ausnahmen, wobei der gleiche Wert für diesen Zweck als "näher" gilt), und für jede positive Zahl δ gibt es eine Eingabe x in Ihrem Programm, die eine Ausgabe erzeugt, die innerhalb von δ von ρ liegt .
Klarstellungen
- Wenn Sie über eine Methode ausgeben, die von Natur aus Zeichenfolgen ausgibt (z. B. den Standardausgabestream), können Sie die Ausgabe entweder als Dezimalzahl (z. B.
1.3247179572
) oder als Verhältnis von zwei Ganzzahlen mit einem/
Zeichen dazwischen formatieren . - Wenn Sie in Ihrer Programmiersprache einen Wert ausgeben (z. B. von einer Funktion zurückkehren), muss dieser vom Typ Festkomma, Gleitkomma oder Rational sein. (Insbesondere können Sie keine Datentypen verwenden, in denen Zahlen symbolisch gespeichert werden, es sei denn, sie dienen nur zum Speichern des Verhältnisses zweier Ganzzahlen. Wenn Sie also Mathematica oder eine ähnliche Sprache verwenden, müssen Sie die zusätzlichen Zahlen einschließen Code, um die Ziffern der Ausgabe zu generieren.)
- Ihre Antwort muss in einer hypothetischen Variante Ihrer Sprache funktionieren, in der ganze Zahlen beliebig groß sein können und der Speicher (einschließlich Stapel) unbegrenzt ist. Sie können nicht davon ausgehen, dass die Gleitkomma-Arithmetik in Ihrer Sprache willkürlich genau ist, sondern müssen stattdessen ihre tatsächliche Genauigkeit verwenden (was bedeutet, dass die Ausgabe einer Gleitkommazahl nur in Sprachen möglich ist, in denen die Genauigkeit von Gleitkommazahlen möglich ist) zur Laufzeit gesteuert).
- x kann eine beliebige Bedeutung haben (solange die Erhöhung die Ausgabe genauer macht). Ich stelle mir vor, dass bei den meisten Einsendungen die Anzahl der zu erzeugenden Stellen der Ausgabe oder die Anzahl der Iterationen des von Ihrem Programm verwendeten Algorithmus zur Konvergenz der plastischen Zahl gesteuert wird. Andere Bedeutungen sind jedoch akzeptabel.
Testfall
Hier sind die ersten Ziffern der Kunststoffnummer:
1.32471795724474602596090885
Weitere Ziffern sind auf OEIS verfügbar .
Siegbedingung
Wie für Code-Golf üblich , ist kürzer besser, gemessen in Bytes. Sie können jedoch auch dann Antworten veröffentlichen, wenn Sie nicht gewinnen, sofern Sie den vorhandenen Antworten etwas hinzufügen (z. B. eine andere Sprache oder einen anderen Algorithmus).
Antworten:
Python 2 , 49 Bytes
Probieren Sie es online!
Die Idee ist, das
ρ
mitρ³=ρ+1
als Bruch auszudrücken,n/x
dessen Nennerx
der Eingabegenauigkeitsparameter ist. Wir nehmen(n/x)³=n/x+1
und klären Nenner, um zu bekommenn³=x²(x+n)
.Da die LHS
n
schneller ansteigt als die RHS, können wir den Gleichheitspunktn
als kleinsten mit approximierenn³≥x²(x+n)
. Der Code zählt,n
bis dies der Fall ist, beginnend mitx
dem kleineren.Eine kleine Bytespeicherung besteht darin, beide Seiten durch
x²
Schreiben zu teilenn³/x²≥x+n
(in derwhile
Bedingung negiert ). Dies ist eine Unterteilung des Bodens im Code, aber der Bruchteil des Verlusts ist vernachlässigbar.Eine Alternative gleicher Länge lautet stattdessen
x
wie der Zähler:Python 2 , 49 Bytes
Probieren Sie es online!
quelle
2**input()
anstatt nur behoben werdeninput()
. dann ist jede Annäherung mindestens so genau wie die vorhergehende.Mathematica, 20 Bytes
Die eingebaute
Root
Funktion von Mathematica liefert die Lösungen für eine Polynomgleichungf[x] == 0
.Erläuterung
Beispiel-E / A
quelle
Root[x^3-x-1,1]~N~#&
einwandfrei (obwohl nicht gesagt wird, dassx
es sich um eine Variable handelt) bei gleicher Bytezahl.Mathematica, 27 Bytes
-1 Byte von Martin
-2 Byte von Ovs
Eingang
Ausgabe
quelle
Solve[x^3==x+1>2,x]~N~#&
für 24 Bytes{{x -> 1.32...}}
jedoch. Vielleicht möchten Sie mit ais prüfen, ob dies ein gültiges Ausgabeformat ist.{1.32...}
aktuell, aber dieses Format ist wahrscheinlich weniger umstritten.sed ,
6760 (59 + 1) BytesProbieren Sie es online!
+1 für das
-E
Flag (ERE anstelle von BRE). Eingabe und Ausgabe sind beide unär: Eingabe 11111 für x = 5, z. B. Ausgabe ist ein Bruchteil zweier unärer Zahlen: Die oben erwähnte Eingabe 11111 ergibt Ausgabe 11111/1111 (5/4 in Dezimal).Approximiert die plastische Zahl als Bruch zwischen aufeinanderfolgenden Elementen der Padovan-Sequenz .
quelle
b
Befehl kein Leerzeichen , können es aber noch kürzer machen, indem Sie das leere Label (:
undb
ohne Argument) verwenden. tio.run/#%23K05N@f@/…t
stattdessen verwendeb
, also ist das ein ziemlich netter Speichervorgang. Danke :)Mathematica, 27 Bytes
Verwendet eine abgeschnittene Approximation der verschachtelten kubischen Radikalform ³√ (1 + ³√ (1 + ³√ (1 + ...)) . Während die Ausgabe immer x-1 Dezimalstellen hat, ist das Ergebnis tatsächlich ungenauer, da der Ausdruck langsamer als eine Ziffer pro Iteration konvergiert ( x wird auch als Anzahl der verschachtelten Radikale verwendet, die berechnet werden). Zum Beispiel ergibt x = 100
wo der überstrichene Teil richtig ist.
quelle
dc
, wurde aber geschwächt, weil sich herausstellte, dass es keine Kubikwurzeloperation gibt, und eine Zahl hochzuschalten Mathematica, um entsprechende Builtins zu haben ...CubeRoot
es dafür aber niemanden, der Bytes hat.Oktave , 50 Bytes
Probieren Sie es online!
Definiert eine anonyme Funktion mit
n
der gewünschten Anzahl von Ausgabestellen.Diese Antwort
digits
gibt die aktuelle Einstellung für die Anzahl der Stellen in arithmetischer Form mit variabler Genauigkeit zurück. Dies bedeutet, dass wir es nur in einer anonymen Funktion verwenden können, ohne dass Fehler bei "Zu vielen Ausgabeargumenten" auftreten.vpasolve
Davon abgesehen ist es ganz einfach: steht für Variable-Precision Arithmetic Solve (Arithmetisches Lösen mit variabler Genauigkeit), mit der Präzision, die beim letzten Aufruf von festgelegt wurdedigits
. Davpa
es sich bei Octave um einen symbolischen Datentyp handelt, der gemäß Spezifikation gesperrt ist, wird nur die gesamte Funktion eingebundenchar(...)
, um die Zeichenfolgenausgabe zu erhalten. Beachten Sie, dass insolve
undvpasolve
dasf==0
impliziert ist, alsor^3==r+1
durch ersetzt wurder^3-r-1 (==0)
quelle
MATL (
27 -28 Byte)Meine erste Lösung (27 Bytes)
Probieren Sie es online!
Es ist sicherlich nicht optimal, ich gewöhne mich immer noch an MATL.
Erläuterung:
Ich erstelle eine Padovan-Sequenz bis zu Eingabe + 3 und finde dann das Verhältnis der letzten beiden Zahlen.
Richtige Bruchausgabe
(35 Bytes)(28 Bytes, @Sanchises):Die erste Lösung erfüllt jedoch nicht die Forderung nach willkürlicher Genauigkeit als Gleitkomma-Grenze der Standard-MATL-Einstellungen. Anstatt mehrere Bytes hinzuzufügen, um diese Genauigkeit zu erhöhen, ist es einfacher, den richtigen Bruchweg einzuschlagen und einen Bruch der letzten beiden Ganzzahlen in das (N-1) -te und das N- te Element der abgeschnittenen Padovan-Folge zu schreiben .
zB "114/86"
7BG: t @) y @ 1 +) + h] tG3 +) V '/' YcyG2 +) VYcMit freundlicher Genehmigung von User @Sanchises. :)
Probieren Sie es online!
Nicht iterative Auswertung:
Mein kürzester Code für die 'genaue' Version ist (23 Bytes):
Probieren Sie es online!
... gibt aber keine willkürliche Genauigkeit. Ich frage mich, ob jemand dies anpassen kann, um die Regeln zu erfüllen (verwenden Sie die Eingabe usw.) und trotzdem weniger als 5 Bytes hinzufügen kann? : P
quelle
1+
kann auf verkürzt werden. InQ
Anbetracht dessen können Sie@)y@1+)+
mit nur ersetzen@tQh)s
. Darüber hinaus können SieJ
mit das Ende eines Arrays angeben. und schließlich ist MATL nicht zwischen normalen Arrays und Zeichenfeldern unterscheiden, so dass Sie ersetzen könnenYc
durchh
(Sie brauchen nicht die zusätzliche FunktionalitätYc
). Dies ergibt nur 28 Bytes:7BG:"t@tQh)sh]tJ)V47hyJq)Vh&
(Beachten Sie das&
, um überflüssige Ausgaben zu vermeiden und'/'
durch 47 zu ersetzen ).7B
lllv
J
standardmäßig enthalten1j
, aber die ZwischenablageL
enthält auch viele nützliche Indexierungsfunktionen (Note , die1j
gleichend
in MATL).M ,
1514 BytesProbieren Sie es online!
Algorithmus
Dies verwendet Rationals und Newtons Methode. Insbesondere werden für die Eingabe x die ersten x- Iterationen mit dem Startwert x angewendet.
Wir versuchen, eine bestimmte Wurzel des Polynoms p (t) = t³ - t - 1 zu finden . Newtons Methode erreicht dies, indem sie einen Startwert t 0 - ausreichend nahe bei ρ - annimmt und eine Folge rekursiv durch
t n + 1 = t n - p (t n ) / p '(t n ) definiert. .
Da p '(t) = 3t² -1 erhalten wir
t n + 1 = t n - (t n ³ - t n - 1) / (3t n ² - 1) = (3t n ³ - t n - t n ³ + t n + 1) / (3T n ² - 1) = (2t n ³ + 1) / (3T n ² - 1) .
Beachten Sie, dass die anfängliche Annäherung x zunehmend schlechter als bekommt x zunimmt. Während die Ausgabe für x = 3 etwas ungenauer ist als die Ausgabe für x = 2 , sollte dies für große Werte von x kein Problem sein , da Newtons Methode quadratisch zu ρ konvergiert .
Wie es funktioniert
quelle
µ¡
...Julia 0,5 ,
4440 BytesVerwendet Rationals und Newtons Methode.
Probieren Sie es online!
quelle
05AB1E , 23 Bytes
Probieren Sie es online!
Direkter Port von /codegolf//a/126822/59376 von xnor.
quelle
Kohle , 28 Bytes
Probieren Sie es online! Link zum ausführlichen Modus. Auch habe ich anscheinend versaut
Divide
undIntDivide
: |Verwendet die gleiche Methode wie die Antworten in Python und JavaScript.
quelle
NewStack , 14 Bytes
Nervenzusammenbruch:
Wie es funktioniert:
Die Formel (2x 3 +1) / (3x 2 -1) ergibt sich aus der Vereinfachung der Newtonschen Methode für die Gleichung x 3 = x + 1. Sie finden es hier . Diesen Vorgang unendlich oft zu wiederholen, konvergiert gegen die plastische Zahl. Die Konvergenzrate ist mit etwa 2,6 Dezimalstellen pro Iteration ziemlich schnell.
Padovan-Sequenzalternative,
272517 BytesNervenzusammenbruch:
-2 Bytes durch Auswahl einer besseren Druckstrategie
-8 Bytes durch Auswahl einer besseren Methode zum Indizieren des Stapels
Wie es funktioniert:
Während die Padovan-Sequenz fortgesetzt wird, konvergiert das Verhältnis der letzten beiden Elemente zur plastischen Zahl.
quelle
Clojure, 46 Bytes
Verwendet die iterierte Kubikwurzelformel. Das ist etwas interessanter, aber länger:
quelle
Javascript, 36 Bytes
Funktioniert genauso wie die oberste Python-Antwort. Nein,
console.log
da beim Ausführenf(x)
in der Konsole diese automatisch protokolliert wird.quelle
> <> , 38 + 3 = 41 Bytes
Erwartet, dass die Eingabe beim Programmstart auf dem Stack vorhanden ist, also +3 Byte für das
-v
Flag.Probieren Sie es online!
Führt effektiv eine binäre Suche durch, um den Ausgabewert einzugrenzen. Durch
x
Erhöhen wird die Anzahl der durchzuführenden Iterationen erhöht.Bearbeiten: Berechnung leicht überarbeitet, um 1 Byte zu sparen, Vorgängerversion:
quelle
k, 27 Bytes
Probieren Sie es online! Dies setzt unendliche ganze Zahlen voraus (was leider nicht wahr ist). Es wird die Padovan-Sequenz verwendet .
quelle
TI-BASIC, 21 Bytes
Verwendet diese rekursive Formel .
Interessanterweise ergibt eine harte Codierung der Zahl und eine Rundung derselben Byteanzahl:
TI-BASIC, 21 Bytes
Verwendet diese trigonometrische Formel .
quelle
Your answer must work in a hypothetical variant of your language in which integers can be arbitrarily large, and memory (including stack) is unlimited. You may not assume that floating-point arithmetic in your language is arbitrarily accurate, but must instead use its actual accuracy (meaning that outputting a floating-point number is only going to be possible in languages where the accuracy of floating-point numbers can be controlled at runtime).
C # , 317 Bytes
Es gibt das Ergebnis als Bruch zurück.
Erläuterung
Es verwendet die Newtonsche Methode mit x Iterationen, um die Wurzel des Polynoms p ^ 3-p-1 = 0 zu finden. Die Formel lautet x_n = 1- (f (x_ (n-1))) / (f '(x_ (n-1))) und x_0 ist ein Ausgangspunkt.
Die Polynomableitung ist 3p ^ 2-1, und lassen Sie uns x_ (n-1) = b / c sagen. Mit der obigen Formel erhalten wir dann x_n = (2 b ^ 3 + c ^ 3) / (3 b ^ 2 cc ^ 3). Sagen wir auch, dass wir mit 1 beginnen. Dies geschieht, wenn x = 2 ist, weil x> 1 und eine ganze Zahl ist. Identifizierter und kommentierter Code:
quelle
PHP, 86 Bytes
PHP Sandbox Online
Erstellt die Padovan-Spirale und druckt das Verhältnis der letzten beiden Zahlen.
quelle
Axiom 96 Bytes
Ergebnisse
Wie Sie sehen können, sollte h (2) 1,32 und nicht 1,33 sein, daher liegt ein Fehler in den letzten Ziffern vor
Dann wäre da einer von 110 Bytes
Es wird die Formel für die Auflösungsgleichung der Klasse III des Typs x ^ 3-3 * p * x-2 * q = 0 verwendet, wenn q ^ 2-p ^ 3> = 0 ist, dh m = sqrt (q ^ 2- p ^ 3) und x = (q + m) ^ (1/3) + (qm) ^ (1/3)
In unserem Fall r ^ 3-r-1 = 0 kann dies geschrieben werden als r ^ 3-3 * (1/3) r-2 * (1/2) = 0, so dass p = 1/3 q = 1/2 m = 1 / 4-1 / 27 = 23/108 x = (0,5 + m) ^ (1/3) + (0,5-m) ^ (1/3)
Diesmal wird die Newton-Iteration mit dem Startpunkt r = 1 verwendet
es ändert sich in der Funktion der Ziffernwert, um ein Objekt von n + 1 Ziffern nach dem Gleitkomma zu erhalten. Am Ende wird der Wert von digits () dem vorhergehenden Wert zugewiesen.
quelle
Ruby , 35 Bytes
Probieren Sie es online!
quelle