Das hat Spaß gemacht! Mit nur drei Ziffern war der Spaß jedoch viel zu früh vorbei. Diese Herausforderung ist ähnlich, aber wir werden den Spaß am Laufen halten.
Die Herausforderung
Drucken Sie so viele Ziffern des Goldenen Schnitts φ wie möglich. Der Goldene Schnitt ist definiert als die Zahl, die φ = (φ + 1) / φ erfüllt, und die ersten 100 Stellen sind gegeben durch:
1.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375 ...
Bei dieser Herausforderung geht es nicht darum, φ zu berechnen! Es geht darum, so viele Ziffern wie möglich auszudrucken, ohne dies zweimal zu tun. Finden Sie also so viele kreative Möglichkeiten, wie Sie können!
Beschränkungen
Das Ausdrucken der Ziffern von φ wäre für sich genommen etwas zu einfach. Hier also die Regeln:
- Sie müssen die Zahl in der Reihenfolge von links nach rechts konstruieren , indem Sie sie entweder Stück für Stück drucken oder indem Sie eine Zeichenfolge von links nach rechts konstruieren und am Ende ausdrucken. Sie können sogar ein Array von Ziffernzeichen generieren und dann verbinden und drucke es aus, solange du es in der richtigen Reihenfolge machst. In den folgenden Regeln beziehen sich "Drucken" und "Ausgabe" möglicherweise auf einen dieser Prozesse (z. B. wenn Sie eine Zeichenfolge erstellen und die Zeichenfolge enthält
1.6
, die als1.6
bereits gedruckt gilt). - Für Ihren Code erhalten Sie ein Budget von 15 Zeichen pro Ziffer . Der Zeitraum zählt nicht zu diesem Budget, sondern muss ebenfalls ausgedruckt werden. Beachten Sie, dass die Einschränkung nur für die Gesamtcodegröße gilt: Sie können mehr als 15 Zeichen für jede Ziffer verwenden, sofern Sie im Durchschnitt nicht mehr verwenden. In der Tat können Sie eine "Schuld" in Zeichen aufbauen und später "auszahlen". ZB zum Ausdrucken haben
1.618
Sie 60 Zeichen. - Standardbibliotheksinhalte / -importe werden nicht auf die Codegröße angerechnet. Aber Sie können diese Beinhaltet-Aliase nicht kostenlos vergeben!
- Sie dürfen weder die Ziffer verwenden, die Sie gerade generieren, noch eine, die Sie bereits gedruckt haben. ZB
1
kann nirgendwo in Ihrem Quellcode erscheinen, weil es die allererste Ziffer ist. Der Code, der die Ausgänge8
in1.618
kann irgendeine oder alle Ziffern verwenden[0234579]
, aber keiner von[168]
. Zu diesem Zweck werden alle Literale, die einer einzelnen Ziffer entsprechen, als diese Ziffer behandelt . Also , wenn Sie die Sprache darstellen kann ,9
wie'\t'
es nicht erlaubt ist, dass überall zu verwenden, in dem Sie eine nicht verwenden konnten ,9
statt. - Sie dürfen nicht mehrere Ziffern gleichzeitig eingeben. Es sollte möglich sein, Ihren Code klar in Abschnitte zu unterteilen, die jeweils eine Ziffer generieren.
Sie dürfen sich nicht auf eine integrierte Funktion, einen mathematischen / booleschen / bitweisen / String-Operator, eine Variable oder Konstante beziehen, die Sie in Code verwendet haben, der eine frühere Ziffer generiert hat. Ausnahmen sind die Umwandlung von Ganzzahlen in Strings, die Verkettung von Strings und die Druckfunktionen, die Sie möglicherweise für jede einzelne Ziffer benötigen. Beachten Sie, dass es keine Rolle, von welchem Namen Sie beziehen sich auf alle integrierten in: nur weil Sie alias einen eingebauten,
PI
sowohl aufp
undq
bedeutet nicht , Sie verwenden erhaltenp
einmal undq
einmal. Ebenso Sie werden einen Namen zweimal verwenden darf , wenn es zwei verschiedene Einbauten bezieht sich, wie Stringlength
und Arraylength
.Wenn Ihre Programmiersprache über keine Funktionen verfügt, sollten Sie nach bestem Wissen entscheiden, wie diese aussehen würden - z. B. für Bash-Skripte. Beim Aufrufen anderer Programme sollten die für Funktionen geltenden Regeln eingehalten werden
- Ihre Einreichung muss in einer einzigen Sprache verfasst sein. Sie müssen also nicht den Interpreter einer anderen Sprache ausführen, um auch auf die integrierten Funktionen dieser Sprache zuzugreifen.
Implikationen
Die folgenden Punkte werden alle durch die obigen Regeln impliziert, aber ich füge sie hier hinzu, um Fragen zu vermeiden, die bereits in der Sandbox aufgetaucht sind:
- Sie dürfen Teile Ihrer Ausgabe nicht überschreiben, indem Sie (normalerweise
'\b'
) ein paar Leerzeichen dazwischen drucken . - Schleifen, die mehrere Ziffern erzeugen / ausgeben, sind verboten. (Schleifen, die eine einzelne Ziffer berechnen, sind jedoch in Ordnung.)
- Die Verwendung einer verschleierten Version
(1 + √5)/2
oder das Teilen von Fibonacci-Zahlen, um mehr als eine Ziffer zu erhalten, ist verboten. - Sie können die 10 Ziffern nicht vorberechnen und in 10 Variablen speichern und dann nur auf diese verweisen, da diese Variablenreferenzen nicht die Ziffer generieren - der Code, der die Variable ausfüllt, verstößt also gegen Regel 6.
- Tatsächlich können Sie keine vorherigen (oder Zwischen-) Ergebnisse wiederverwenden, da dies bedeuten würde, dass zwei Ziffern den Code für die Generierung gemeinsam nutzen würden .
- Andernfalls können Sie beliebige Mittel verwenden (die nicht rein mathematisch sein müssen), um die Ziffern zu generieren. (Und du solltest!)
- Tatsächlich müssen Sie nichts berechnen, wenn Sie mit Ihrer Standardbibliothek die richtigen Ziffern von vielen verschiedenen Stellen abrufen können.
- Sie können einen Operator mehrmals verwenden, während Sie eine einzelne Ziffer
2+2+2
generieren. Daher ist es fair, das erste zu generieren6
(obwohl dies wahrscheinlich nicht das kürzeste ist). - Sie können jedes Literal so oft verwenden, wie Sie möchten, da es sich nicht um integrierte Konstanten handelt. Solange Sie nicht drucken müssen
5
, können Sie so viele5
s in Ihrem Code eingeben, wie Sie möchten. - Sie können die Ausgabe nicht fest codieren, da dies die Verwendung der von Ihnen ausgegebenen Ziffern erfordern würde.
Kurz gesagt: Verwenden Sie keine Methode zum zweimaligen Generieren von Ziffern, und verwenden Sie nicht die Ziffer, die Sie gerade ausgeben oder die bereits gedruckt wurden.
Wenn Sie eine Lücke entdecken, die es Ihnen ermöglicht, eine (quasi) unendliche Punktzahl zu erzielen, ruinieren Sie die Herausforderung bitte nicht, indem Sie sie ausnutzen. Lassen Sie es mich jedoch wissen, damit ich sehen kann, ob die Lücke behoben werden kann, ohne etwas zu beschädigen.
Wertung
Das Programm, das die höchste Anzahl von Ziffern korrekt ausgibt, gewinnt. Im Falle eines Unentschieden unterbricht der kürzere Code das Unentschieden.
Bitte fügen Sie eine kommentierte Version ohne Golf hinzu, die angibt, welcher Teil Ihres Codes welche Ziffer generiert.
PS: Wenn jemand die oben genannten 100 Stellen schlägt, hier noch ein paar mehr .
x = (x+1)/x
(oder x^2 = x+1
) (oder x^2-x+1
) verwendet.