Cadena Quine Bidireccional

9

PPCG no ha tenido suficientes quines ya ...

Desafío:

Su tarea es crear un programa "A0". Cuando este programa se ejecuta sin entrada, no genera nada. Cuando este programa se ejecuta con entrada, genera "A1". Cuando "A1" se ejecuta sin entrada, emite "A0". Cuando "A1" se ejecuta con entrada, emite "A2". Más o menos, "A (k)" generará "A (k-1)" cuando se ejecute sin entrada, y generará "A (k + 1)" cuando se ejecute con entrada.

Detalles

Creo que este desafío es bastante simple; No hay otras reglas realmente. Cada programa debe contener al menos 1 byte, por cierto. Puede suponer que la entrada consistirá solo en caracteres ASCII, y puede ignorar los espacios en blanco si lo desea, pero no puede especificar una entrada específica. La salida puede ser STDOUT o STDERR, pero todos sus programas deben salir al mismo. El otro también puede contener texto (por lo que puede enviarlo a STDOUT y luego salir con un error). Gracias a @Dennis por señalar eso.

Todos los programas deben estar en el mismo idioma, y ​​cada programa debe ser único del resto de ellos.

La puntuación es igual a la duración del programa "A0". Como se trata de un desafío de código de golf, ¡gana el puntaje más bajo!

Hiperneutrino
fuente
Me entristece predecir que la mayoría de las presentaciones tendrán A (k) y A (k + 1) diferentes por la adición de un solo carácter a una cadena en crecimiento :(
Sparr
@Sparr Desafortunadamente, eso probablemente será lo que suceda. :( Oh, bueno, no puedo entender cómo hacer una regla clara en contra de eso.
HyperNeutrino
solo puede enviar a uno de los dos que no estoy seguro si estoy interpretando esto correctamente. Si imprimimos el resultado deseado en STDOUT, ¿STDERR tiene que estar vacío? Porque está permitido salir con un error.
Dennis
¿Todos los programas deben ser diferentes? La pregunta no dice eso.
44
Además, ¿puedo sugerir un título algo más expresivo como "Cadena bidireccional de quine"? "supermeta quine" no dice mucho más allá de los programas que imprimen otros programas y hará que sea más difícil buscar este desafío en el futuro.
Martin Ender

Respuestas:

1

Pip , 28 bytes

V Y"I#qSti0+i?`V Y`.RPyRtiu"

Pruébalo en línea!

Explicación

Esta es una versión modificada de la quip Pip más corta conocida V Y"`V Y`.RPy". Ese quine funciona definiendo una cadena, jalándola en la yvariable y luego evaluándola. Cuando se evalúa, la cadena toma la repr de y(envolviendo así el valor de yentre comillas dobles) y concatena el patrón literal `V Y`al frente.

Nuestra estrategia es poner un 0en el programa, luego reemplazar 0con 10si hubo entrada, o reemplazar 10con 0si no hubo entrada. (Por lo tanto, A ( k ) contendrá un número que consiste en k 1 seguido de un 0) 0y 10es conveniente porque hay variables incorporadas ( iy t, respectivamente) con esos valores, por lo que podemos referirnos a ellos sin usar dígitos reales .

Entonces, en lugar de RPy, queremos saber RP yRitsi hubo entrada y RP yRtisi no. Podemos combinar los dos casos intercambiando los valores de ty isi hay input ( I#q Sti), luego haciendo RP yRti. (Tenemos que probar #qla longitud de la entrada, porque las entradas como 0son falsey).

Ahora solo tenemos que obtener un literal 0en el código y manejar el caso especial de que A0 no produzca salida. Ambos se pueden resolver probando 0+iy devolviendo usi es falsey:

  • Para cualquier k > 0, el número en A ( k ) será distinto de cero y, por lo tanto, verdadero (p 110+i. Ej .).
  • Para k = 0, el número en A ( k ) será cero:
    • Si hay entrada, iy tse intercambian y ies 10. 0+itodavía es cierto.
    • Si no hay entrada, isigue siendo 0 y 0+ies falsey. En lugar del núcleo de quine, generamos uuna variable incorporada para nil. La impresión nula no produce resultados.
DLosc
fuente
¡Buen trabajo! Funciona de maravilla.
HyperNeutrino
1

Python 2, 93 bytes

Hay un salto de línea final.

p=1+2*bool(input())-1;s='print"p=%r+2*bool(input())-1;s=%r*(p>0);exec s"%(p,s)'*(p>0);exec s

Pruébalo con entrada | Pruébalo sin entrada

Esto se modifica a partir de mi respuesta en una pregunta similar.

Si hay entrada, entonces se incrementará p. Así que el programa resultante será p=2+..., p=3+..., etc.

mbomb007
fuente
Esto no reconoce 0 como entrada
fəˈnɛtɪk
@LliwTelracs La entrada debe estar entre comillas (debe ser una picadura). Ver los hipervínculos en la respuesta.
mbomb007
Tal como está, su programa funciona con cadenas y todos los números que no sean 0.
fəˈnɛtɪk
1
@LliwTelracs Bueno, entonces no intentes usar números. Según el consenso, puedo usar input()y requerir que la entrada esté entre comillas, en lugar de usarla raw_input(). Si desea ingresar cero, use "0".
mbomb007
Buena solución! Esperaba que la mayoría de las respuestas crecieran infinitamente (técnicamente esta sí, pero no en el mismo sentido). ¡Buen trabajo!
HyperNeutrino