Programa que genera un programa que genera un programa ... que genera "¡Hola!"

8

Desafío

Escriba el programa más corto P de manera que

  • P toma cualquier número entero positivo n como entrada y emite una cadena de programa P 1
  • ejecutar P 1 (sin entrada) genera una cadena de programa P 2 ,

  • ejecutar P 2 (sin entrada) genera una cadena de programa P 3 ,

  • ...

  • ejecutar P n (sin entrada) genera exactamente "¡Hola!" (sin las comillas).

Esquemáticamente:

                P (n) → P 1 → P 2 → ... → P n → ¡Hola!

Criterios

  • I / O es a través de stdin / stdout.
  • La longitud del programa se mide en bytes.
  • Los programas consisten solo en caracteres imprimibles ASCII.
  • No debe haber duplicados entre los programas P, P 1 , ..., P n .

EDITAR: Los programas P, P 1 , ..., P n están destinados a ser código fuente, y "ejecutar el programa" se refiere a cualquier procesamiento que produzca la salida (es decir, interpretación, compilación y ejecución, etc.).

res
fuente
1
Relacionado: codegolf.stackexchange.com/questions/5510/can-you-meta-quine
dmckee --- ex-gatito moderador
@dmckee: la relación, si la hay, parece muy remota. Esquemáticamente, el comportamiento de una quine es como P -> P , y el comportamiento de los programas vinculados es como P -> Q -> P ; pero aquí el comportamiento es como P (n) -> ...--> ¡Hola! , donde no se requiere que P se parezca a ninguna de las salidas.
res
1
Eso no es una crítica, solo una nota de que a las personas que les gusta este problema también les podría gustar el otro.
dmckee --- ex-gatito moderador
@dmckee - Buen punto, gracias.
res

Respuestas:

10

Golfscript 39 14

