Noch ein Programm und ich bin raus!

21

Bei einer positiven Verschachtelungsebene für Ganzzahlen nund einer Zeichenfolge saus druckbaren ASCII-Zeichen ( to) ~wird ein Programm ausgegeben, das bei Ausführung in derselben Sprache ein Programm ausgibt, das ein Programm ausgibt ..., das die Zeichenfolge ausgibt s.

Es sollten insgesamt nProgramme generiert werden, die alle in derselben Sprache wie Ihre Antwort ausgeführt werden sollten.

Hinweis: Sie können Programme oder Funktionen ausgeben - alles, was Sie standardmäßig als Einreichung zulassen.

Sie können smit Escapezeichen eingeben, wie ein Programm oder eine Funktion in Ihrer Sprache normalerweise eine Zeichenfolge eingibt.


Beispiel

Zum Beispiel könnte ein gegebenes n=1und s="recursion"Python 2-Programm Folgendes ausgeben:

print "recursion"

Wenn Sie dies ausführen, würde Folgendes ausgegeben:

recursion

Gegeben n=2und s = "PPCG", könnte ein Python 2-Programm Folgendes ausgeben:

print "print \"PPCG\" "

Ausführen dieser Ausgaben:

print "PPCG"

Ausführen dieser Ausgaben:

PPCG

Verwandte (+ Titel Inspiration): Noch eine LUL und ich bin raus

Außerdem Verwandte (in der Sandbox - jetzt gelöscht, kann aber immer noch mit ausreichender Reputation angezeigt werden): Quellcode-Rekursion

Testfälle

Stellen Sie sicher, dass Ihr Code für die folgenden Testfälle (einer pro Zeile) funktioniert:

n s
2 PPCG
4 Robert'); DROP TABLE Students;--
17 Deep
2 Spaces In Here
3 "Don't forget quotes!"
5 'Backt`cks might be a h`tch'
6 5%s
8 [Brackets]<Are>(Great){Usually}
3 !"#$%&'()*+,-./ 0123456789:;<=>?@ABCDEFGHIJKLMN
6 OPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
7 THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
3 the quick brown fox jumps over the lazy dog
fireflame241
quelle
1
Ich las die Herausforderung und meinte "Hey, das kommt mir sehr bekannt vor ..." und bemerkte dann Ihre " Also Related (in Sandbox): Source Code Inspiration " zu meiner Sandbox-Frage. :) Ich lasse meine Frage vorerst dort, werde sie aber nach ein paar Wochen löschen. Ihr ist im Grunde dasselbe, außer dass ein ganzzahliger Parameter hinzugefügt wird.
Kevin Cruijssen
1
Dürfen, wie hier vorgeschlagen , anonyme Funktionen anstelle von Programmen zurückgegeben werden?
Arnauld
1
Enthält "positive ganze Zahl" 0?
Felix Palmen
1
Haben Sie sich aus einem bestimmten Grund für ein Programm entschieden? Die Standardeinstellung ist Funktion oder Programm? Darf eine Funktion eine Funktion drucken?
Kevin Cruijssen
1
@StewieGriffin, weil es problematisch sein kann, in Unterausdrücken oder verschachtelten Programmen zu entkommen (und jemand nach Anführungszeichen-Testfällen in der Sandbox gefragt hat).
Fireflame241

Antworten:

19

Gelee , 2 Bytes

Ṿ¡

Probieren Sie es online!

Ṿ¡  Main link; left argument (text) is x, right argument (repetitions) is y
 ¡  Repeat y times:
Ṿ   Uneval x; produce code that outputs x

hehe builtins

HyperNeutrino
quelle
Dies ist kaputt, "Hallo" produziert Hallo, nicht "Hallo"
Tahg
10
@Tahg Jelly-Eingabe wird automatisch als Python-Code ausgewertet, wenn kein Fehler auftritt. Wenn ja, dann ist es nur eine Zeichenfolge. Sie '"hi"'
müssten
19

JavaScript (ES6), 47-44 Byte

3 Bytes gespart dank @HermanLauenstein

Übernimmt Eingaben in der Currying-Syntax (n)(s).

n=>g=s=>`alert(atob("${btoa(--n?g(s):s)}"))`

Beispiel

f(2)('PPCG')

Wird ausgeben:

