Espejo quine (o me duele la cabeza)


32

Estaba leyendo Imprima su código al revés - quine inverso Y pensé, esto podría ser más interesante si su código al revés también es ejecutable . Por lo tanto, este desafío tendrá todas las reglas y requisitos del otro, pero también debe ser una fuente válida una vez revertida (en el mismo idioma u otro y aún imprimir su fuente al revés).

Se aplican todas las reglas y la puntuación del desafío quine inverso, por lo que todas las respuestas a esta pregunta responderán a esa (pero no puntuarán también).

Editar:

Por solicitud, todas las reglas ahora se copian aquí.

Reglas:

  • escribe un programa p que cuando se ejecuta produce la salida p 'donde p' es p hacia atrás y p 'cuando se ejecuta produce p.
  • No usar otros archivos (p reverse.txt. Ej. )
  • La longitud mínima del código es de dos caracteres.
  • Su programa no puede ser un palíndromo.

Tanteo:

  • +50 si usa datos de extracción de Internet.
  • +25 si lees tu propio código fuente.
  • +1 punto por personaje.
  • La puntuación más baja gana.

eval(eval(eval(eval(eval(eval(eval(eval(eval(p)))))))))
Andrew Larsson

Solo digo que podría ejecutar la salida de ejecutar la salida de ejecutar la salida de ejecutar la salida de p (igual que cualquier quine excepto la quine hacia atrás).
Andrew Larsson

@AndrewLarsson De hecho, aunque la prueba de concepto que estoy construyendo p se escribirá en c y p 'en perl.
hildred

¡Oh, eso sería genial!
Andrew Larsson

1
Sí, lo vi muy tarde. No es un duplicado
Johannes Kuhn

Respuestas:


22

GolfScript, 46 caracteres

