Un altro programma e sono fuori!


21

Dato un livello di nidificazione di numeri interi positivi ne una stringa sdi caratteri ASCII stampabili ( a ~, genera un programma che, quando eseguito nella stessa lingua, genera un programma che genera un programma ... che genera la stringa s.

nDovrebbero essere generati un totale di programmi, che dovrebbero essere eseguiti nella stessa lingua della risposta.

Nota: è possibile emettere programmi o funzioni, tutto ciò che è consentito per impostazione predefinita come invio.

Puoi inserire scon caratteri di escape, come un programma o una funzione nella tua lingua in genere inseriscono una stringa.


Esempio

Ad esempio, dato n=1e s="recursion", un programma Python 2 potrebbe produrre:

print "recursion"

L'esecuzione di questo produrrebbe:

recursion

Dato n=2e s = "PPCG", un programma Python 2 potrebbe generare:

print "print \"PPCG\" "

Esecuzione di questo output:

print "PPCG"

Esecuzione di questo output:

PPCG

Correlati (+ titolo ispiratore): ancora una volta LUL e sono fuori

Anche correlato (nella sandbox - ora eliminato, ma può ancora essere visualizzato con sufficiente reputazione): ricorsione del codice sorgente

Casi test

Assicurarsi che il codice funzioni per i seguenti casi di test (uno per riga):

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
code-golf  recursion  code-golf  kolmogorov-complexity  board-game  code-golf  number-theory  polynomials  code-golf  code-golf  array-manipulation  polyglot  alphabet  answer-chaining  code-golf  sequence  math  atomic-code-golf  abstract-algebra  proof-golf  code-golf  internet  code-golf  internet  code-golf  ascii-art  kolmogorov-complexity  code-golf  math  ascii-art  number  integer  code-golf  decision-problem  binary-matrix  code-golf  number  sequence  number-theory  code-golf  math  decision-problem  matrix  abstract-algebra  code-golf  string  keyboard  code-golf  fractal  code-golf  math  sequence  combinatorics  hello-world  vim  code-golf  sequence  code-golf  graphical-output  image-processing  code-golf  decision-problem  matrix  linear-algebra  code-golf  ascii-art  code-golf  math  code-golf  ascii-art  graphical-output  code-golf  string  code-golf  string  substitution  code-golf  string  ascii-art  code-golf  arithmetic  code-golf  number  array-manipulation  decision-problem  code-golf  kolmogorov-complexity  code-generation  fractal  code-golf  ascii-art  kolmogorov-complexity  code-golf  ascii-art  code-golf  string  array-manipulation  code-golf  music  code-golf  array-manipulation  code-golf  internet  stack-exchange-api  math  fastest-algorithm  code-golf  binary  bitwise  code-golf  date  code-golf  string  code-golf  sequence  integer  code-golf  arithmetic  number-theory  code-golf  string  random 

1
Stavo leggendo la sfida ed era tipo "hey, sembra molto familiare ..", e poi ho notato il tuo " Anche correlato (nella sandbox): Ispirazione del codice sorgente " alla mia domanda Sandbox. :) Lascerò la mia domanda lì per ora, ma la cancellerò dopo un paio di settimane. Il tuo è sostanzialmente lo stesso, tranne con l'aggiunta di un parametro intero.
Kevin Cruijssen,

1
Come suggerito qui , è consentito restituire funzioni anonime anziché programmi?
Arnauld,

1
"Numero intero positivo" include 0?
Felix Palmen,

1
Hai scelto il programma per un motivo? L'impostazione predefinita è funzione o programma? È consentito avere una funzione per stampare una funzione?
Kevin Cruijssen,

1
@StewieGriffin perché la fuga in sottoespressioni o programmi nidificati potrebbe essere problematica (e qualcuno ha chiesto casi di test di preventivo nella sandbox).
fireflame241,

Risposte:


19

Gelatina , 2 byte

Ṿ¡

Provalo 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


Questo è rotto, "ciao" produce ciao, non "ciao"
Tahg,

10
L'input di @Tahg Jelly viene automaticamente valutato come codice Python se non genera un errore. Se lo fa, allora è solo una stringa. Dovresti fare '"hi"'per vedere il risultato atteso
HyperNeutrino,