'alert(atob("YWxlcnQoYXRvYigiVUZCRFJ3PT0iKSk="))'

Welches wird drucken:

'alert(atob("UFBDRw=="))'

Welches wird drucken:

'PPCG'

Demo

Ein komplexeres Beispiel, bei dem alert()überschrieben wurde, sodass Zwischenergebnisse auf die Konsole gedruckt und automatisch ausgeführt werden.


Alternative Version, 40 Bytes

Vorgeschlagen von @Shaggy

Dieser gibt eine anonyme Funktion anstelle eines vollständigen Programms zurück.

n=>g=s=>`_=>atob("${btoa(--n?g(s):s)}")`
Arnauld
quelle
Könnten Sie eine anonyme Funktion zurückgeben, anstatt die zu verwenden alert? 41 Bytes
Shaggy
@ Shaggy Ich weiß es nicht wirklich. Ich habe das OP gefragt.
Arnauld
Wenn nicht, könnten Sie vielleicht mit einem IIFE für 45 Bytes davonkommen.
Shaggy
-3 Bytes unter Verwendung von currying: n=>g=s=>BTalert(atob("${btoa(--n?g(s):s)}"))BT(BT durch Backticks ersetzen)
Herman L
@HermanLauenstein Danke! :)
Arnauld
10

sh + coreutils, 31 Bytes

yes exec sed 1d \$0|sed $1q;cat

Nimmt nals Befehlszeilenparameter und sauf STDIN.

Neil
quelle
8
Dieser Code sagt: "Ja, Sie müssen mich definitiv ausführen."
RedClover
Können Sie eine Erklärung hinzufügen? Ich habe Probleme damit
JoshRagem
1
@JoshRagem gibt yeswiederholt die Befehlszeile aus exec sed 1d $0(das $ist ein Shell-Metazeichen, daher muss es in Anführungszeichen gesetzt werden). sed $1qStoppt den Druck nach $1(dh n) Zeilen. catkopiert dann die Eingabezeichenfolge. Die resultierende Datei ist ein shSkript, das die Shell anweist, sich durch eine Kopie sedder Parameter 1dund des Dateinamens des Skripts zu ersetzen . sedÜberspringt dann die erste Zeile der Datei und gibt den Rest aus. Jedes Skript hat ein exec sed 1d $0Präfix weniger , bis nach der nAusführung nur die ursprüngliche Eingabe gedruckt wird.
Neil
5

Haskell, 17 Bytes

Ab dem Zeitpunkt, an dem ich dies schreibe, ist dies die kürzeste Antwort für eine nicht golfspezifische Sprache.

Diese Funktion nimmt sund nin dieser Reihenfolge und gibt das Ergebnis oder den Quellcode eines Ausdrucks zurück, der bei Auswertung den nächsten Quellcode zurückgibt.

(!!).iterate show

Argument dafür, warum das zählt:

  1. Lösungen dürfen Funktionen sein.
  2. Ihre Ausgänge dürfen Funktionen sein.
  3. Diese Funktionen haben keine Parameter.
  4. In Haskell ist die - für praktische Programmierzwecke - natürlichste Definition einer 0-Parameter-Funktion die gleiche wie das Ergebnis, da sie faul und alles ist; Die nächste Alternative, eine 1-Parameter-Funktion, die den Parameter ignoriert, ist albern.

Wenn fangegeben PPCGund 2als Parameter angegeben, ist das Ergebnis der Text "\"PPCG\""(erste generierte Funktion), der bei der Auswertung den Text "PPCG"(zweite generierte Funktion) zurückgibt und bei der Auswertung zurückgibt PPCG.

Danke an nimi für den Vorschlag einer Verkürzung.

Kevin Reid
quelle
Es gibt eine relevante Meta-Frage zum Thema Funktionen ohne Argumente in Haskell, obwohl sie noch nicht so viel Beachtung gefunden hat und noch offene Fragen hat: codegolf.meta.stackexchange.com/q/12924/56433
Laikoni
3

APL (Dyalog) , 24 23 Bytes

-1 danke an ngn.

Dies ist ein vollständiges Programm, das nach sund dann nnach fragt und nach STDOUT druckt.

