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 .
quelle
x = (x+1)/x
(oderx^2 = x+1
) (oderx^2-x+1
) verwendet.Antworten:
PHP, 100 Stellen
Ich bin wahrscheinlich dabei, die Regeln ein wenig zu ändern, aber PHP hat Dutzende von Konstanten zur Auswahl:
Dies ist wahrscheinlich kein sehr portabler Code, aber auf meinem System funktioniert er einwandfrei. Hier ist der Code, der es generiert hat:
quelle
<?for(;;);
Verwendet 9 MB Speicher. Jetzt weiß ich, warum ... Ich mag @ kernighs selbst auferlegte Einschränkung Nr. 7, die diese Art von Lücke schließt. Für das, was es wert ist, ist die Ausgabe auf meinem System: codepad.org/wSrtJBcoPerl - 37 Stellen
Derzeit 392 Byte (10,6 pro Ziffer).
Ausgabe:
Selbst auferlegte Einschränkungen
Ich habe ein paar zusätzliche Einschränkungen hinzugefügt, um die Verwendung von Sprachfunktionen zu beschränken, die das Problem trivialisieren würden. Beispielsweise werden die Array-Dereferenzierung
@{...}
und der Array-Endindex$#{...}
nur einmal verwendet. Jedes Array verwendet wird , in einer anderen Art und Weise erzeugt (vergleiche[c,c,c,c]
,[b..j]
,split('',$~)
,map(glob,"{,,,}{,}")
). Darüber hinaus wird kein Symbol oder Bareword mehrmals verwendet, obwohl dies in der Herausforderungsbeschreibung ausdrücklich erlaubt ist. Ich denke, es ist eine gute Idee für Perl (oder jede Sprache mit speziellen Int-Only-Variablen (gibt es noch andere?)), Weil es die Anzahl der impliziten Int-Konvertierungen begrenzt.Stücke
quelle
Python 2.7, 19 Ziffern, 231 relevante Zeichen
quelle
Ruby 2.1 für 54 Ziffern, 808 Zeichen
Dieses Programm funktioniert mit
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-openbsd]
. Andere Systeme als OpenBSD 5.5 haben möglicherweise unterschiedliche Werte für einige Ziffern.Interpretationen
Die Einschränkungen dieser Herausforderung, insbesondere Einschränkung 6, sind für Ruby nicht genau. Also füge ich meine eigenen Interpretationen hinzu:
$<.fileno
und der Doppelpunkt erhält Konstanten wie inIO::LOCK_NB
. Der Name der Methode oder Konstante ist Teil der Operation. Da()
.
::
es sich nicht um Operatoren handelt, wende ich keine Einschränkung 6 auf sie an. Ich kann sie wiederverwenden, um mehr Ziffern zu generieren.Array#count
undEnumerable#count
sind nicht dieselbe Funktion für die Einschränkung 6. Beide Methoden verhalten sich gleich,Array#count
überschreiben jedochEnumerable#count
eine andere Implementierung. Wenn ichArray#count
eine Ziffer generiere, kann ichEnumerable#count
eine andere Ziffer generieren.Mutex.new
,Random.new
,Time.new
und verweist so auf das gleiche Verfahren,Class#new
. Ich benutzeSignalException.new
, um eine Ziffer zu generieren. Wegen Einschränkung 6 darf ich nie wieder verwendenClass#new
.Float
undIO
Konstanten! Ich benutzeIO::LOCK_NB
, um eine Ziffer zu generieren. Wegen Einschränkung 6 darf ich nie wieder verwendenIO
. Diese Interpretation bindet nur Ruby und keine anderen Sprachen, in denen Paketnamen keine Konstanten sind.[]
{}
//
''
. Ich kann solche Literale immer verwenden, um mehr Ziffern zu generieren.File::APPEND
undIPSocket::LOCK_UN
sind zwei Namen für die gleiche Nummer 8. Die Einschränkung 6 besagt: "Es spielt keine Rolle, unter welchem Namen Sie auf einen eingebauten Namen verweisen." WeilFile::APPEND
undIPSocket::LOCK_UN
unterscheiden sich nur durch den Namen, müssen sie die gleiche Konstante sein, damit ich sie nicht für zwei Ziffern verwenden kann.$SAFE
ist eine integrierte globale Variable, keine Funktion, kein Operator, keine Konstante und kein Literal.$SAFE
hat den Wert 0. Mit der Lücke kann ich wieder$SAFE
jede Ziffer 0 im Programm generieren. Ich schließe die Lücke, indem ich Restriktion 6 interpretiere, um auch globale Variablen einzuschränken.Bemerkungen
Die erste Zeile ist
#!ruby -rdate -rdigest -ropenssl -rprime -rset -rsocket
. Ruby parst diese Zeile und Lasten sechs Teile seiner Standardbibliothek, als ob durchrequire 'date'
,require 'digest'
und so weiter. Ich zähle diese 56 Zeichen nicht, da die Einschränkung 3 "Standardbibliotheksimporte / -einschlüsse" ausschließt.Der Rest des Programms ruft
print
mit einer langen Liste von Argumenten auf, um sie in Zeichenfolgen umzuwandeln und in der angegebenen Reihenfolge auszudrucken. Die Argumente sind diese:1
from2/2
: division Fixnum # /.
from?.
: Literal Single Character String6
von9-3
: subtraction Fixnum # -1
von3&5
: bitwise und Fixnum # &3
wieder verwenden.8
von2*4
: multiplication Fixnum # *0
from2^2
: bitweises Exklusiv-oder Fixnum # ^3
von7%4
: modulus Fixnum #%3
von55>>4
: Rechtsverschiebung Fixnum # >>9
von5+4
: zusätzlich Fixnum # +8
von2<<2
: Linksverschiebung Fixnum # <<8
von-~7
: Negation des Komplements Fixnum # - @ Fixnum # ~7
from5|2
: bitwise oder Fixnum # |4
von2**2
: Exponentiation Fixnum # **9
aus(2r+2+5).to_i
: rationale Addition Rational # + Rational # to_i2r
sind neu in Ruby 2.1.2r+2
ruft Rational # + auf und gibt ein anderes Rational zurück;2r+2+5
ruft Rational # + wieder.2/1
und schwimmt wie2.0
. Um dies zu beheben, konvertiere ich in eine Ganzzahl: to_i rundet gegen Null, ceil rundet auf, floor rundet ab.8
von(2.2+5).ceil
: float addition Float # + Float # ceil()
und Punkte verwenden.
.9
aus(55r/5-2).floor
: rationale Division und Subtraktion Rational # / Rational # - Rational # Etage4
from(2.2*2).to_i
: float multiplication Float # * Float # to_i8
aus(2r*2*2).ceil
: rationale Multiplikation Rational # * Rational # ceil4
aus(2.2**2).floor
: rationale Potenzierung Rational # **8
von2.to_bn<<2
: Linksverschiebung mit OpenSSL-Nummer Fixnum # to_bn OpenSSL :: BN # <<2
from__LINE__
: Magische Konstante für die aktuelle Zeilennummer0
from$<.to_i
: Dateideskriptor der Standardeingabe IO # to_i4
fromIO::LOCK_NB
: Flag für nicht blockierende DateisperreIO
. Nach Interpretation 7 darf ich keine Konstante mit dem Wert 4 mehr verwenden.5
fromErrno::EIO::Errno
: Nummer für Ein- / Ausgabefehler8
fromFile::APPEND
: Flag zum Anhängen an eine DateiIO
, sondernFile
erben Konstanten ausIO
, soFile::APPEND
eine andere Art und Weise zu bekommenIO::APPEND
.6
from'aaaaaa'.size
: Länge des Strings String # size8
from?a.encoding.name.sub(/\D+/,'')
: Teil des Namens der Kodierung String # encoding Kodierung # name String # sub3
from%w[a a a].size
: Länge des Arrays Größe des Arrays4
from%w[a b c d].to_set.size
: Anzahl der Elemente in set Array # to_set Set # size3
from%w[a a a].count
: zählt alle Elemente Array # count6
vonSocket::AF_NS
: Nummer für NS-Adressfamilie5
vonDate.jd(Date::ITALY).wday
: Wochentagsnummer für Freitag, den 15. Oktober 1582, als Italien auf gregorianischen Kalender umstellte Datum :: jd Datum # wTag6
from*Digest::MD5.digest(?j).scan(/\d/)
: erste ASCII-Ziffer im binären MD5-Digest von "j" Digest :: MD5 :: digest String # scan*
übergibt die Array-Elemente als Argumente anprint
. Dieses Array ist ["6"].3
fromSet[?a,?b,?c].count
: count all elements Set :: [] Enumerable # count8
fromSignalException.new('FPE').signo
: Nummer der SIGFPE- Klasse # new SignalException # signo1
fromFloat::ROUNDS
: Rundungsmodus, hier 1 für Rundung zum nächsten1
frombegin
(newline)exit false
(newline)rescue Object
(newline)$!.status
(newline)end
: Exit-Status für FehlerSystemExit.new(false).status
, aber nach Interpretation 3 kann ich Class # new nicht mehr aufrufen . Stattdessen hebe ich ein SystemExit auf und rette es.7
fromProcess::RLIMIT_NPROC
: Anzahl für Ressourcenlimit für die Anzahl der Prozesse für einen Benutzer7
from:aaaaaaa.size
: Länge des Symbols Symbol # size2
fromPrime.first
: erste Primzahl Enumerable # first0
from?/.next
: nächster String nach "?" String # next3
from{a:p,b:p,c:p}.size
: Länge des Hash Hash # size String # p0
fromSTDIN.lineno
: aktuelle Zeilennummer für Standardeingabe IO # lineno$<
. Ich benutzeSTDIN
. Der Unterschied besteht darin, dass$<
es sich um eine globale Variable undSTDIN
eine Konstante handelt. Ein Programm kann$<
auf einen anderen Eingang eingestellt sein, aber esSTDIN
ist immer der ursprüngliche Wert von$<
.3
from?a.crypt('at')[/\d/]
: erste ASCII-Ziffer im verschlüsselten Passwort String # crypt String # []0
from{a: :a}.find_index([:a,:a])
: Index des ersten Schlüssels: a, Wert: a in Hash Enumerable # find_index9
from/b/=~'aaaaaaaaab'
: Index, bei dem die Zeichenfolge mit / b / Regexp # = ~ übereinstimmt1
from[?a,?b].index(?b)
: Index des ersten "b" im Array Array # index7
from:aaaaaaab=~/b/
: Index, bei dem das Symbol mit / b / Symbol # = ~ übereinstimmt9
from?\t.ord
: ASCII-Wert der Registerkarte "\ t" String # ord8
from'aaaaaaaab'=~/b/
: Index, bei dem der String mit / b / String # = ~ übereinstimmt0
fromopen(?/).pos
: Position in der Datei nach dem Öffnen des Stammverzeichnisses "/" als Datei Kernel # open IO # pos5
from'aaaaab'.index(?b)
: Index des ersten "b" in der Zeichenfolge String # index7
from?\a.bytes{|b|break b}
: ASCII-Wert von alert "\ a" String # bytes6
from'aaaaaaa'.rindex(?a)
: Index des letzten "a" in der Zeichenfolge String # rindex2
from%w[a a].map.size
: Größe des Enumerators, der aus dem Array Array # map Enumerator # size zugeordnet wirdquelle
new
nennen wirklich immer die gleiche imlpementation oder wird es in Unterklassen überschrieben? [ctd.]Java, 21 Ziffern, 276 Zeichen
quelle
7-4
&-4+7
, das ist schlau! :)7
ist keine Konstante, sondern ein LiteralRuby, 74 Zeichen, 10 Ziffern
Es ist nur ein Anfang; Ich muss gehen, damit ich es später verbessern kann.
Ich habe 76 Zeichen für später gespeichert, wenn es schwieriger wird!
quelle
Ruby, 17 Stellen, 168 Bytes
Ungolfed:
Ich war noch nicht gezwungen, etwas besonders Kluges zu tun. Vielleicht komme ich zurück und füge Ziffern hinzu.
quelle
succ
undnext
sind Aliase.$.
." Aber ich muss lieben$....
: DGolfscript mit 17 Ziffern
Ein einfacher Versuch. Golfscript enthält zwar viele nicht-alphanumerische Ein-Buchstaben-Funktionen, aber insgesamt sind nicht viele Funktionen integriert!
quelle
5,)\; # range, right uncons, flip, and pop
.Bash, 5 Ziffern in 65 Zeichen
Ich werde dies bald aktualisieren! Derzeit wird nur gedruckt
1.6180
und enthält keine Ziffern.Erläuterung
Die folgenden Methoden werden zum Generieren der Ziffern verwendet:
1: Beenden Sie den Status von
false
6: Stringlänge
1:
nl
Missbrauch8:
kill
Signalnummern0: numerischer Wert eines leeren Ausdrucks
quelle
Mathematica
98 Ziffern, in868378 Zeichen.Ausgabe:
quelle
#
durch eine zulässige Ziffer ersetzen und einen der Bindestriche entfernen.Julia - 23 Ziffern in 345 Zeichen (genau 15 pro Ziffer)
Ausgabe: 1.6180339887498948482045
Ich habe Zeichen und Zeichenketten als verwendbar interpretiert, solange ich ein bestimmtes Zeichen oder eine bestimmte Zeichenkette nicht wiederverwendet habe (Zeichen in einer Zeichenkette konnten wiederverwendet werden, solange die Zeichenkette nicht wiederverwendet wurde). Ich erlaubte mir jedoch nicht, den int-Wert eines Zeichens direkt zu verwenden. Es gibt ein Nicht-ASCII-Zeichen (©).
In besser lesbarer Weise (kein tatsächlicher Code):
quelle
C ++ 12,4 Zeichen pro Zeile waren 14 Zeichen pro Zeile für jede Ziffer
Mein Fehler bei der Wiederverwendung von Operatoren wurde behoben.
Sie sind sich nicht sicher, ob die Verwendung solcher Zeichen als Zeichen-Literale gilt oder nicht? Wenn dieser Code akzeptabel ist, kann er für immer fortgesetzt werden und die Schulden werden zurückgezahlt.
quelle
-
Operator weiterhin. Außerdem gefällt mir, wie Sie den Kommentar für die Zeilenlänge gezählt haben. : D1
, um ein zu produzieren0
(was nicht erlaubt ist, weil das1
früher im goldenen Schnitt erschien). Außerdem müssen Sie das#define S
(nicht das andere) zählen, da es kein Include ist, sondern nur einen Kurznamen definiert.