Trabajo doble: quine! DlroW, olleH

13

Escriba un programa que genere su propio código fuente cuando se ejecute, y nada más. Parece fácil, ¿verdad?

El problema es que cuando se invierte el código fuente, su programa debe mostrar "¡Hola, mundo!" exactamente, sin las comillas.

Este es el código de golf, por lo que gana el conteo de bytes más bajo.

Editar : Su quine debe ser una quine adecuada.

ericw31415
fuente
44
@Mego para ser justos, este no es el tipo de quine generalizado del que hablo allí, ya que no se trata de "imprimir la función X de su código fuente". Dicho esto, probablemente no se desarrolle de manera muy diferente a los otros desafíos "cuando invierte el programa ..." que tenemos.
Martin Ender
1
@ MartinBüttner Es lo suficientemente similar a los desafíos que describiste que siento que se aplica el mismo razonamiento.
Mego

Respuestas:

8

Y, 19 bytes

Upxp"!dlroW ,olleH"

Ucaptura una cadena Ual principio hasta que Use cumpla el siguiente , en este caso, el código fuente. pimprime el artículo y xes un enlace de terminación. Cuando se invierte, esto se ve así:

"Hello, World!"pxpU

Esto captura la cadena y la imprime con p, nuevamente terminando el programa con x.

Pruébalo aquí!

Conor O'Brien
fuente
44
Uempuja Uimplícitamente? ಠ_ಠ
Sp3000
1
@ Sp3000 Está hecho para que el programa pueda modificarse a sí mismo. Más técnicamente, el Ucomando es el "comando de captura de enlace de cadena". No está hecho para quining, pero eso no me impedirá usarlo para quining. : P
Conor O'Brien
1
No estoy seguro de que esto cuente como una quine adecuada. Nuestra definición requiere una sección del programa que codifica una parte diferente del programa , pero U...solo codifica U....
Dennis
@Dennis define codificaciones? Pensé que el pbit hizo la salida, que era parte de la codificación.
Conor O'Brien el
1
Tomé codificar como algo que genera la salida, por lo que py xno contaría. Por ejemplo, la quine SMBF más corta todavía se considera una quine trampa, a pesar de que el código tiene que imprimirla. Sin embargo, podría valer la pena pedirle una aclaración a Martin.
Dennis
20

JavaScript (ES6), 42 38 bytes

f=_=>/\//g&&"f="+f||"!dlroW ,olleH">=_

Invertido

_=>"Hello, World!"||f+"=f"&&g//\/>=_=f

Explicación

Cuando se invierte, se convierte en una función anónima que devuelve la cadena Hello, World!.

La expresión regular se /\//gconvierte en un comentario cuando se invierte, lo que permite que el valor sintácticamente inválido se comente >=_=fen el código invertido.

usuario81655
fuente
Esto es muy inteligente. :) No hubiera pensado en esto.
ericw31415
3
1 sólo para los inquietos ojos: =_=.
Darrel Hoffman
6

JavaScript (ES6), 71 bytes

trela=a=>alert("trela="+trela+"\ntrela\n``")//
`!dlroW ,olleH`
trela
``

Cómo funciona:

La línea 1 define la función trelaque cuando se ejecuta genera el código fuente del programa. La línea 2 es una cadena no asignada, no hace nada. Las líneas 3 y 4 llaman trelaabusando de la sintaxis de cadena de plantilla.

Invertido:

``
alert
`Hello, World!`
//)"``n\alertn\"+alert+"=alert"(trela>=a=alert

Cómo funciona:

La línea 1 es una cadena no asignada, no hace nada. Las líneas 2 y 3 abusan de la sintaxis de cadena de plantilla para imprimir Hello, World!. La línea 4 es un comentario.

jrich
fuente
Veo que JavaScript parece tener cierto margen de maniobra con su sintaxis. Bueno, al menos más que Python. Eso es bueno.
R. Kap
¿Es ``innecesario el vacío ?
Rɪᴋᴇʀ
@EasterlyIrk No, es necesario llamar a la trelafunción (que imprime el quine) en la versión de
reenvío
@jrich oh, no me di cuenta de que ese ``era el argumento. Frio.
Rɪᴋᴇʀ
2
Siento que debería acostumbrarme a ver trelapor aquí ...> _>
Conor O'Brien
3

GolfScript, 29 28 bytes

