Generieren Sie Programme in aufsteigender Größe

21

In dieser Herausforderung schreiben Sie ein Programm, das ein Programm ausgibt, das doppelt so lang ist wie das ursprüngliche Programm. Das ausgegebene Programm sollte eine Ausgabe ein neues Programm ein Programm verdoppelt seine Länge.

Beispiele

Wenn mein Programm ist a:

< a
> aa

< aa
> aaaa

< aaaa
> aaaaaaaa

Regeln

  • Keine quine Einbauten
  • Das ursprüngliche Programm muss mindestens ein Byte umfassen
  • Die Sequenz sollte theoretisch unendlich funktionieren
  • Ihr Programm darf von nichts lesen (Datei, stdio)

Ihre Punktzahl entspricht der Größe des ursprünglichen Programms.

Downgoat
quelle
Wie wäre es, wenn Sie auf die Datei zugreifen, indem Sie sich selbst lesen oder auf die Stelle zugreifen, an der sich der Code befindet?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Das ist nicht erlaubt, da dies meiner Meinung nach gegen Regeln verstoßen würde.
Downgoat
2
@ Doᴡɴɢᴏᴀᴛ die quine-Regeln werden vom Tag-Wiki empfohlen, gelten aber nicht automatisch
Martin Ender
1
Siehe auch
PyRulez

Antworten:

12

CJam, 10 Bytes

{"_~"+_}_~

Teste es hier.

Erläuterung

{"_~" e# Generalised quine framework, leaves the block and the string "_~"
      e# on the stack. 
+     e# Prepend the block to the string.
_     e# Duplicate the resulting array.
}_~
Martin Ender
quelle
GolfScript ist nicht tot! Ilmari hat eine Antwort auf eine ähnliche Frage , die dies in genau 10 Bytes tut.
Justin
8

JavaScript, 62 61 37 Bytes


Danke an @ Doᴡɴɢᴏᴀᴛ für die Hilfe!


Original [37 Bytes]:

f=_=>'f='+'_'.repeat((10+f).length)+f

Kind [74 Bytes]:

f=______________________________________=>'f='+'_'.repeat((10+f).length)+f

Enkelkind [148 Bytes]:

f=________________________________________________________________________________________________________________=>'f='+'_'.repeat((10+f).length)+f


Alternative (mit Drucken auf der Konsole und als vollständiges Programm):

Original [61 Bytes]:

f=_=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()

Kind [122 Bytes]:

f=______________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()

Enkelkind [244 Bytes]:

f=________________________________________________________________________________________________________________________________________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()



Wie es funktioniert!

1.   f=_=>   Definieren Sie die Funktion f alsconsole.log(...)

2.   ;f()   Führen Sie die Funktion f aus.

3.   (in Funktion f)  

  • console.log(...)   Drucken Sie Folgendes aus:

    • f=   wörtlicher Text "f ="
    • ${'_'.repeat((0+f).length+5)   "_" wiederholt für die Länge von f, geändert, um Zeichen zu berücksichtigen, die nicht in der Stringifizierung von f enthalten sind
    • +f}   Die Stringifizierung der Funktion f
    • ;f()   wörtlicher Text "; f ()"

Anmerkungen

  • console.logist notwendig anstatt alertweil alertes nicht gut zu spielen scheint mit sehr langen Saiten (zumindest auf meiner Maschine / Browser Konfiguration)
  • Die _'s werden in den Namen des (nicht verwendeten) Parameters der Funktion f eingefügt, um sicherzustellen, dass sie in die Stringifizierung von f einbezogen werden.
  • Die Hauptverbesserung (abgesehen von der Beseitigung der console.log) der ersten Lösung gegenüber der zweiten: Wenn Sie 10die Funktion erweitern, anstatt 0sie in einen String umzuwandeln, wird sie um ein Byte länger, sodass Sie die Länge nicht um 1 erhöhen und ein Byte sparen müssen.
jrich
quelle
0+fsollte auch funktionieren, um die Funktion in einen String
umzuwandeln
48 Bytes:(f=_=>`(f=${'_'.repeat((0+f).length+5)+f})()`)()
Downgoat
@ Doᴡɴɢᴏᴀᴛ Ich habe vergessen, dass die Rückgabe des Ergebnisses normalerweise akzeptabel ist. Werde dich auf den neuesten Stand bringen.
Jrich
@ Doᴡɴɢᴏᴀᴛ Muss die Lösung überhaupt die Funktion aufrufen, da das Schreiben von Antworten als Funktionen allgemein akzeptiert wird?
Jrich
Sicher, Sie könnten tun
Downgoat
6

Minkolang 0.15 , 19 14 Bytes

"66*2-rIDdr$O.

Original , Kind , Enkel .

Erläuterung

