Die Erstellung eines vielseitigen Ganzzahldruckers ist praktisch, aber das Schreiben eines einzelnen Codes, der viele verschiedene Zahlen druckt, ist umständlich. Wäre es nicht einfacher, ein Skript zu erstellen, das eine Zahl ausgibt, Ihnen aber auch ein neues Skript zum Abrufen der nächsten Zahl bietet?
Herausforderung:
Schreiben Sie einen Code, der eine einzelne Ganzzahl N
und einen ausführbaren Code ausgibt . Der nächste Code sollte ausgegeben werden N+1
und ein Code, der ausgegeben werden kann N+2
. Folgen Sie diesem Weg bis Sie erreichen N = 15
. (Die zuletzt gedruckte Nummer sollte 15 sein).
Regeln:
- Keine Eingabe (vorausgesetzt, die Eingabe ist leer).
- Volles Programm oder Funktion oder andere bequeme Formate sind erlaubt.
- Der erste Code sollte ausgegeben werden
1
. - Sie können keine führenden Nullen ausgeben. Dh Sie können nicht drucken
01
zu1
. - Die Ausgabe muss im Format sein
N, Code_for_N+1
. Beachten Sie, dass die Ausgabe durch ein Komma und ein einzelnes Leerzeichen getrennt ist. Der Code fürN+1
hat keine umgebenden Anführungszeichen.N , Code_for_N+1
wird nicht akzeptiert (Leerzeichen vor dem Komma). Nachgestellte Zeilenumbrüche sind in Ordnung. - Die ersten Zeichen der Ausgabe müssen die Nummer sein. (Keine führenden Leerzeichen oder
ans = N
). - Die gedruckte Nummer sollte nicht Teil des nächsten Codes sein (der Code kann diese Nummer enthalten, aber Sie können die ausgegebene Nummer nicht als Teil des Codes verwenden)
- Beispiel: Der Ausgang
N=2
kann sein:2, printer 2
. In diesem Fallprinter 2
ist der Code fürN=3
. Sie können nicht die gesamte Ausgabe verwenden:2, printer 2
als Code fürN=3
.
- Beispiel: Der Ausgang
- Die Skripte können in verschiedenen Sprachen vorliegen
- Die Datentypen sind irrelevant (die Nummer kann eine Zeichenfolge sein), sie dürfen jedoch nicht von irgendetwas umgeben sein (Anführungszeichen, Klammern usw.).
- Wenn ein Code für ausgegeben
N=15
wird, muss er entweder gedruckt werdenSTOP!
(siehe Bonus) oder er darf überhaupt nichts drucken (nicht einmal ein Leerzeichen oder eine neue Zeile).- Der Code für
N=15
kann nicht abstürzen (aber die Ausgabe an STDERR ist in Ordnung). - Sie werden disqualifiziert, wenn der Ausgabecode für
N=15
Drucke16
oder etwas anderes (mit Ausnahme des Bonusfalls).
- Der Code für
- Eingebaute Quine-Operatoren sind nicht erlaubt.
- Der Zugriff auf die Quelldatei über das Dateisystem ist nicht zulässig.
Bonus:
-10 Byte, wenn der Code, der 15 ausgibt, auch einen Code erzeugt, der " STOP!
" ausgibt
Beispiele mit Python-Syntax: (Diese funktionieren natürlich nur für die ausgewählten Ganzzahlen, nicht für 1 bis 15.)
N = 1
print "1, print 2"
1, print 2
---
N = 15
print 15
15
---
N = 15 (Qualifies for the -10 bytes bonus)
print "15, print 'STOP!'"
15, print 'STOP!'
print 'STOP!'
STOP!
----
N = 15 (Qualifies for the -10 bytes bonus)
print "15, disp('STOP!')"
15, disp('STOP!') (disp('STOP!') outputs STOP! in MATLAB)
----
N = 15 (This one is not OK. The submission is disqualified)
print "15, print 16"
15, print 16
Es gelten die üblichen Golfregeln! Kleinster Code (für N = 1) in Bytes gewinnen!
f=>f+""
wäre sagen wir, ungültig? (f+""
Gibt den Konstruktionscode der Funktion zurück.)14, print(14+1)
oder nicht?Antworten:
Pyth + ///, 15 Bytes - 10 = 5
Dies wird
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, STOP!
in Pyth gedruckt, indemrange(1,15+1)
die Anfangs- und Endklammern entfernt und ausgedruckt werden und unmittelbar danach ", STOP!".Die nächsten vierzehn Programme befinden sich in ///, wodurch alle Programme, die
/
oder nicht enthalten, direkt ausgegeben werden\
. Also das zweite Programmgibt
2
und das dritte Programm3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
. Das vorletzte Programm wird15, STOP!
gedruckt15, STOP!
, das letzte Programm ist also geradeSTOP!
.quelle
cat
als Sprache?cat
führt keinen Primalitätstest durch, also nein.JavaScript, 131238-10 = 131228 Byte
Die naive Herangehensweise fiel schlimmer aus als erwartet. Im Nachhinein hätte ich es erwarten sollen. Aber ich dachte, ich würde es trotzdem teilen. Vollständiger Code hier.
Idee: Iterativ entkommen und hinzufügen
N-1, ...
quelle
CJam,
262524 BytesProbieren Sie es online aus.
Bei den nachfolgenden Programmen wird einfach die erste Nummer erhöht. Dadurch wird das Programm 16 Mal ausgeführt.
Oder mit Bonus für die gleiche Punktzahl:
Probieren Sie es online aus.
Bei den nachfolgenden Programmen wird einfach die erste Nummer erhöht. Dadurch wird das Programm 16 Mal ausgeführt.
Alternative Lösung für den Bonus:
quelle
</selfpromotion>
JavaScript (ES6),
6261 Bytes - 10 Bonus = 51 PunkteErläuterung
Eine Lösung, die ihren eigenen Quellcode nicht liest und auch nicht lächerlich lang ist.
Das erste Programm erstellt alle 15 anderen Programme und verschachtelt sie mithilfe einer rekursiven Funktion ineinander. Um das Backslash-Problem zu umgehen, verschachtele ich die Funktionen selbst (die dann während der Ausgabe in Zeichenfolgen umgewandelt werden) und nicht in Zeichenfolgen.
Prüfung
Code-Snippet anzeigen
quelle
"" + (n=>m)
der Funktionskörper nicht berechnetn=>m
?Matlab,
226212 - 10 = 202 BytesDanke an @StewieGriffin für ein paar Bytes =)
Der erste Teil ist eine Zeichenfolge, die die zweite Zeile (unten) darstellt, den tatsächlichen Code (nur um 9 verschoben). In Matlab sind Zeichenfolgen Matrizen, die mit Zeichen gefüllt sind. Sie können die Verschiebungen also problemlos ausführen, indem Sie einfach einen Skalar hinzufügen / abziehen. Das Programm druckt also nur die gleiche Zeichenfolge * und die gleiche Zeichenfolge, aber verschoben, was zum Code führt.
* Nicht ganz: Das erste Byte ist der Zähler, der bei jeder Iteration erhöht werden muss.
Der Quintrick mit der Schnur wurde hier schamlos gestohlen .
Hier die letzten Zeilen der Sequenz, die von der Konsole kopiert wurden:
quelle
JavaScript,
5047444244 * BytesEs ist eine Funktion, die ihren eigenen Körper (nur
a
) extrahiert und ihn ersetzt. Wenn der Funktionskörper eine integrierte Funktion von JavaScript ist, obwohl er nicht ausdrücklich ein Quine-Operator ist (wenn er ungültig ist, wird die Antwort entfernt).Für den Fall , funktioniert es nicht richtig dort eingebettet (denn für mich ist es nicht), können Sie sehen , ein Beispiel gibt .
* - sieht so aus, als würde das Snippet das Ergebnis ohne erzeugen
a=
, was weitere Aufrufe unmöglich machtquelle
.replace(x++,x)
?a=_=>(x=1)+(x<15?`, ${a}`:"").replace(x,x+1)
Arbeit?Python 2.7.10,
19692 - 10 = 82 BytesWhee !!! Das hat Spaß gemacht. Jetzt viel kürzer. : P
Erläuterung:
Ich habe damit angefangen:
Das ist nur eine einfache Quine. Dies ist, dass mit einem Zähler hinzugefügt:
n
ist eine Zählervariable, die am Anfang ausgegeben wird. Wenn es dann dasn=
Teil druckt , ersetzt esn+1
das%d
. Ab hier zählt es also unendlich hoch.Und hier ist die endgültige Version. Es wird eine if-Klausel hinzugefügt, die bei 15 stoppt und "STOP!" auch.
Alter Code:
Niemals gewinnen, aber Spaß machen. : PJetzt viel kürzer, obwohl ich immer noch keine Chance habe. : Pquelle
else
s keine Leerzeichen stehen .PowerShell,
(215-10) = 205197167106104103 Byte(Wenn Ihr einziges Tool PowerShell ist, sieht jedes Problem wie ein Nagel aus. Warten Sie ...)
Im Wesentlichen beginnen wir mit der Einstellung
$d
auf eine große ole-lange Kette von einer fast - gleich quine des ursprünglichen Codes. Es gibt1
und dann$d
mit dem Format des Bedieners-f
richtig des Auffüllens{0}
,{1}
,{2}
Stand-in, die Inkrementieren{2}
Nummer in dem,1*{2}
von einem jeden Zeitabschnitt.Durch den
,x*y
Vorgang in PowerShell wird ein neues Array vony
Elementen erstellt, von denen jedes gleich istx
. Zum Beispiel,2*3
ist äquivalent zu@(2,2,2)
.Dies bedeutet, dass die erste Ausgabe gleich der Anzahl des Arrays oder usw. ist
1, $c=(,1*2).length;$d=(etc...)
, wenn der zweite Code ausgeführt$c
wird . Beachten Sie, dass diese nicht als Variable im ursprünglichen Code verwendet wird, sondern nur in nachfolgenden Ausführungen .@(1,1)
2
$c
Stoppt, wenn es 15 ausgibt, indem es einfach berechnet, ob es
$c
gleich ist,15
und dann in ein Array indiziert. Das 0. Element ist$c, $d
wie oben beschrieben, das andere ist gerade15
. Wenn$c
also 15 ist, wird es ausgegeben15
und sonst nichts. Qualifiziert sich nicht für den Bonus, da"15, {0}STOP!{0}"
5 Zeichen zu lang sind, damit sich die -10 lohnt.Benötigt ein PowerShell-Terminal mit einer Breite> ~ 150. Oder Sie müssen den zusätzlichen Zeilenumbruch (den das Terminal beim Umbruch der Ausgabe hilfreich einfügt) manuell entfernen, wenn Sie den Code kopieren und einfügen. Oder Sie erfassen die Ausgabe in einer Variablen und führen diese Variable erneut aus. Etc.
Edit 1 - Einige Bytes durch Entfernen des "STOP!" Wortlaut.
Edit 2 - Durr, nicht verwenden .length jedes Mal, rufen Sie einfach einmal
bearbeiten 3 - Ist ein quine nicht sein müssen, so dass die erste Auflage viel kürzer sein kann
bearbeiten 4 - Änderungen verwenden Strings Arrays zu berechnen
$c
, die zwei Bytes gespeichert. Ich bin mir ziemlich sicher, dass dies für diesen Ansatz fast optimal ist.Edit 5 - Speichert ein weiteres Byte, indem die Gleichheit direkt gezählt wird, anstatt sie zu modifizieren
quelle
JavaScript, 79 - 10 = 69 Bytes
Ohne
Function.prototype.toString
auf irgendeine Weise zu benutzen .quelle
Befunge, 57 - 10 = 47 Bytes
Dieser ist fantastisch. Probieren Sie es hier aus .
quelle
STOP!
Batch, 73 + 5 - 10 = 68 Bytes
Benötigt
CMD /V:ON
also habe ich 5 Bytes dazuaddiert .quelle
Python 2.7, 107 Zeichen
Indem ich Rekursion benutze und kein Quine schreibe, dachte ich, ich könnte viel sparen, was zwar stimmt, aber nicht gut genug ist. Obwohl ich kein Gewinner bin, finde ich, dass es Spaß macht, diesen Ansatz zu teilen.
Ich begann damit, eine Zeichenfolge für N = 4 zu erstellen
\
und die"
Zeichen und zu umgehen.Dann habe ich eine Lambda-Funktion erstellt, die diese Zeichenfolge basierend auf einem Startindex und einem Stoppindex unter Verwendung von Rekursion erstellt. Das ist es:
Benutze es so:
Ausgabe: [32902 Zeichen, zu lang zum Verarbeiten]
Mein Kolmogorov-Komplexitätsansatz scheint also nicht so erfolgreich zu sein ;-)
quelle
SMBF , 28 Bytes
\x10
steht für ein Literalbyte (Dezimalwert 16). Die Ganzzahl wird als Ganzzahl (Byte) ausgegeben. Die erste Zeichenausgabe ist also\x01
. Das Programm gibt dann "," aus. Beim Drucken einer eigenen Quelle wird+
am Anfang eine zusätzliche Quelle gedruckt .Erläuterung:
Beachten Sie, dass Sie dies nicht in einem Standardinterpreter ausführen können, da ein Hex-Literal in der Eingabe erforderlich ist. Sie benötigen außerdem einen speziellen Anschluss, damit die Hex-Ausgabe ordnungsgemäß funktioniert.
quelle
Bash,
787473 - 10 = 63 Bytes (Beispiel, kann nicht gewinnen)Ich kam zu spät, sah aber, dass Bash nicht ausprobiert worden war, also probieren Sie es aus. Erste Golf-Herausforderung und quineartiges Rätsel. Sie machen Spaß!
Erläuterung:
Dies funktioniert, weil
a
Schritte von 1 bis 15 und ist dannunset
zusammen mitp
. Das Skript (gespeichert inp
) druckt beide aus, wenn sieset
und "STOP!" Andernfalls. Der Anfangsbuchstabeunset
a
istset
0, da er in einer arithmetischen Erweiterung erscheint.quelle
𝔼𝕊𝕄𝕚𝕟, 30 Zeichen / 47 Byte (nicht wettbewerbsfähig)
Try it here (Firefox only).
Endlich eine gute alte Quine für 𝔼𝕊𝕄𝕚𝕟 gefunden.
Erläuterung
Hier ist die wahre Quine, die ich verwendet habe:
⟮ⒸⅩ222+ᶈ0
Sie sehen es in meiner Antwort? Hoffentlich können Sie von dort aus expandieren.
quelle
Keg + PHP, 19-10 = 10 Bytes
Zählt von 1 bis 15 und stoppt dann. TIO
Fass, 13 Bytes
quelle