19

JavaScript (ES6), 47 44 byte

Salvato 3 byte grazie a @HermanLauenstein

Accetta input nella sintassi del curry (n)(s).

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

Esempio

f(2)('PPCG')

Uscita:

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

Che stamperà:

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

Che stamperà:

'PPCG'

dimostrazione

Un esempio più complesso in cui alert()è stato ignorato in modo che i risultati intermedi vengano stampati sulla console ed eseguiti automaticamente.


Versione alternativa, 40 byte

Suggerito da @Shaggy

Questo restituisce una funzione anonima anziché un programma completo.

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

Potresti restituire una funzione anonima, invece di utilizzare il alert? 41 byte
Shaggy,

@Shaggy Non lo so davvero. Ho chiesto al PO.
Arnauld,

Altrimenti, forse potresti cavartela con un IIFE invece di 45 byte.
Shaggy,

-3 byte usando il curry: n=>g=s=>BTalert(atob("${btoa(--n?g(s):s)}"))BT(sostituisci BT con i backtick)
Herman L

@HermanLauenstein Grazie! :)
Arnauld,

10

sh + coreutils, 31 byte

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

Accetta ncome parametro della riga di comando e ssu STDIN.


8
Questo codice dice: "Sì, devi assolutamente eseguirmi."
RedClover,

Puoi aggiungere una spiegazione? Sto avendo problemi a risolverlo
JoshRagem,

1
@JoshRagem yesstampa ripetutamente la sua riga di comando, ovvero exec sed 1d $0( $è un metacarattere shell quindi deve essere citato). sed $1qinterrompe la stampa dopo $1(cioè n) le righe. catquindi copia la stringa di input. Il file risultante è uno shscript che dice alla shell di sostituirsi con una copia sedcon i parametri 1de il nome del file dello script. sedquindi salta la prima riga del file e restituisce il resto. Ogni script ha un exec sed 1d $0prefisso in meno , fino a quando dopo le nesecuzioni viene stampato solo l'input originale.
Neil,


5

Haskell, 17 byte

A partire da quando scrivo questo, questa è la risposta più breve per un linguaggio non specifico per il golf .

È una funzione che accetta se nin quell'ordine e restituisce il risultato o il codice sorgente di un'espressione che, quando valutato, restituisce il codice sorgente successivo.

(!!).iterate show

Argomento per cui questo conta:

  1. Le soluzioni possono essere funzioni.
  2. Le loro uscite possono essere funzioni.
  3. Queste funzioni non hanno parametri.
  4. In Haskell, dato che è pigro e tutto è curry, il più naturale - ai fini della programmazione pratica - la definizione di una funzione con parametro 0 è la stessa del suo risultato; l'alternativa più vicina, una funzione a 1 parametro che ignora il parametro, è sciocca.

Se fè dato PPCGe 2come i suoi parametri, il risultato è il testo "\"PPCG\""(prima funzione generata), che quando valutato restituisce il testo "PPCG"(seconda funzione generata), e quando viene valutato restituisce PPCG.

Grazie a nimi per aver suggerito un accorciamento.


C'è una domanda Meta pertinente sulla questione delle funzioni senza argomenti in Haskell, sebbene non abbia ancora ricevuto molta attenzione e abbia ancora domande aperte: codegolf.meta.stackexchange.com/q/12924/56433
Laikoni

3

APL (Dyalog) , 24 23 byte

-1 grazie a ngn.

Questo è un programma completo che richiede se quindi nstampa e stampa su STDOUT.

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

Provalo online! (il caso Deep 17 viene omesso poiché supera il limite di output di TIO - funziona offline)

richiedere s

 cedere che (separare e )