''''{⍺,⍨⍺,⍵/⍨1+⍵=⍺}⍣⎕⊢⍞

Probieren Sie es online!(Der Fall 17 Deep wird weggelassen, da er das Ausgabelimit von TIO überschreitet. Funktioniert offline.)

Eingabeaufforderung für s

 ergeben, dass (zu trennen und )

''''{... }⍣⎕ fordern Sie ndieses Lambda auf und wenden Sie es so oft mit einem einfachen Anführungszeichen als linkes Argument an. steht für das linke Argument (das Zitat) und steht für das rechte Argument (den Eingabetext):

⍵=⍺ Boolescher Wert, bei dem der Text einem Anführungszeichen entspricht

1+ füge eins hinzu

⍵/⍨ Replizieren Sie jedes Zeichen des Arguments entsprechend oft

⍺, ein Zitat voranstellen

⍺,⍨ ein Zitat anhängen

Dies funktioniert, weil Zeichenfolgen in APL durch 'Trennzeichen und einfache Anführungszeichen in Zeichenfolgen doppelt angegeben werden, während keine anderen Zeichen maskiert werden müssen.


Dyalog APL wird auch mit einem utility ( ⎕SE.Dyalog.Utils.repObj) ausgeliefert, das einen APL-Ausdruck generiert, der zu seinem Argument ausgewertet wird (ähnlich wie Jelly's uneval ). Das folgende Programm entspricht daher dem oben genannten, funktioniert jedoch für alle Arrays:

SE.Dyalog.Utils.repObj⍣⎕⊢⎕

Probieren Sie es online!

Adam
quelle
Ich denke, APLX erlaubt sowohl "doppelt" als auch "einfach" zitierte Zeichenfolgen. Wenn der Rest dort funktioniert, können Sie ein Byte speichern :) ngn / apl verwendet, aber ich habe "" vor kurzem entfernt
ngn
Überlegen Sie, ob Sie das Anführungszeichen als .- übergeben möchten, um (mindestens) ein Byte zu sparen.
30.
@ngn Danke, aber APLX hat keine dfns. NARS2000 enthält sowohl doppelte Anführungszeichen als auch dfns, Zeichen kosten jedoch jeweils zwei Byte.
Adám
2

Firefox JavaScript, 41 35 Bytes

f=(s,n)=>"_=>"+uneval(--n?f(s,n):s)

Firefox hat eine nette uneval, die macht, wie es sich anhört - ein bestimmtes Objekt, in diesem Fall eine - Zeichenfolge.

dzaima
quelle
2

Java 8, 95 93 Bytes

String c(String s,int n){return"v->\""+(n-->1?c(s,n).replaceAll("[\\\\\"]","\\\\$0"):s)+'"';}

-2 Bytes dank @Lynn .

Sonderzeichen zu entkommen ist in Java so nervig.

Probieren Sie es hier aus und probieren Sie die resultierende Methode hier aus .

Erläuterung:

String c(String s,int n){  // Method with String and int parameters and String return-type
  return"v->\""+           //  Return literal "v->" + a leading double-quote +
   (n-->1?                 //   If `n` is larger than 1:
     c(s,n)                //    Recursive-call,
      .replaceAll("[\\\\\"]","\\\\$0")
                           //    with all double-quotes ('"') and slashes ('\') escaped
    :                      //   Else:
     s)                    //    The input String
   +'"';                   //   + a trailing double quote
}                          // End of method 

Zusätzliche Erklärung für den Regex-Ersatz:

.replaceAll("[\\\\\"]","\\\\$0")
.replaceAll("        ","      ")  // Replace the match of the 1st String, with the 2nd
             [      ]             //  One of these inner characters:
              \\\\                //   Escaped slash ('\')
                  \"              //   Escaped double-quote ('"')
                                  //  And replace them with:
                        \\\\      //   Escaped slash ('\'),
                            $0    //   plus found match

Warum all diese Schrägstriche?

\   →  \\       // Escapes a single slash for the regex
\\  →  \\\\     // Escapes both regex-escaped slashes for the String
"   →  \"       // Escapes a double-quote for the String
Kevin Cruijssen
quelle
1
Ich glaube nicht, dass Sie "in einer Regex-Zeichenklasse entkommen müssen, also sollten \\\\\"(fünf Backslashes) in Ordnung sein.
Lynn
2

Unterlast , 11 Bytes

