7 , 2 bytes
7 usa un juego de caracteres de 3 bits, pero toma la entrada empaquetada en bytes (y según el meta, los idiomas con juegos de caracteres de subbytes se cuentan usando bytes para el archivo en el disco ). Aquí hay un xxdvolcado del programa:
00000000: 4cf4 L.
Al entregar este archivo al intérprete 7, generará el siguiente programa:
00000000: 4fa6 7f O..
que a su vez generará el programa original nuevamente.
Entonces, ¿qué está pasando aquí? No hay lectura de fuente involucrada (en realidad, no creo que sea posible leer la fuente en 7), aunque podría decirse que el programa está engañando de otra manera; Déjame saber lo que piensas. Así es como funciona el programa. (Tenga en cuenta que cada comando 7 tiene dos variantes, algunas de las cuales no tienen nombres y no pueden aparecer en el programa original. Hay doce comandos en total, en seis pares. Estoy usando negrita para comandos activos, no negrita para pasivos comandos, y en los casos en que el comando activo no tiene nombre, lo estoy dando el mismo nombre que el comando pasiva correspondiente y confiando en la negrita de distinguir. en el caso en que los dos son llamados, por ejemplo, 7que es la variante activa de 1, cada comando tiene su propio nombre y la negrita es solo un resaltado de sintaxis).
231 7 23 Programa original, descomprimido en octal
231 empuje 237 en la pila
23 empuje 23 sobre la pila
(implícito) agregue una copia de la parte superior de la pila al programa
2 Duplicar la parte superior de la pila (actualmente 23 )
3 Salida de la parte superior de la pila, emerge el segundo elemento de la pila
En este punto, el intérprete 7 ve que la parte superior de la pila contiene comandos ( 2y 3) que no son representables, por lo que se escapa de la parte superior de la pila, produciendo 723(que es). El primer resultado del comando selecciona el formato de salida; en este caso, es el formato 7, "formatea la salida de la misma manera que el programa". Entonces, los comandos obtienen la salida empaquetada en bytes. Entonces el programa continúa:
231 7 23 23
(implícito) agregue una copia de la parte superior de la pila al programa
2 Duplicar la parte superior de la pila (actualmente 237 )
3 Salida de la parte superior de la pila, desplegar el segundo elemento de la pila
7 Empujar un elemento vacío sobre la pila
En este punto, no hay nada más que elementos de pila vacíos en la pila, por lo que el programa se cierra. Salimos 23antes. Si escapamos 237(y tenemos que hacerlo, porque contiene comandos no representables), obtenemos 7231. Eso obtiene salida directamente, haciendo la salida final del programa 237231(formateado de la misma manera que el programa, es decir, empaquetado en bytes). Eso es 4fa67f. (Se puede notar que el1 tenía sentido en términos de afectar el resultado; la única razón por la que existe es para hacer que los dos programas sean diferentes).
Correr 237231procede casi exactamente de la misma manera; la diferencia es que lo inútil se 1ejecuta justo después de la primera impresión (y el elemento vacío se elimina implícitamente la segunda vez que se alcanza el final actual del programa). Nuevamente, el resultado 231final se genera a sí mismo, el resultado 23final se genera a sí mismo precedido por un 7, y obtenemos231723 el programa original.
El observador podría notar que los dos programas, a pesar de tener la misma longitud en el octal "nativo" del lenguaje, tienen diferentes longitudes en el disco. Esto se debe a que un programa 7 puede rellenarse con un número arbitrario de 1 bit, y el formato empaquetado descarta el relleno final. Así es como ocurre la codificación:
2 3 1 7 2 3
010011001111010011(1...)
4 c f 4 padding
En otras palabras, dos bytes 4C F4son suficientes para representar el programa, así que eso es todo lo que usé.