''''{... }⍣⎕ richiede ne applica questo lambda con una sola citazione come argomento sinistro che molte volte. sta per l'argomento di sinistra (la citazione) ed è l'argomento di destra (il testo di input):

⍵=⍺ Booleano in cui il testo è uguale a una citazione

1+ Aggiungi uno

⍵/⍨ replicare ogni carattere dell'argomento il numero corrispondente di volte

⍺, anteporre un preventivo

⍺,⍨ aggiungere un preventivo

Ciò funziona perché le stringhe in APL sono 'delimitate e le virgolette singole nelle stringhe sono raddoppiate, mentre nessun altro carattere deve essere sottoposto a escape.


Dyalog APL viene inoltre fornito con un'utilità ( ⎕SE.Dyalog.Utils.repObj) che genera un'espressione APL che valuta il suo argomento (simile al diseguale di Jelly ). Il seguente programma è quindi equivalente a quanto sopra, ma funziona per tutti gli array:

SE.Dyalog.Utils.repObj⍣⎕⊢⎕

Provalo online!


Penso che APLX consenta stringhe "doppiamente" e "citate singolarmente". Se il resto funziona lì, puoi salvare un byte :) ngn / apl usato ma ho rimosso "" di recente
ngn

Considera di passare la citazione come .- che salva (almeno) un byte.
ngn,

@ngn Grazie, ma APLX non ha dfns. NARS2000 ha virgolette doppie e dfns, ma i caratteri costano due byte ciascuno.
Adám,

2

Firefox JavaScript, 41 35 byte

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

Firefox ha un bel uneval, che fa quello che sembra - annulla un determinato oggetto, in questo caso - stringa.


2

Java 8, 95 93 byte

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

-2 byte grazie a @Lynn .

Fuggire personaggi speciali è così fastidioso in Java ..

Provalo qui e prova qui il metodo risultante .

Spiegazione:

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 

Spiegazione aggiuntiva per la sostituzione di regex:

.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

Perché tutte queste barre?

\   →  \\       // Escapes a single slash for the regex
\\  →  \\\\     // Escapes both regex-escaped slashes for the String
"   →  \"       // Escapes a double-quote for the String

1
Non penso che tu debba scappare "in una classe di personaggi regex, quindi \\\\\"(cinque barre rovesciate) dovrebbe andare bene.
Lynn,

2

Sottocarico , 11 byte

(a(S)*)~^^S

Provalo online!

L'input deve iniziare in pila, con il numero in alto sotto forma di un numero di chiesa . Non so se questo è un metodo di input valido, ma la specifica non ha input e posizionare l'input nella parte superiore dello stack sembra un metodo bloccato utilizzato in tali lingue.



1

QuadR , 8 byte

Traduzione semplice della risposta di ngn .

Prende ncome argomento e scome input.

^|'|$
'&

Provalo online!

PCRE R EPosizionare tutte le istanze di

^|'|$ Inizio riga O Preventivo O Fine riga

'& con un preventivo e l'intera partita

L'argomento specifica quante volte ripetere la trasformazione.


ah, ora so a cosa serve quella lingua :)
ngn

1

R , 62 byte

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

Provalo online!

Chiamalo così: f(n,s)seguito dan copie di()

Una funzione denominata; restituisce una funzione anonima. Tutto ciò che fa è modificare i valori predefiniti di formalsof f, consentendo di chiamare la funzione risultante (e quindi il risultato di quella chiamata, nvolte). quando nraggiunge 0, ritornas .

R in realtà non è poi così male a fuggire! Utilizza l'escaping in stile C, quindi devi solo prendere l'input, sostituirlo "con \"e \con \\e quindi avvolgere il tutto " ".


0

Pyth, 21 byte

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

Provalo qui.

Sfortunatamente la funzione ricorsiva (non programma completo come sopra) è più lunga (24 byte):

M?GgtG++NsXHJ,N\\+L\\JNH


0

Rubino , 34 byte

%pè un flag printf specifico di Ruby che ottiene il inspectvalore del suo argomento, simile a quello %rin Python. $><<significa stampa.

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

Provalo online!


0

Excel VBA (32 bit), 67 byte

Versione limitata a VBA Excel a 32 bit perché viene 2^ivalutata senza errori in VBA a 32 bit, ma non in VBA a 64 bit

Funzione di finestra immediata VBE anonima che accetta input ne sda intervalli [A1]e [B1]restituisce una funzione anonima che, se valutata fino a un solo terminale (dopo niterazioni), genera solo squel terminale

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

Ingresso / uscita campione

[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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.