Nun wissen wir alle, dass die meisten Sprachen sehr einfache Möglichkeiten haben, Code selbst zu modifizieren. Was wäre jedoch, wenn Sie den Code tatsächlich ändern und Teile davon bearbeiten würden ... auf der Festplatte?
Ihr Ziel ist es, einen Code zu erstellen, der eine Zahl druckt, und dann eine eigene Datei zu bearbeiten, um die Zahl wie folgt durch die nächste in der Fibonacci-Sequenz zu ersetzen:
$ ./program
1
$ ./program
1
$ ./program
2
$ ./program
3
$ ./program
5
[etc...]
Regeln
- Sie dürfen die Nummer (n) nicht "außerhalb" des Codes speichern. Keine Kommentare, kein Verlassen des Skripts, kein EOF usw.
- Wenn Ihr Code mit einem Dateinamen funktioniert, subtrahieren Sie 2 von Ihrer Bytemenge und schreiben Sie
$BYTESNOW ($ORIGINALBYTES - 2)
Ihren Titel ein. (Es wird davon ausgegangen, dass Dateinamen im Bereich eines beliebigen alphanumerischen Dateipfads liegen.) - Ihr Code muss die Ausgabe ohne externe Piping-Unterstützung in die Datei schreiben.
- Ihr Code kann bei eins oder null beginnen. Es spielt keine Rolle.
perl6 program
) aufgerufen werden, oder muss die shebang-Zeile enthalten sein, damit es aufgerufen werden kann als./program
?program
und können wir davon ausgehen, dass er sich im aktuellen Arbeitsverzeichnis befindet?"a"
anstattarg[0]
. Es scheint es nicht wert zu sein.Antworten:
Bash,
5247 (49-2) BytesEDITS:
Golf gespielt
Prüfung
quelle
-?
aus dem regulären Ausdruck entfernen . Und da Sie dort sind, können Sie auch die erste Erfassungsgruppe entfernen :)Python 2,
118111 Bytes (113 - 2)Es funktioniert mit jedem gültigen Dateinamen. Es gibt hier nicht viel zu erklären, der Code selbst ist sehr ausführlich.
Vielen Dank an FlipTack für die Erinnerung,
close()
ist nicht zwingend erforderlich.quelle
f=open(...)
anstelle derwith
Aussage verwenden?Batch, 81 Bytes
Hinweis: Die nachfolgende Newline ist signifikant. Erfordert, dass das Skript mit seinem vollständigen Namen einschließlich der Erweiterung aufgerufen wird. Die Ausgabe beginnt bei 0.
Da Batch eine Datei nicht realistisch bearbeiten kann, füge ich einfach zusätzliche Zeilen am Ende der Datei hinzu, damit sie schließlich weiß, welche Nummer als nächste gedruckt werden soll. Durch die
>>%0
Platzierung wird ein Byte gespeichert, da ich keine Ziffer voranstellen kann.quelle
C, 142 Bytes (144-2)
Es ist ziemlich einfach. Zuerst liest es, dann speichert es die beiden Zeichen an der Position 0x1A in der Kopfzeile. Ich hätte wahrscheinlich genauer hinsehen können, um einen sichereren Ort zum Speichern der Daten zu finden, aber es funktioniert auf meinem Computer mit OSX, der mit GCC 4.2ish kompiliert wurde, und ich bezweifle, dass es sehr portabel ist. Da es auf Zeichen basiert, läuft es auch nach der 13. Iteration über.
Es gibt die Ausgabe:
quelle
Node.js,
152137 Bytes (139 - 2)Aus Gründen der Übersichtlichkeit mit Zeilenumbrüchen getrennt, nicht Teil der Byteanzahl.
Erläuterung:
Verwendung:
quelle
Python 3.6,
9691 (93-2) BytesDurch Hardcodierung des Dateinamens würden 5 Bytes (88 Bytes) gespart:
Einige Bytes dank @Artyer eingespart
quelle
a,b=0,1
f=open('f','r+');next(f);f.write(f'a,b={b,a+b}\n{next(f)}{f.seek(0)}');print(b)#
Bash + Unix-Dienstprogramme, 43 Bytes (45-2)
Bei der ersten Ausführung wird dc verwendet, um die 1. Fibonacci-Zahl über die Binet-Formel zu berechnen. Jeder Aufruf von sed ändert das Programm, indem der an dc übergebene String geändert wird. Diese Änderung weist dc an, dem Exponenten in der Formel eine zusätzliche 1 hinzuzufügen, wodurch die nächste Zahl in der Fibonacci-Sequenz jedes Mal berechnet wird.
Prüfung
Um zu veranschaulichen, wie es funktioniert, wurde das Programm zu diesem Zeitpunkt nach dem Drucken der 55 folgendermaßen geändert:
So läuft es wieder ergibt
und das programm lautet nun:
quelle
SmileBASIC 3, 99 Bytes (101 -2)
-2-Byte-Bonus, weil es mit jedem Dateinamen funktioniert.
Dieser hat funktioniert, und es endete irgendwie in der gleichen Größe wie meine kaputte!
quelle
PRGEDIT
Befehle verwenden, um die erste Zeile zu ersetzen (und danach einen Zeilenumbruch einzufügenA=0B=1
). Außerdem müssen SieA=0
das erste Mal nicht.R, 145 Bytes (147-2)
(Hat einen abschließenden Zeilenumbruch). Es funktioniert mit jedem gültigen Dateinamen.
quelle
Perl 6 ,
6762 Bytes (64 - 2)quelle
Gestapelt, nicht konkurrierend, 65 (67 - 2) Bytes
Einige Probleme in Bezug auf Datei-E / A wurden in der letzten Reihe von Festschreibungen behoben. Somit konkurrenzlos.
Hier ist ein Link zum Github.
Beispielausführung
(Der Übersichtlichkeit halber habe ich den tatsächlichen Pfad weggelassen.)
Erläuterung
Das funktioniert, indem Sie ein Zahlenpaar nehmen, um die Sequenz zu beginnen (
2:>
in diesem Fall ist das der ganzzahlige Bereich ), und dann die Fibonacci-Transformation für sie durchführen, wie[0, 2)
folgt(0 1)
:Bei jedem Durchlauf wird diese Transformation oben im Stapel ausgeführt. Dann wird der Stapel auf den Stapel geschoben, dupliziert und sein erstes Element erhalten (
stack:0#
). Dieser Punkt wird dann ausgegeben und ist die gewünschte Fibonacci-Nummer.repr
Nimmt dann die Darstellung des Stapels und fügt eine neue Zeile hinzu. Anschließend wird das Programm in den Stapel verschoben und in Zeilenumbrüche aufgeteilt. Dann nehmen wir das letzte Element (die letzte Zeile) und hängen es an die oben genannte Zeichenfolge an. Zum Schluss pushen wird0
(die Datei selbst; denked
ollar sign0
==$0
.) Und schreiben darauf.quelle
Ruby, 68 Bytes (70-2)
quelle
Clojure,
209204195 Bytes-5 Bytes durch Umschalten, um die Zahlen als Long statt als Integer zu analysieren und einige fehlende Leerzeichen zu entfernen.
-9 Bytes durch Entfernen des Leerzeichens zwischen der zweiten Zahl und
(let...)
(der teuerste Speicherplatz aller Zeiten!).Eine Beschreibung finden Sie in den Kommentaren zum vorbereiteten Code.
Erneut getestet, und es werden keine unübertroffenen Klammerfehler mehr ausgegeben. Es funktioniert bis zu 7540113804746346429 und löst an diesem Punkt eine Ganzzahlüberlaufausnahme aus.
Beachten Sie auch, dass sich der Quellcode unter "./src/s.clj" befindet.
quelle