0{`".~#"+.-1%+\.!@@}.~##~.}@@!.\+%1-.+"#~."`{1

Bueno, esto es feo, pero funciona. La salida es igual al código invertido, y también es un programa válido de GolfScript que genera nuevamente el código original.

Bien, déjenme intentar explicar cómo lo construí. Primero, comencé desde el quine {".~"}.~y lo modifiqué como en esta respuesta para revertirlo. Para hacer que la salida sea una quine ejecutable en sí misma, hice una copia del código antes de revertirlo e incluí una #al final del código, de modo que la versión revertida al final se convirtió en solo un comentario. Por lo tanto, obtenemos la quina palindrómica:

{`".~#"+.-1%}.~##~.}%1-.+"#~."`{

Sin embargo, según las reglas, los palíndromos no están permitidos, por lo que necesitaba romper la simetría de alguna manera. Pensé que la manera más fácil sería incluir una 0(que, en sí mismo, es un quine en GolfScript) en el código y darle la vuelta a 1la !después de crear la copia invertida. La mayor parte de la complejidad restante es solo una manipulación de pila fea para obtener todo en el orden correcto.


¿También es golfscript cuando se invierte o es otro idioma?
hildred

Sí, es GolfScript en ambos sentidos. De hecho, excepto por 0y 1al principio y al final, el resto del código es un palíndromo.
Ilmari Karonen

99
Guau. De acuerdo, ya no me siento lo suficientemente inteligente para este SE :(
Cruncher

21

Perl y C 6478 1955

#!/usr/bin/perl -i//
$_=<<'rahc';eval $_; #//
print scalar reverse "#!/usr/bin/perl -i//\n\$_=<<'rahc';eval \$_; #//\n${_}rahc\n" #//
__END__
__END__ enifed#
};)"{ = ][cn\rahcn\n\"(p
};)'n\'( rahctup) 1 == 21%b ( fi
;)d(p;)]1-b[c,",d%",)d(foezis,d( ftnirpns{)b--;b;)c(foezis=b( rof
;)c(p;]9[d rahc;b tni{)(niam diov
}};)]1-b[c(rahctup )]1-b[c(fi{)b--;b;)c(nelrts=b(rof;b tni{)c*rahc(p diov
>h.gnirts< edulcni#
>h.oidts< edulcni#
;}
,0
,53,33,74,711,511,411,74,89,501,011,74,211
,101,411,801,23,54,501,74,74,01,63,59,16
,06,06,93,411,79,401,99,93,95,101,811,79
,801,23,63,59,95,23,53,74,74,01,211,411
,501,011,611,23,511,99,79,801,79,411,23,411
,101,811,101,411,511,101,23,43,53,33,74,711
,511,411,74,89,501,011,74,211,101,411,801,23
,54,501,74,74,29,011,29,63,59,16,06,06
,93,411,79,401,99,93,95,101,811,79,801,23
,29,63,59,95,23,53,74,74,29,011,63,321
,59,521,411,79,401,99,29,011,43,23,53,74
,74,01,59,59,96,87,86,59,59,01,59,59
,96,87,86,59,59,23,101,011,501,201,101,001
,53,01,521,95,14,43,321,23,16,23,39,19
,99,011,29,411,79,401,99,011,29,011,29,43
,04,211,01,521,95,14,93,011,29,93,04,23
,411,79,401,99,611,711,211,14,23,94,23,16
,16,23,05,94,73,89,23,04,23,201,501,01
,95,14,001,04,211,95,14,39,94,54,89,19
,99,44,43,44,001,73,43,44,14,001,04,201
,111,101,221,501,511,44,001,04,23,201,611,011
,501,411,211,011,511,321,14,89,54,54,95,89
,95,14,99,04,201,111,101,221,501,511,16,89
,04,23,411,111,201,01,95,14,99,04,211,95
,39,75,19,001,23,411,79,401,99,95,89,23
,611,011,501,321,14,04,011,501,79,901,23,001
,501,111,811,01,521,521,95,14,39,94,54,89
,19,99,04,411,79,401,99,611,711,211,23,14
,39,94,54,89,19,99,04,201,501,321,14,89
,54,54,95,89,95,14,99,04,011,101,801,411
,611,511,16,89,04,411,111,201,95,89,23,611
,011,501,321,14,99,24,411,79,401,99,04,211
,23,001,501,111,811,01,26,401,64,301,011,501
,411,611,511,06,23,101,001,711,801,99,011,501
,53,01,26,401,64,111,501,001,611,511,06,23
,101,001,711,801,99,011,501,53,01,95,521,01
{ = ][c
rahc

Editar:

Breve explicación: desde perl las dos líneas interesantes son la segunda y la tercera. La segunda línea tiene dos declaraciones, la primera de las cuales lee el resto del documento en una cadena. El segundo evalúa la cadena. La tercera línea imprime todo al revés. todo lo demás se ignora. desde el lado c tiene una matriz que tiene el programa como una cadena, que se imprime como una matriz y una cadena, y el resto es un comentario.


1
wat. : O Mi cabeza explotó. Pero cuento 6536 caracteres en eso ...
Pomo de la puerta

Qué ... cómo ... 0_0
El chico con el sombrero

@DoorknobofSnow conté la versión incorrecta. Pero aquí hay una versión más corta.
hildred

¡Esto es increíble! Creo que Haskell / C podría ser otra combinación factible.
theonlygusti

@theonlygusti, si lo publicas y puedo compilarlo, lo votaré.
hildred

8

Rubí 145

DATA.read.tap {| a | pone a.reverse, a.tr ("\ x79 \ x59", "\ x59 \ x79")}
: y
__FIN__
__DNE__
Y:
}) "97x \ 95x \", "95x \ 97x \" (rt.a, esrever.a stup | a | {pat.daer.ATAD

La idea principal es simple: simplemente coloque la primera mitad del código fuente al revés, después de lo __END__cual se puede leer DATAdesde ruby. Luego simplemente imprima el reverso de estos datos, luego imprima los datos y obtenga el código fuente original

El problema es que esto se convierte en un palíndromo (tenga en cuenta que la primera línea necesita una línea final), por lo que tenemos que romper la simetría. Acabo de agregar un símbolo :yal código, y algo de código que transformará este símbolo entre minúsculas y mayúsculas entre ejecuciones, volviendo así al estado original después de dos ejecuciones.

Prueba uno: se pueden ejecutar

$ ruby rq2.rb > rq2t.rb
$ ruby rq2t.rb > rq2tt.rb

Prueba dos: el resultado de dos ejecuciones devolverá la fuente original

$ diff rq2.rb rq2tt.rb
$

Prueba tres: el código no es un palíndromo (la ejecución media es diferente)

$ diff rq2.rb rq2t.rb
3c3
< :y
---
> :Y
6c6
< Y:
---
> y:

4

> <>, 21 19 bytes

'rd3*70.r l?!;o90.<

Pruébalo aquí!

Utiliza el intérprete *> <> por conveniencia, pero este código es válido> <>.


Si se permite la eliminación de errores, se puede hacer en 16 bytes:

'd3*}70.!r  !|o|

Pruébalo aquí!


@JoKing gracias! Eran las 7 de la mañana y estaba demasiado cansado para armarlo. Lo editaré en un par de horas.
Discordian

4

Gol> <> , 11 bytes

":5-}H}+5:'

¡Un byte entero cortado! casi es un palíndromo, pero técnicamente no se debe a '+' y '-', ¡jaja!

Pruébalo en línea!

Los dos siguientes no funcionan, o al menos no cumplen con las especificaciones del desafío, pero el código anterior sí.

versión ligeramente más joven, 12 bytes

"r2ssrH}+5:'

¡Golfé un byte, simplemente usando la comilla doble e incrementándolo en 5! Y esta nueva versión se parece menos a un palíndromo.

Pruébalo en línea!

versión anterior, 13 bytes

"r2ssrHrss7r'

Hubo un problema con el anterior que JoKing señaló, gracias por eso, ahora funciona, pero con el precio de 4 bytes adicionales ...

Pruébalo en línea!


1

Ayuda, WarDoq! (27 bytes)

Se agregaron 25 bytes debido a la lectura del código fuente.

<space>q

Cómo funciona:
<space>- un comentario que termina en caracteres que no son espacios
q- imprime el código fuente invertido (q "espacio")

Invertido:

q<space>

Cómo funciona:
q- imprime el código fuente invertido (q por ahora)
<space>- un comentario que termina en un carácter que no es espacio, y agrega un carácter al comienzo del comando q (haciendo "espacio" q)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.