¡Un programa más y estoy fuera!

21

Dado un nivel de anidamiento de entero positivo ny una cadena sde caracteres ascii imprimibles ( para ~generar un programa que, cuando se ejecuta en el mismo idioma, genera un programa que genera un programa ... que genera la cadena) s.

Se ndebe generar un total de programas, todos los cuales se deben ejecutar en el mismo idioma que su respuesta.

Nota: puede generar programas o funciones, cualquier cosa que se le permita de forma predeterminada como envío.

Puede ingresar scon caracteres de escape, cómo un programa o función en su idioma generalmente ingresará una cadena.


Ejemplo

Por ejemplo, dado n=1y s="recursion", un programa Python 2 podría generar:

print "recursion"

Ejecutar esto generaría:

recursion

Dado n=2y s = "PPCG", un programa Python 2 podría generar:

print "print \"PPCG\" "

Ejecutando estas salidas:

print "PPCG"

Ejecutando estas salidas:

PPCG

Relacionado (+ inspiración del título): un LUL más y estoy fuera

También relacionado (en sandbox, ahora eliminado, pero aún se puede ver con suficiente reputación): Recursión de código fuente

Casos de prueba

Asegúrese de que su código funcione para los siguientes casos de prueba (uno por línea):

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
fuente
1
Estaba leyendo el desafío y estaba como "oye, eso me parece muy familiar ...", y luego noté tu " También relacionado (en sandbox): inspiración del código fuente " a mi pregunta de Sandbox. :) Dejaré mi pregunta allí por ahora, pero la eliminaré después de un par de semanas. El suyo es básicamente el mismo, excepto con la adición de un parámetro entero.
Kevin Cruijssen
1
Como se sugiere aquí , ¿está permitido devolver funciones anónimas en lugar de programas?
Arnauld
1
¿Incluye "entero positivo" 0?
Felix Palmen
1
¿Elegiste el programa por alguna razón? El valor predeterminado es función o programa? ¿Está permitido tener una función imprimiendo una función?
Kevin Cruijssen
1
@StewieGriffin porque escapar en sub-expresiones o programas anidados puede ser problemático (y alguien solicitó casos de prueba de cotización en sandbox).
fireflame241

Respuestas:

19

Jalea , 2 bytes

Ṿ¡

Pruébalo en línea!

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

jeje incorporado

Hiperneutrino
fuente
Esto está roto, "hola" produce hola, no "hola"
Tahg
10
La entrada de @Tahg Jelly se evalúa automáticamente como código Python si no arroja un error. Si lo hace, entonces es solo una cadena. Tendría que hacer '"hi"'para ver el resultado esperado
HyperNeutrino
19

JavaScript (ES6), 47 44 bytes

Guardado 3 bytes gracias a @HermanLauenstein

Toma entrada en la sintaxis de curry (n)(s).

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

Ejemplo

f(2)('PPCG')

Saldrá:

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

Que imprimirá:

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

Que imprimirá:

'PPCG'

Manifestación

Un ejemplo más complejo donde alert()se ha anulado para que los resultados intermedios se impriman en la consola y se ejecuten automáticamente.


Versión alternativa, 40 bytes.

Sugerido por @Shaggy

Este devuelve una función anónima en lugar de un programa completo.

n=>g=s=>`_=>atob("${btoa(--n?g(s):s)}")`
Arnauld
fuente
¿Podría devolver una función anónima, en lugar de usar el alert? 41 bytes
Shaggy
@ Shaggy Realmente no lo sé. Le pregunté al OP.
Arnauld
Si no, tal vez podría salirse con un IIFE en lugar de 45 bytes.
Shaggy
-3 bytes usando curry: n=>g=s=>BTalert(atob("${btoa(--n?g(s):s)}"))BT(reemplace BT con backticks)
Herman L
@HermanLauenstein Gracias! :)
Arnauld
10

sh + coreutils, 31 bytes

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

Toma ncomo parámetro de línea de comandos y sen STDIN.

Neil
fuente
8
Este código dice: "Sí, definitivamente tienes que ejecutarme".
RedClover
¿Puedes agregar una explicación? Estoy teniendo problemas para trabajar hacia fuera
JoshRagem
1
@JoshRagem yesimprime repetidamente su línea de comando, que es exec sed 1d $0( $es un metacarácter de shell, por lo que debe ser citado). sed $1qdeja de imprimir después de $1(es decir n) líneas. catluego copia la cadena de entrada. El archivo resultante es un shscript que le dice al shell que se reemplace con una copia de sedlos parámetros 1dy el nombre del archivo del script. sedluego omite la primera línea del archivo y genera el resto. Cada script tiene un exec sed 1d $0prefijo menos , hasta después de las nejecuciones, solo se imprime la entrada original.
Neil
5

Haskell, 17 bytes

A partir de cuando escribo esto, esta es la respuesta más corta para un lenguaje no específico de golf .

Es una función que toma sy nen ese orden, y devuelve el resultado o el código fuente de una expresión que, cuando se evalúa, devuelve el siguiente código fuente.

(!!).iterate show

Argumento de por qué esto cuenta:

  1. Se permite que las soluciones sean funciones.
  2. Sus salidas pueden ser funciones.
  3. Esas funciones no tienen parámetros.
  4. En Haskell, dado que es perezoso y todo es curry, lo más natural, para fines de programación práctica, la definición de una función de parámetro 0 es la misma que su resultado; La alternativa más cercana, una función de 1 parámetro que ignora el parámetro, es una tontería.