(a(S)*)~^^S

Probieren Sie es online!

Die Eingabe muss auf dem Stapel beginnen, wobei die Nummer in Form einer Kirchennummer oben steht . Ich weiß nicht, ob dies eine gültige Eingabemethode ist, aber die Spezifikation hat keine Eingabe, und das Platzieren der Eingabe an der Spitze des Stapels scheint eine in solchen Sprachen verwendete gestrandete Methode zu sein.

MegaTom
quelle
1

QuadR , 8 Bytes

Einfache Übersetzung der Antwort von ngn .

Nimmt nals Argument und sals Input.

^|'|$
'&

Probieren Sie es online!

PCRE R rsetzen alle Instanzen

^|'|$ Zeilenanfang ODER Zitat ODER Zeilenende

'& mit einem Zitat und dem gesamten Spiel

Das Argument gibt an, wie oft die Umwandlung wiederholt werden soll.

Adam
quelle
Ah, jetzt weiß ich, wofür diese Sprache ist :)
ngn
1

R , 62 Bytes

f=function(n,s){"if"(n,{formals(f)$n=n-1;formals(f)$s=s;f},s)}

Probieren Sie es online!

Nennen Sie es so: f(n,s)gefolgt von nKopien von()

Eine benannte Funktion; Gibt eine anonyme Funktion zurück. Es ändert lediglich die Standardwerte von formalsof f, sodass die resultierende Funktion aufgerufen werden kann (und dann das Ergebnis der aufgerufenen ntimes). Wenn es nerreicht ist 0, kehrt es zurücks .

R ist eigentlich gar nicht so schlecht zu entkommen! Es wird ein C-Style-Escaping verwendet, sodass Sie nur die Eingabe übernehmen, "mit \"und \mit ersetzen \\und dann das Ganze einpacken müssen " ".

Giuseppe
quelle
0

Pyth, 21 Bytes

L++NsXbJ,N\\+L\\JNyFz

Probieren Sie es hier aus.

Leider ist die rekursive Funktion (nicht volles Programm wie oben) länger (24 Bytes):

M?GgtG++NsXHJ,N\\+L\\JNH
Erik der Outgolfer
quelle
0

APL (Dyalog Classic) , 19 Byte

'^|''|$'r'''&'⍣⎕⊢⍞

Probieren Sie es online!

ngn
quelle
Das ist sehr schlau. Ich habe diesen Ansatz ausprobiert, aber nicht daran gedacht, voranzustellen.
Adám
Verkaufe auch das .
Adám
0

Ruby , 34 Bytes

%pist ein Ruby-spezifisches printf-Flag, das den inspectWert seines Arguments erhält , ähnlich wie %rin Python. $><<bedeutet drucken.

f=->n,s{"$><<%p"%(n>1?f[n-1,s]:s)}

Probieren Sie es online!

Wert Tinte
quelle
0

Excel VBA (32-Bit), 67 Byte

Version Auf 32-Bit-Excel-VBA beschränkt, da 2^i Auswertung in 32-Bit-VBA ohne Fehler erfolgt, in 64-Bit-VBA jedoch nicht

Anonymous VBE Direkt - Fenster - Funktion , die Eingänge nimmt nund saus aus Bereichen [A1]und [B1]und gibt eine anonyme Funktion , dass , wenn nur ein Terminal (nach unten ausgewertet nIterationen) Ausgänge nur sals dieses Endgerät

For i=0To[A1-1]:q=q+"?"+String(2^i,34):Next:?q[B1]Replace(q,"?","")

Sample Input / Output

[A1:B1]=Array(7, "PPCG")
For i=0To[A1-1]:q=q+"?"+String(2^i,34):Next:?q[B1]Replace(q,"?","")
?"?""?""""?""""""""?""""""""""""""""?""""""""""""""""""""""""""""""""?""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""PPCG"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
?"?""?""""?""""""""?""""""""""""""""?""""""""""""""""""""""""""""""""PPCG"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
?"?""?""""?""""""""?""""""""""""""""PPCG"""""""""""""""""""""""""""""""
?"?""?""""?""""""""PPCG"""""""""""""""
?"?""?""""PPCG"""""""
?"?""PPCG"""
?"PPCG"
PPCG
Taylor Scott
quelle