"` '. ~]' # \ "! dlroW, olleH". ~]

Tiene una nueva línea final. Pruébalo aquí.

Invertido:

] ~. "¡Hola, mundo!" \ # '] ~ .'' "

Pruébalo aquí.

jimmy23013
fuente
2

RETORNO , 94 bytes

"34¤¤,,,,,,,,,,,,,% 'H'e'l'l'o',' 'w'o'r'l'd'!'"34¤¤,,,,,,,,,,,,,% 'H'e'l'l'o',' 'w'o'r'l'd'!'

Invertido:

'!'d'l'r'o'w' ','o'l'l'e'H' %,,,,,,,,,,,,,¤¤43"'!'d'l'r'o'w' ','o'l'l'e'H' %,,,,,,,,,,,,,¤¤43"

Try it here.

Salidas a STDOUT. Hasta que encuentre un mejor marco de trabajo, esto tendrá que hacer por ahora.

Explicación

"34¤¤,,,,,,,,,,,,,% 'H'e'l'l'o',' 'w'o'r'l'd'!'"

Este contiene la cadena de quine. A la inversa, esto se empuja a la pila pero no se emite.

34¤¤,,,,,,,,,,,,,

Esto empuja un carácter de presupuesto a la pila y genera el resultado dos veces hasta que no quede nada para generar. A la inversa, esto imprimirá los códigos de acceso que ya están en la pila.

% 'H'e'l'l'o',' 'w'o'r'l'd'!'

Este muestra el elemento de la pila superior (al revés, esto haría aparecer un carácter espacial) y empuja una serie de códigos de carga a la pila (en el reverso, estos códigos de caracteres serían luego impresos por la serie de ,'s).

Mama Fun Roll
fuente
No puedo decir si este es un código de RETORNO realmente loco, o simplemente el código de RETORNO normal ._.
Downgoat
Ambos ;_; Lloro todo el tiempo
Mama Fun Roll
2

Fisión 2, 42 bytes

Adaptación descarada de una excelente frase de @ MartinBüttner en esta respuesta

'!+O!'!d'!l'!r'!o'!W'! '!,'!o'!!l'!e'!H'R"

Pruébalo en línea

Y revertido

"R'H!'e!'l!!'o!',!' !'W!'o!'r!'l!'d!'!O+!'

Pruébalo en línea

En la versión quine, el átomo comienza en el Rencabezado de la derecha. Las "aperturas modo que envuelve a la siguiente impresión "(en sí misma). Esto imprime todo excepto el ". '!+pon el átomo en char ". Olo imprime y destruye el átomo que finaliza el programa.

La versión inversa comienza en el R nuevo y para cada personaje en Hello, Worldestablece el átomo y lo imprime !sin destruir el átomo. Para el personaje final, !la huella Odestruye el átomo.

MickyT
fuente
1

Javascript ES6, 55 bytes

$=_=>`$=${$};$()//"!dlroW ,olleH"`;$()//"!dlroW ,olleH"

Muy simple, de verdad.

Mama Fun Roll
fuente
0

Python 2, 131 bytes

Adelante:

print(lambda x:x+repr(x)+")#'!dlroW ,olleH' tnirp")('print(lambda x:x+repr(x)+")#\'!dlroW ,olleH\' tnirp")(')#'!dlroW ,olleH' tnirp

Marcha atrás:

print 'Hello, World!'#)'()"print '\Hello, World!'\#)"+)x(rper+x:x adbmal(tnirp'()"print 'Hello, World!'#)"+)x(rper+x:x adbmal(tnirp

La primera mitad es una línea de una línea, seguida de una #para formar un comentario que separa la primera mitad de la segunda mitad más simple.

csvoss
fuente
La adaptación de esta quine de Python da_='_=%r;print _%%_#"!dlroW ,olleH"tnirp';print _%_#"!dlroW ,olleH"tnirp
Sp3000
0

C, 108 bytes

char*s="char*s=%c%s%c;main(){printf(s,34,s,34);}";main(){printf(s,34,s,34);}//};)"!dlroW ,olleH"(stup{)(niam
MIllIbyte
fuente
C99 supongo?
Neil
0

Python 2, 70 bytes

_='_=%r;print _%%_#"dlroW ,olleH"tnirp';print _%_#"!dlroW ,olleH"tnirp
Erik el Outgolfer
fuente