Si fse proporciona PPCGy 2como sus parámetros, el resultado es el texto "\"PPCG\""(primera función generada), que cuando se evalúa devuelve el texto "PPCG"(segunda función generada), y cuando se evalúa, devuelve PPCG.

Gracias a nimi por sugerir un acortamiento.

Kevin Reid
fuente
Hay una pregunta meta relevante sobre el tema de las funciones sin argumentos en Haskell, aunque todavía no ha recibido tanta atención y aún tiene preguntas abiertas: codegolf.meta.stackexchange.com/q/12924/56433
Laikoni
3

APL (Dyalog) , 24 23 bytes

-1 gracias a ngn.

Este es un programa completo que solicita sy luego nimprime en STDOUT.

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

Pruébalo en línea! (el caso 17 Deep se omite porque excede el límite de salida de TIO; funciona sin conexión)

solicitar s

 ceder eso (para separar y )

''''{... }⍣⎕ mensaje para ny aplicar este lambda con una comilla simple como argumento de la izquierda que en muchas ocasiones. representa el argumento izquierdo (la cita) y es el argumento correcto (el texto de entrada):

⍵=⍺ Booleano donde el texto es igual a una cita

1+ Agrega uno

⍵/⍨ replicar cada carácter del argumento el número correspondiente de veces

⍺, anteponer una cotización

⍺,⍨ agregar una cita

Esto funciona porque las cadenas en APL están 'delimitadas y las comillas simples en las cadenas se duplican, mientras que ningún otro carácter necesita escapar.


Dyalog APL también se envía con una utilidad ( ⎕SE.Dyalog.Utils.repObj) que genera una expresión APL que se evalúa según su argumento (similar al novato de Jelly ). Por lo tanto, el siguiente programa es equivalente al anterior, pero funciona para todas las matrices:

SE.Dyalog.Utils.repObj⍣⎕⊢⎕

Pruébalo en línea!

Adán
fuente
Creo que APLX permite cadenas "doblemente", así como "comillas simples". Si el resto funciona allí, puede guardar un byte :) ngn / apl solía hacerlo, pero eliminé "" recientemente
2017
Considere pasar la cita como .- que ahorra (al menos) un byte.
ngn
@ngn Gracias, pero APLX no tiene dfns. NARS2000 tiene comillas dobles y dfns, pero los caracteres cuestan dos bytes cada uno.
Adám
2

Firefox JavaScript, 41 35 bytes

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

Firefox tiene una unevalcadena agradable , que hace lo que parece: desvaloriza un objeto determinado, en este caso.

dzaima
fuente
2

Java 8, 95 93 bytes

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

-2 bytes gracias a @Lynn .

Escapar de caracteres especiales es muy molesto en Java.

Pruébelo aquí y pruebe el método resultante aquí .

Explicación:

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 

Explicación adicional para el reemplazo de expresiones regulares:

.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

¿Por qué todas estas barras?

\   →  \\       // Escapes a single slash for the regex
\\  →  \\\\     // Escapes both regex-escaped slashes for the String
"   →  \"       // Escapes a double-quote for the String
Kevin Cruijssen
fuente
1
No creo que necesite escapar "en una clase de caracteres regex, por lo que \\\\\"(cinco barras invertidas) debería estar bien.
Lynn
2

Baja carga , 11 bytes

(a(S)*)~^^S

Pruébalo en línea!

La entrada debe comenzar en la pila, con el número en la parte superior en forma de un número de iglesia . No sé si este es un método de entrada válido, pero la especificación no tiene entrada, y colocar la entrada en la parte superior de la pila parece un método varado utilizado en dichos idiomas.

MegaTom
fuente
1

QuadR , 8 bytes

Traducción simple de la respuesta de ngn .

Toma ncomo argumento y scomo entrada.

^|'|$
'&

Pruébalo en línea!

PCRE R EColoque todas las instancias de

^|'|$ Comienzo de línea O Cita O Fin de línea

'& con una cita y todo el partido

El argumento especifica cuántas veces repetir la transformación.

Adán
fuente
ah, ahora sé para qué es ese idioma :)
ngn
1

R , 62 bytes

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

Pruébalo en línea!

Llámalo así: f(n,s)seguido de ncopias de()

Una función con nombre; devuelve una función anónima Todo lo que hace es modificar los valores predeterminados de formalsof f, permitiendo que se llame a la función resultante (y luego el resultado de esa llamada, nveces). cuando nllega 0, vuelve s.

¡R no es realmente malo para escapar! Utiliza el escape de estilo C, por lo que solo tiene que tomar la entrada, reemplazar "con \"y \con \\, y luego envolver todo " ".

Giuseppe
fuente
0

Pyth, 21 bytes

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

Pruébalo aquí

Lamentablemente, la función recursiva (no es un programa completo como el anterior) es más larga (24 bytes):

M?GgtG++NsXHJ,N\\+L\\JNH
Erik el Outgolfer
fuente
0

Ruby , 34 bytes

%pes un indicador printf específico de Ruby que obtiene el inspectvalor de su argumento, similar a %rPython. $><<significa imprimir.

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

Pruébalo en línea!

Tinta de valor
fuente
0

Excel VBA (32 bits), 67 bytes

Versión restringida a Excel VBA de 32 bits porque se 2^ievalúa sin error en VBA de 32 bits, pero no en VBA de 64 bits

Función de ventana inmediata anónima VBE que toma entradas ny sde rangos [A1]y [B1]emite una función anónima que cuando se evalúa solo en un terminal (después de las niteraciones) se genera solo scomo ese terminal

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

Muestra de entrada / salida

[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
fuente