Levenquina Cíclica

45

Antecedentes

Como la mayoría de los clientes habituales de PPCG sabrán, un es un programa que genera su propio código fuente cuando se ejecuta; y la distancia de Levenshtein entre dos cadenas es el número mínimo de inserciones, eliminaciones y ediciones necesarias para cambiar una cadena a la otra. En este desafío, estamos combinando los dos conceptos en una "levenquina": un programa que genera su propio código fuente, pero con una instancia de un carácter insertado, eliminado o reemplazado con un carácter diferente. (En otras palabras, la distancia de Levenshtein entre el programa y su salida es 1.)

La tarea

Escriba una levenquina de modo que su salida sea una levenquina, la salida de ese programa también sea una levenquina, y así sucesivamente. Además, en algún momento, la secuencia de ejecutar repetidamente el programa, ejecutar su salida, ejecutar la salida de su salida, etc., finalmente debe volver al programa original.

Hay una restricción adicional que hace las cosas mucho más difíciles: debe haber dos programas distintos en algún lugar dentro de este ciclo que no tengan caracteres en común (en otras palabras, no hay ningún carácter que exista dentro de un programa y que también exista dentro del otro programa). Por lo tanto, su programa tendrá que transformarse gradualmente en un conjunto de caracteres diferente y volver a funcionar.

Si está utilizando un lenguaje de programación que tiene una plantilla inevitable que se requiere en cualquier programa que produzca salida (por ejemplo, solo tiene una forma de escribir una printdeclaración y ninguna otra forma útil de salida), puede tratar esa placa repetitiva como inexistente para el propósito de determinar qué caracteres tienen en común dos programas. Sin embargo, aún debe contar esa plantilla con el fin de determinar la propiedad Levenquine del código.

Aclaraciones

  • Cada uno de los "programas" en el ciclo puede ser un programa completo o una función. No todos tienen que ser iguales, por ejemplo, algunos podrían ser programas completos y otros podrían ser funciones.
  • No todos los programas en el ciclo necesitan usar la misma forma de salida. Por ejemplo, algunos podrían salir a través de una salida estándar, y otros podrían salir a través de un error estándar.
  • Sus programas se ejecutarán sin entrada (o en idiomas que requieren entrada para hacer cualquier cosa, la entrada más simple posible).
  • Se aplican reglas de quine adecuadas ; aunque una Levenquine no es una quine verdadera, no puede hacer nada que sea ilegal al escribir una quine adecuada. En particular, el programa nulo nunca es una salida válida de un Levenquine adecuado (y, por lo tanto, no puede ser parte de su ciclo).
  • La restricción de Levenquine se mide en términos de caracteres, en lugar de bytes (por ejemplo, êes un carácter incluso cuando la fuente está codificada en UTF-8). La restricción sin caracteres en común también se mide en términos de caracteres. La condición de victoria, sin embargo, cuenta en bytes.

Condición de victoria

Envíe al menos los siguientes tres programas del ciclo: el programa más corto (medido en bytes); y dos programas del ciclo que no tienen caracteres en común. Es posible que dos de estos sean iguales, y también es posible que los tres sean distintos. El puntaje se basa en la longitud en bytes del programa más corto, siendo más corto mejor, lo que hace de este un tipo de competencia de .


fuente
Para las personas que pueden ver publicaciones eliminadas: la publicación de Sandbox estaba aquí .
Creo que también sería bueno para las respuestas incluir la duración del ciclo.
mbomb007
¿Qué sucede si, por ejemplo, el lenguaje tiene varias funciones para realizar la salida, pero todas comparten caracteres por pares?
Ørjan Johansen
2
@ ØrjanJohansen: Supongo que no me opondría demasiado a solo elegir uno de ellos y mantenerlo en ese caso. Sin embargo, podría decirse que no es competitivo; Quería que la regla fuera objetiva, porque de lo contrario las personas tienden a tratar de hacer agujeros en ella, y si intentas hacer que la regla sea demasiado compleja, tienden a haber argumentos sobre lo que significa.
¿Puede ser un levenquine sabio? Como en la distancia desde el código fuente original es 1 byte apagado?
Urna mágica del pulpo

Respuestas:

34

Gol> <> , 252 167 bytes

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_

Pruébalo en línea!

Y el programa mutuamente distinto ( Verificación ):

0<CŽB‚‚UGGŽ™™ŽB‚F~GGM–JŽ™ŽRY–[d––ŠŽRŽdŽ™ŽVGRGY–UFQFGM–<J<™B–GQFBd™Ž~F~G‡GGŽd;oRl-7-7so~|;oRl@@-Ms7QKMM3-3-3~R-4sRaaK-3sRaa|;oRl@@sR43M|;oRlQ-sR43@Q{RMlMss3{~{"

Pruébalo en línea!

Esto está inspirado principalmente en mi respuesta al desafío Quines mutuamente exclusivo , con felicitaciones que también van a la respuesta Gol> <> de Bubbler .

Aquí hay un programa de verificación que puede ejecutar. Desafortunadamente, se agota el tiempo de espera, pero puede ver cómo una sección del código construye la otra sección y luego puede copiar la última versión impresa y pegarla en la entrada para continuar. Eventualmente, llegarás al primer programa que incluyas.

Explicación

Ambas secciones de código se componen de dos secciones, la parte de ejecución real y los datos que contienen la otra sección de código. Ambos funcionan prácticamente de manera idéntica:

Dependen de una bandera (el primer carácter del código, ya sea 1o 0). Si se establece la bandera, comenzarán a construir la otra sección del código quitando el carácter 252, agregando / restando 28de él y agregándolo al código.

Por ejemplo, aquí están las dos primeras iteraciones del código después del primer programa anterior:

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_C

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_CŽ

Finalmente, cuando llega al final de la sección actual, voltea el segundo carácter del código ( <hacia >atrás y de nuevo) para apuntar a la otra sección.

Aquí están ambas secciones juntas, a punto de pasar de ejecutar la primera sección a ejecutar la segunda.

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_CŽB‚‚UGGŽ™™ŽB‚F~GGM–JŽ™ŽRY–[d––ŠŽRŽdŽ™ŽVGRGY–UFQFGM–<J<™B–GQFBd™Ž~F~G‡GGŽd;oRl-7-7so~|;oRl@@-Ms7QKMM3-3-3~R-4sRaaK-3sRaa|;oRl@@sR43M|;oRlQ-sR43@Q{RMlMss3{~{"

Pruébalo en línea!

Las banderas son lo opuesto para cada sección, por lo que la nueva sección en ejecución comenzará a eliminar la otra sección de código hasta que alcance su propio código. En este punto, voltea la bandera y el ciclo se repite nuevamente.

Jo King
fuente