Codegolf: Quine y Antiquine

13

Este desafío es similar a Can you Meta Quine?

Un quine es un programa que se produce en STDOUT. Este desafío es producir un programa A que cuando se ejecuta produce un programa B en STDOUT. El programa B cuando se ejecuta produce el programa A en STDOUT. Los programas A y B deben estar escritos (y ejecutarse) en el mismo idioma. La pregunta vinculada restringió A! = B. Eso parecía demasiado fácil. Entonces, para esta pregunta, insistimos en que A y B son antigüedades, usando las siguientes reglas:

  1. Los programas A y B no pueden usar ninguno de los mismos caracteres, salvo los espacios en blanco y los separadores de enunciados, y los caracteres de puntuación.
  2. Los programas A y B deben contener cada uno al menos un carácter que no sea un espacio en blanco ni un separador de enunciados, ni un carácter de puntuación.
  3. A los efectos de las reglas 1 y 2, el término 'espacio en blanco' excluye cualquier símbolo o secuencia de símbolos que en sí mismo sea una declaración, operador o símbolo que se interprete (en lugar de un separador). Por lo tanto, en el lenguaje de espacios en blanco, no hay espacios en blanco.
  4. Un separador de enunciados es un elemento sintáctico usado convencionalmente dentro del lenguaje para separar enunciados. Esto incluiría la nueva línea en python, o el punto y coma en Java, perl o C.
  5. Un carácter de puntuación es un carácter ASCII que no es un espacio en blanco ni en la clase de caracteres de la palabra POSIX (es decir, un guión bajo no es una puntuación para este propósito), es decir ispunct(), devolvería verdadero, y no lo es _.
  6. El programa A cuando se ejecuta debe producir un programa (Programa B) en su STDOUT, que cuando se ejecuta a su vez produce el Programa A.
  7. Los programas A y B deben estar en el mismo lenguaje de programación.
  8. El lenguaje de programación utilizado debe ser realmente un lenguaje de programación. A menos que haga un buen caso de lo contrario, sugeriré que debe ser Turing completo.
  9. Al menos uno de A y B debe ejecutar al menos una declaración dentro del lenguaje.

Este es el código de golf, por lo que gana la respuesta más corta, siendo la puntuación la longitud del programa A en bytes (es decir, la longitud del programa B no es relevante).

abligh
fuente
¿Puede agregar "puntuación" a la lista de excepciones en la primera cláusula? De lo contrario, es imposible resolver esta tarea en muchos idiomas (especialmente aquellos que requieren llaves en la función principal).
FUZxxl
relacionado pero probablemente lo suficientemente diferente.
Martin Ender
@FUZxxl Permití signos de puntuación pero excluí los guiones bajos.
Abligh
1
A los efectos aquí, ¿son Ay se aconsideran diferentes "personajes"?
HostileFork dice que no confíes en SE
1
Sería mejor si proporcionara una lista completa de caracteres ASCII que coincidan con la regla 5.
Aditsu se retiró porque SE es MAL

Respuestas:

5

GolfScript, 13 bytes

1{\~\".~"}.~

La salida es

-2{\~\".~"}.~

que genera el programa inicial.

El recuento de bytes incluye el LF final, ya que la salida de la salida lo contendrá.

Pruébalo en línea.

Cómo funciona

1       # Push 1.
{       # Start code block.
  \~\   # Apply logical NOT to the second topmost element of the stack.
  ".~"  # Push that string.
}       # End code block.
.~      # Duplicate the code block and execute the copy.

GolfScript imprime el contenido de la pila al finalizar.

Dennis
fuente
Lea nuevamente la declaración del problema.Programs A and B may not use any of the same characters, save for whitespace and statement separators, and punctuation characters.
isaacg
1
Todo menos 1y 2es puntuación.
Dennis
OK, las reglas han cambiado desde la última vez que las leí.
isaacg
Sí, eso funciona. Había formulado las reglas para evitar que se utilizaran espacios en blanco como declaraciones, pero olvidé que la misma laguna estaría presente para la puntuación. Así que la laguna legalmente explotada.
Abligh
14

Pascal (731 caracteres)

Programa A

program s;{$h+}uses sysutils;const p='program s;{$h+}uses sysutils;const p=';a='a';aa=''';';aaa='a=''';aaaa='''';aaaaa='begin write(lowercase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),''lower''+''c'',''tm''+''p'',[]),''up''+''c'',''lower''+''c'',[]),''tm''+''p'',''up''+''c'',[])+aa+aaaaa))end.';begin write(upcase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),'lower'+'c','tm'+'p',[]),'up'+'c','lower'+'c',[]),'tm'+'p','up'+'c',[])+aa+aaaaa))end.

Salidas del programa B:

PROGRAM S;{$H+}USES SYSUTILS;CONST P='PROGRAM S;{$H+}USES SYSUTILS;CONST P=';A='A';AA=''';';AAA='A=''';AAAA='''';AAAAA='BEGIN WRITE(UPCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),''LOWER''+''C'',''TM''+''P'',[]),''UP''+''C'',''LOWER''+''C'',[]),''TM''+''P'',''UP''+''C'',[])+AA+AAAAA))END.';BEGIN WRITE(LOWERCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),'LOWER'+'C','TM'+'P',[]),'UP'+'C','LOWER'+'C',[]),'TM'+'P','UP'+'C',[])+AA+AAAAA))END.

Salidas del programa A.

Mika lammi
fuente
3
Estoy disfrutando el uso (incorrecto) de la traducción de casos.
Abligh
11

ROT13 (ya no compite después de la actualización de la regla )

No estoy seguro de si esto cuenta como un idioma, pero ciertamente no lo compensé para el desafío. Por lo general, las respuestas para ciertas utilidades como sedlas aceptadas también. Sin embargo, es una decisión judicial, así que si no cuenta, lo eliminaré (¿hay alguna discusión en algún lugar sobre lo que cuenta como idioma? Editar: Ahora hay )

A

Ciclos entre Ay N:

~>> echo "A" | rot13
N
~>> echo "A" | rot13 | rot13
A
Ingo Bürk
fuente
Creo que esto no funciona, ya que rot13 simplemente está ingresando STDIN, no ejecutando un programa. Si está argumentando que es un programa de longitud cero, no cumple con la regla 2. El programa (con sed) es lo que se pasa sed -e. Si esto fuera aceptable, entonces catsería una quine, y tacsería una quine y una antquina. Sin embargo, nada está produciendo la fuente cat, taco para el caso rot13.
Abligh
@abligh Si rot13 es el lenguaje utilizado, ¿por qué debería imprimir el código fuente de rot13? Además, si ejecuto Golfscript, Python o cualquier otra cosa, es probable que simplemente le pase el código fuente a través de stdin o archivo, por lo que no hay realmente ninguna diferencia. En este caso, rot13 es el intérprete.
Ingo Bürk
rot13como lenguaje de programación no parece satisfacer ninguna definición razonable de 'lenguaje de programación', y no está interpretando nada. Enmendaré la pregunta para que quede más claro.
Abligh
Bien por mi. Dejaré esta respuesta como ya no compite y comenzaré una meta discusión. Buen desafío, por cierto. ¡No puedo esperar para ver soluciones "reales"!
Ingo Bürk