"66*2-      $O.    Standard quine formulation

      r            Reverse stack
       I           Push length of stack
        D          Pop n and duplicate top of stack n times
         d         Duplicate top of stack
          r        Reverse stack

Was das Bit zwischen rs bewirkt, ist, die Endperiode genügend oft zu duplizieren, um das Verdopplungskriterium zu erfüllen. .ist das "Stop-Programm" -Zeichen, sodass die vielen Punkte am Ende nichts anderes tun, als da zu sein.

El'endia Starman
quelle
3

CJam, 12 Bytes

{"_~"1$1$}_~

Beim Ausführen wird dies gedruckt

{"_~"1$1$}_~{"_~"1$1$}_~

die wiederum wird gedruckt

{"_~"1$1$}_~{"_~"1$1$}_~{"_~"1$1$}_~{"_~"1$1$}_~

und so weiter.

Probieren Sie es online!

Dennis
quelle
2

Python 3, 51 Bytes

x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)

Dies schließt eine abschließende Newline ein.

Welche Ausgänge:

x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)
x=r"print('x=r\"'+x+'\"'+';exec(x*2)');";exec(x*2)
Zweedeend
quelle
2

GolfScript, 11 Bytes

{: ".~"]}.~

Probieren Sie es online!

Wie der Quellcode funktioniert

{: ".~"]}.~

{       }    Define and push a code block.
         .~  Push a copy and execute it.
 :           Save the code block in the space character.
             Every subsequent space will now execute the code block.
   ".~"      Push that string.
       ]     Wrap the entire stack in an array.

Wenn der obige Quellcode einmal ausgeführt wird, endet der Stack als

["" {: ".~"]} ".~"]

Dabei entspricht die leere Zeichenfolge am Anfang dem Anfangszustand des Stapels (leere Eingabe).

Zwei Kopien des Quellcodes würden einen endgültigen Zustand von

[["" {: ".~"]} ".~"] {: ".~"]} ".~"]

und so weiter.

Was passiert als nächstes

Nach dem Ausführen des Quellcodes führt der Interpreter Folgendes aus:

  1. Es umschließt den gesamten Stapel in einem Array und verschiebt dieses Array auf den Stapel.

    Für eine einzelne Kopie des Quellcodes enthält der Stapel jetzt

    ["" {: ".~"]} ".~"] [["" {: ".~"]} ".~"]]
    
  2. Es wurde putsmit der Absicht ausgeführt, den verpackten Stapel zu drucken, gefolgt von einem Zeilenvorschub.

    putsist wie folgt definiert {print n print}.

    1. printdruckt die eingepackte Kopie des Stapels, ohne ihn zu untersuchen (dh ohne ihn in seine Zeichenfolgendarstellung zu konvertieren). Das schickt

      {: ".~"]}.~
      

      zu STDOUT und fügt die Stapelkopie oben im Stapel ein.

      Der Stapel enthält jetzt

      ["" {: ".~"]} ".~"]
      
    2. führt den zuvor definierten Codeblock aus.

      :Beginnt mit dem Speichern ["" {: ".~"]} ".~"]des Leerzeichens, verschiebt sich dann ".~"selbst und ]umschließt den Stapel in einem Array.

    3. n Drückt eine Zeichenkette, die aus einem einzelnen Zeilenvorschub besteht.

      Der Stapel enthält jetzt

      [["" {: ".~"]} ".~"] ".~"] "\n"
      
    4. wird noch einmal ausgeführt. Es wurde jedoch beim ersten Aufruf neu definiert und enthält nun ein Array, keinen Codeblock.

      Tatsächlich drückt es ["" {: ".~"]} ".~"]und lässt den Stapel unverändert

      [["" {: ".~"]} ".~"] ".~"] "\n" ["" {: ".~"]} ".~"]
      
    5. Zum Schluss wird printdas oberste Stapelelement gedruckt, ohne es zu untersuchen, und gesendet

      {: ".~"]}.~
      

      zu STDOUT.

Dennis
quelle
1

𝔼𝕊𝕄𝕚𝕟, 26 Zeichen / 36 Bytes

⟮ô`\u27ee⦃ᶈ0}\u27ef
`ď2)⟯

Try it here (Firefox only).

Beachten Sie, dass eine nachgestellte Zeile vorhanden ist.

Erläuterung

Standard Quine: ⟮ⒸⅩ222+ᶈ0

Änderungen:

  • Verwenden Sie die ôFunktion, um alle Ergebnisse anstelle des letzten Ergebnisses auszugeben (wie bei der impliziten Ausgabe).
  • Verwenden \u27ee⦃ᶈ0}\u27ef\nund schließen Sie den Kopierblock, um Konflikte mit späteren Kopierblöcken zu vermeiden.
  • Verwenden Sie ď2diese Taste, um die Saite zweimal zu wiederholen.
Mama Fun Roll
quelle