~'Hello!'{`}@*

Ejemplo:

Suponiendo que n = 4 y nuestro programa es P , estos son los pasos:

  1. Ejecute P con el parámetro 4 . La salida es "\"\\\"\\\\\\\"Hello!\\\\\\\"\\\"\""( P 1 )

  2. Ejecución de salidas P 1"\"\\\"Hello!\\\"\"" ( P 2 )

  3. Ejecución de salidas P 2"\"Hello!\"" ( P 3 )

  4. Ejecución de salidas P 3"Hello!" ( P 4 )

  5. Ejecutando salidas P 4Hello! . Si no confías en mí, sigue este enlace ☺.

Cristian Lupascu
fuente
1
Encuentro que su P1, P2, P3, P4 se comportan según sea necesario, pero con la entrada de stdin su P no emite P1; en su lugar, emite \'\\\'\\\\\\\'Hello!\\\\\\\'\\\'\'(es decir, faltan las comillas externas), cuando lo ejecuto tanto en Linux como en Win 7 (usando echo 4 | ...en el símbolo del sistema). ¿Alguna idea de cuál podría ser el problema?
res
@res Tienes razón; Esa es una deficiencia del sitio web de pruebas Golfscript que hice. Logré arreglar eso agregando tres caracteres, pero mientras tanto encontré una versión mucho más corta y edité mi publicación.
Cristian Lupascu
@res La versión correcta del antiguo enfoque es~''\(,{)2\?('\\'*}/]"'"*:z"'Hello!"z-1%"'"
Cristian Lupascu
¡A 14 bytes, impresionante! ... y buen sitio web por cierto. (Parece que la entrada estándar se puede simular que precede a un programa ;"...", donde ...está la entrada, por ejemplo,. ;"4"Habría revelado el problema de desaparición de cita anterior, mientras que sólo precede al programa "4"no lo hace.) ...
res
@res Muchas gracias! Tienes toda la razón sobre el liderazgo ;. Cuando escribí el primer programa, me olvidé de esto en el camino, aunque fui yo quien escribió sobre él en el sitio meta: meta.codegolf.stackexchange.com/a/521/3527
Cristian Lupascu
4

JavaScript, 58 caracteres

function $(_){alert(_?$+'$('+--_+')':'Hello!')}$(prompt())
Copiar
fuente
¿Cómo funciona?
thepirat000
@ thepirat000 Si el argumento _es 0, genera "¡Hola!"; de lo contrario, genera la definición de función y llama con _menos uno
copie el
+1 por abusar de las reglas usando un contador en lugar de alargar el código ...
WallyWest
4

Perl ( 45 36)

say"say q("x($m=<>),"Hello!",")"x$m         

Ejecutar con perl -M5.010para usar say.

For n=1, salidas say q(Hello!)
For n=2, salidas say q(say q(Hello!))
For n=3, salidas, say q(say q(say q(Hello!)))
etc.

marinus
fuente
2

Python3, 66

r="print(%r)";e=eval;n=e(input())+1;e(e("(r%"*n+"'Hello!'"+")"*n))
Ev_genus
fuente
2

Lisp común, 68 caracteres

(do((n(read)(1- n))(s'(princ"Hello!")`(print',s)))((= 0 n)(eval s)))
(do ((n (read) (1- n))
     (s '(princ "Hello!") `(print ',s)))
    ((= 0 n) (eval s)))

Lo único que no es sencillo: genera un nivel de programa más de lo necesario y lo evalúa, porque evales un carácter más corto que print.

Kevin Reid
fuente
2

Lisp común: 65

#1=(SETF N(READ)(CADDR'#1#)(1- N)W(PRINT(IF(= N 0)"Hello!"'#1#)))

Esta versión es más pequeña que la respuesta CL existente. En caso de que su Lisp croe con un stackoverflow, entonces tiene que usar esto, 81 bytes:

#1=(SETF N(READ)*PRINT-CIRCLE* T(CADDR'#1#)(1- N)W(PRINT(IF(= N 0)"Hello!"'#1#)))

Sé que llego tarde a la fiesta, y estoy seguro de que esto aún podría optimizarse.

Demostración (cuidado, algunos REPL en línea no funcionan correctamente):

* #1=(SETF N(READ)*PRINT-CIRCLE* T(CADDR'#1#)(1- N)W(PRINT(IF(= N 0)"Hello!"'#1#)))
2
#1=(SETF N 1
         *PRINT-CIRCLE* T
         (CADDR '#1#) (1- N)
         W
           (PRINT
            (IF (= N 0)
                "Hello!"
                '#1#))) 
#1=(SETF N 1
         *PRINT-CIRCLE* T
         (CADDR '#1#) (1- N)
         W
           (PRINT
            (IF (= N 0)
                "Hello!"
                '#1#)))
* (eval *)

#1=(SETF N 0
         *PRINT-CIRCLE* T
         (CADDR '#1#) (1- N)
         W
           (PRINT
            (IF (= N 0)
                "Hello!"
                '#1#))) 
#1=(SETF N 0
         *PRINT-CIRCLE* T
         (CADDR '#1#) (1- N)
         W
           (PRINT
            (IF (= N 0)
                "Hello!"
                '#1#)))
* (eval *)
"Hello!" 
"Hello!"
* 

Tenga en cuenta que:

  • Probado con SBCL 1.2.11.debian

  • Hay muchas advertencias porque estoy haciendo cosas que, en serio, no deberían hacerse. Afortunadamente, todas las advertencias se imprimen con un punto y coma, por lo que se tratarán como comentarios de todos modos.

  • La duplicación se debe a que uno es el valor de retorno y una salida real. Si el valor de retorno también cuenta, entonces se simplifica a 58 bytes:#1=(SETF N(READ)(CADDR'#1#)(1- N)W(IF(= N 0)"Hello!"'#1#))

  • Todavía sé que llego tarde a la fiesta

Mike Gebirge
fuente
1

Python 2.7, 57

print reduce(lambda x,y:y+`x`,input()*["print"],"Hello!")
JPvdMerwe
fuente
1

Haskell, 62

main=interact$(iterate(("main=putStr"++).show)"Hello!"!!).read
Joey Adams
fuente
1

Bash, 47 o 12 (si uso golfbash)

Código:

read x;for((;x>=0;x--)){ O+=" echo";};$O Hello!

código de golfbash:

R;n e Hello!

Código anterior (49):

read x;E=echo;eval \"\${E[0]\"{0..$x}\"}\" Hello!

Utilizar:

Hacer programa P

$ echo '<paste code here>' > P

$ chmod +x P

Ejemplo

Hacer P1:

$> echo 4 | ./P > 
echo echo echo echo Hello!

Hacer P2:

$> echo 4 | ./P | bash
echo echo echo Hello!

Hacer P3:

$ echo 4 | ./P | bash | bash
echo echo Hello!

Hacer P4:

$ echo 4 | ./P | bash | bash | bash
echo Hello!

Ejecute P4:

$ echo 4 |./P | bash | bash | bash | bash
Hello!

Digamos que creo un nuevo lenguaje de propósito general llamado golfbash, un poco como golfscript, que tiene algunos comandos útiles como estos:

R which reads stdin and places result into variable $REPLY.
n $1 $2 which echo's $1 $REPLY times followed by $2.
e which echo's all parameters to stdout.

Entonces podría escribir esto:

R;n e Hello!

Esto sería legal, ¿no?

philcolbourn
fuente
1
Eso es rudo. -1 para qué?
philcolbourn
+1. Supongo que el voto negativo fue para su lenguaje inventado que parece ser específicamente para este desafío. Ver meta.codegolf.stackexchange.com/questions/871/…
Cees Timmerman el
Bien, pero también lo hice en bash.
philcolbourn
0

F #, 182

let say msg = sprintf "%s" msg
let gen num = 
    let rec g n a =
        match n with
        | i when i > 0 -> g (i-1) ("say \"" + a + "\"")
        | _ -> say a
    g num "Hello!"
vasu
fuente
Cuando ejecuto su programa , no parece que ingrese nada desde stdin, ni que muestre nada a stdout.
res
0

J - 31 char

Tenga en cuenta que J usa cadenas de estilo Pascal: 'It''s too easy!'

'Hello!'(],,)''''#~<:2^".1!:1]1

Explicado:

  • ".1!:1]1 - Leer en una línea de stdin y convertirlo en un número.
  • <:2^ - Lleva 2 a la potencia de este número y disminuye.
  • ''''#~ - Haga una cadena con tantas copias del carácter de comillas simples.
  • 'Hello!'(],,)- Agregue estas citas al frente y al reverso de Hello!.

Uso:

   'Hello!'(],,)''''#~<:2^".1!:1]1   NB. let's try 3
3
'''''''Hello!'''''''
   '''''''Hello!'''''''  NB. P1
'''Hello!'''
   '''Hello!'''          NB. P2
'Hello!'
   'Hello!'              NB. and P3 prints Hello!
Hello!
Algoritmo de tiburón
fuente
0

Python 2.7: 75

def h(n):
 return "Hello"if n<1 else'print %s' % `h(n-1)`
print h(input())

Golf por primera vez, no estoy seguro si lo estoy haciendo bien; p

heo
fuente
2
¿No supone eso que la definición de htambién se conoce en los programas posteriores? (¿Para que esto deba ejecutarse en un REPL o algo así?)
Martin Ender
0

Clojure, 36 bytes

(str(apply str(repeat 5\'))"Hello!")

Símbolo

'something

evalúa a

something

Cree un símbolo con 5 comillas simples y ejecute el resultado hasta que no queden comillas.

Michael M
fuente