Herausforderung
Ihr Ziel ist es, ein Programm zu schreiben, das ein anderes Programm druckt. Dieses gedruckte Programm sollte ein anderes Programm drucken, und das neue Programm sollte bis zum Ende ein anderes Programm drucken.
Regeln
- Jedes Programm muss kleiner als 256 Bytes sein. (Wenn dies geändert werden muss, hinterlassen Sie einen Kommentar)
- Das letzte Programm muss ein leeres Programm sein.
- Es muss eine endliche Anzahl von Programmen geben, damit das Programm kein Quine sein kann.
- Die Programme müssen alle in derselben Sprache ausgeführt werden.
- Es ist keine Eingabe erlaubt.
- Das Gewinnerprogramm ist das Programm, das so viele Programme wie möglich druckt und sich selbst zählt.
Viel Glück!
code-challenge
code-generation
Die Schildkröte
quelle
quelle
2^2048
oder3.2317e616
.a*10^b
in der1<=a<10
undb
eine natürliche Zahl ist.1.2673e614
.Antworten:
CJam, 4,56 × 10 526 Programme
Genaues Ergebnis: 254 219 + 254 192 + 254 166 + 254 140 + 254 114 + 254 88 + 254 63 + 254 38 + 254 13 + 3
Alle Programme müssen mit der ISO-8859-1-Codierung gespeichert werden, um die Dateigrößenbeschränkung einzuhalten.
Vielen Dank an @ChrisDrost, der auf einen Fehler hingewiesen und den Ansatz zum Verschachteln vorgeschlagen hat.
Probieren Sie es online im CJam-Interpreter aus .
254 219 + 2 ≈ 4,56 × 10 526 Programme
Der Linienanteil der Punktzahl kann durch das folgende, viel einfachere Programm 1 erreicht werden .
Das Ausführen dieses Programms erzeugt das Programm
und nach 254 219 - 1 weiteren Iterationen das Programm
Dieses letzte nicht leere Programm wird mit einem Fehler 2 beendet und gibt nichts aus (das leere Programm).
Wie es funktioniert
Angenommen, die Zeichenfolge befindet sich bereits auf dem Stapel.
254 192 ≈ 5,35 × 10 461 weitere Programme
Hier wird es ein bisschen verrückt.
Das erste Programm ist stark komprimierbar. Durch ein ähnliches Programm schreiben , das anstelle des leeren Programm, schließlich das erste Programm aus dem obigen Abschnitt erzeugt, können wir die Punktzahl durch verbessern 254 192 Programme 3 .
Das Programm
ist dem ersten Programm des vorherigen Abschnitts ähnlich, und das Ausführen des ersteren und seiner Ausgabe für 254 192 Iterationen erzeugt das letztere.
Angenommen, die Zeichenfolge befindet sich bereits auf dem Stapel:
Moar-Programme
Das erste Programm des vorherigen Abschnitts ist immer noch stark komprimierbar, daher können wir eine ähnliche Methode anwenden und ein Programm schreiben, das nach 254 166 Iterationen das oben genannte Programm erzeugt.
Wenn Sie diese Technik immer und immer wieder wiederholen, bis das Limit von 255 Byte erreicht ist, können Sie insgesamt 254 166 + 254 140 + 254 114 + 254 88 + 254 63 + 254 38 + 254 13 + 1 ≈ 1,59 × 10 399 Programme hinzufügen diejenigen der vorherigen Abschnitte.
1 Neue Zeile zur Verdeutlichung hinzugefügt.
2 Per Konsens über Meta ist dies standardmäßig erlaubt.
3 oder 0,000000000000000000000000000000000000000000000000000000000000000012%
quelle
JavaScript, 1000 Programme
Ob dies zutrifft, hängt davon ab, wie genau die dritte Regel verstanden wird.
quelle
Ruby, 1,628 × 10 ^ 237 Programme
Gleicher Ansatz wie meine Perl-Antwort, aber da Ruby bereits mit großen Ints umgeht, ist es einfacher, sie als Hex zu speichern.
Ruby, 9,277 × 10 ^ 90 Programme
Dieser Versuch ist also eine etwas andere Variante des vorherigen quine-ähnlichen, aber wegen all der zusätzlichen Funktionen erhalte ich die Nummer nicht annähernd so hoch wie die andere ... War interessant, einen anderen Ansatz zu versuchen!
quelle
Python 2, 9.7 * 10 ^ 229-Programme
quelle
C, 2,2 · 10 & supmin; ¹ & sup7; Programme
Es ist nicht perfekt, aber ziemlich gut. Ich meine, es ist genau
255
bytes lang und erzeugt Programme mit der gleichen Länge. Sie könnten wahrscheinlich noch ein bisschen herumtüfteln, um noch mehr Programme zu bekommen, aber ich werde es so lassen, wie es jetzt ist.Das Programm basiert auf einer einfachen C-Quine. Zusätzlich gibt es einen einfachen Zählalgorithmus, der alle möglichen Werte des char-Arrays zählt
n
. Wir haben so viele Programme wie Permutationen des Stringsn
.Der Zeichenbereich ist auf einen Bereich von
#
(= 35) bis[
= (91) begrenzt. Das liegt daran, dass ich keine will"
oder\
in der Schnur, weil sie geflüchtet werden müssen.Die Programmerzeugung endet , wenn alle Werte in der char Array
n
sind[
. Dann gibt es ein einfaches Dummy-Programm ausmain(){}
, das selbst nichts ausgibt.Als Demonstration soll , dass es funktioniert ich die Grenzen nur geändert, so dass nur Zeichen zwischen ASCII-Code einfach
35
und36
verwendet wurde und nur 4 Array - Elemente.Die resultierenden Programme sind
Dies gibt
2^4 + 1 = 17
verschiedene Programme aus.Das obige Programm gibt also
((91-35)+1)^101 + 1 = 57^101 + 1 ~= 2.2 * 10^177
verschiedene Programme aus. Ich bin mir nicht ganz sicher, ob dies zählt oder ob meine Berechnung überhaupt korrekt istquelle
2.2 * 10^177
(für diejenigen, die vergleichen möchten)?Perl, 1 × 10 ^ 163
Ansonsten ist dies eine ziemlich einfache Quine, die auf so wenig Zeichen wie möglich geschrumpft ist und nur ausgeführt wird, während der Zähler nicht läuft
0
.quelle
Common Lisp, 10 113 -1
Die Anzahl der Neunen ist durch die maximale Codegröße von 256 begrenzt, wobei die vom Drucker eingegebenen Leerzeichen berücksichtigt werden .
quelle
Perl, 1,4 · 10 & supmin; ² & sup5 ;.
Ähnliche Annäherung an Python; gleiches Ergebnis!
quelle
> <> , 65534 (?) Programme
Ich habe neben 65533 ein Fragezeichen eingefügt, da ich noch nicht überprüft habe, ob 65533 gedruckt werden kann (obwohl ich Grund zu der Annahme habe, dass dies der Fall sein sollte). Sobald ich etwas mehr Zeit habe, werde ich einen Weg finden, es zu testen.
Sie können es hier online ausprobieren .
Das Wesentliche dieses Programms ist, dass es die Ausgabe des Zeichens ganz am Ende ändert und dann vor dem Drucken seinen numerischen Wert dekrementiert. Ich habe 65534-Programme, weil der ASCII-Wert des Zeichens am Ende des Codes 65533 ist. Wenn wir also das erste Programm zählen, haben wir 65534 (wenn Sie das leere Programm 65535 zählen, denke ich). Das letzte "zurückgegebene" Programm ist nichts; es endet einfach, wenn der Zeichenwert 0 ist.
Ich bin mir ziemlich sicher, dass es in der Lage sein wird, ein Zeichen für alle Iterationen zu drucken: Ich konnte keine definitive Quelle für die Anzahl der Zeichen finden, die gedruckt werden können> <>, aber es gibt numerisch Zeichen direkt unter 65533.
Lassen Sie mich wissen, wenn bei dieser Implementierung Probleme auftreten. Ich bin mir ein wenig unsicher, ob mein Eintrag gültig ist.
Erläuterung
Ich habe schamlos die Idee gestohlen, ein einfaches Anführungszeichen zu verwenden, um ein Pseudo-Quine aus dem> <> Wiki zu erstellen, und einen Kommentar, den ich hier einmal gesehen habe.
Es analysiert alles nach dem Anführungszeichen als Zeichen und dekrementiert dann das letzte. Von dort dreht es den Stapel einfach um (um in der richtigen Reihenfolge zu drucken), schiebt ein Anführungszeichen auf den Stapel und druckt dann, bis der Stapel leer ist.
quelle
Python, 1 × 10 ^ 194 Programme
Dies muss von einer Datei ausgeführt werden, nicht von einer interaktiven Antwort. Es ist keine Quine.
Vielen Dank an @The Turtle, der mir geholfen hat, 3 Bytes zu sparen. Das ist mehr Platz für neun!
Vielen Dank an @poke, der mir geholfen hat, 2 Bytes zu sparen. Das ist mehr Platz für neun!
quelle
if n!=0
ist überflüssig. Du kannst einfach schreibenif n
.if n:
und zwischen denreplace
Argumenten.Bash, 52 Programme
Völlig uninspiriert und (hoffentlich) solide auf dem letzten Platz.
quelle