Nota: este desafío solo permite respuestas en idiomas compilados
Tarea
Su tarea es bastante simple, haga dos programas diferentes que, cuando se compilan, den como resultado la misma salida.
Tanteo
Aquí es donde entra la diversión. Su puntaje será el número de bytes únicos presentes en exactamente un programa. Por ejemplo, si sus dos programas (codificados en IBM Code page 437 ) son
☻☻Program A
y
☺Program B
Los personajes que están exactamente en un programa son
☻☺AB
Por lo tanto, el puntaje es 4. Tenga en cuenta que ☻
aparece dos veces en el primer programa pero solo se cuenta una vez.
Su objetivo es obtener el puntaje más alto, el puntaje más alto posible es 256.
Aquí hay un programa de puntuación que funciona para programas codificados ASCII.
Estipulaciones
Cada byte en ambos programas debe poder reemplazarse con un byte diferente, lo que hace que el programa se compile en un resultado diferente o que no se compile todo junto. Eliminar cualquier byte debería hacer lo mismo.
Puede usar cualquier indicador de compilación siempre que ambos programas se ejecuten con los mismos indicadores.
La compilación resultante debe ser estática (es decir, no debe variar de una ejecución a otra), si los resultados varían de una máquina a otra, indique la máquina en la que está destinado a ejecutarse.
El resultado de la compilación debe ser byte por byte idéntico, no "equivalente" o "lo suficientemente similar".
El resultado de la compilación no debe estar vacío.
Las advertencias / errores no tienen por qué ser iguales entre compilaciones
Si los programas o la compilación incluyen caracteres no imprimibles, asegúrese de incluir un hexdump. Aunque no es técnicamente necesario.
fuente
abcdefghijqlmnop...
para usar más de 20 caracteres únicos. ¿Esto está permitido?Code-Bowling
pregunta!Respuestas:
Perl, puntaje 254 + 2 = 256
Aquí hay un volcado hexadecimal de un programa:
y aquí está el otro programa:
Perl normalmente no se piensa en un lenguaje compilado, pero lo es; primero se compila en bytecode, y luego se ejecuta el bytecode. Puede aplicar un filtro en el código de bytes (por ejemplo, para volcarlo en lugar de ejecutar el programa) usando la
-MO
opción Ambos programas se compilan en el siguiente bytecode (desmontado usando-MO=Terse
):Explicación
Perl reemplaza todas las declaraciones sin efecto (como los literales de cadena por sí mismas) con una declaración "declaración sin efecto" codificada en el código de bytes resultante, por lo que ambos programas compilan lo mismo. En términos de reemplazos de caracteres, reemplazar la mayoría de los caracteres del programa 1 con apóstrofes hará que no se compile (o reemplace los apóstrofes con
0
). En el programa 2, la sustitución de cualquier carácter conc
hará que el programa no se compile (como\c
toma un argumento).En cuanto a las eliminaciones de caracteres, la primera versión de esta respuesta es anterior a la "regla de endurecimiento de la radiación" (que eliminar cualquier carácter debe cambiar el comportamiento del programa). Esta versión actualizada endurecida por radiación funciona mediante el uso de una suma de comprobación; Si eliminar un carácter no causa un error de sintaxis, el código se compilará en una llamada a la función inexistente
x
. El compilador de Perl no optimiza la llamada en el caso en que se realiza (y, en general, no parece darse cuenta de que la función no existe) y, por lo tanto, la salida es diferente. Sin embargo, la carpeta constante de Perl es capaz de ver que el programa no mutado es una declaración única sin efecto y, por lo tanto, optimiza todo en una sola declaración como antes.Originalmente leí mal la pregunta como contando solo caracteres únicos de un programa, e intenté optimizar para eso. Claramente, el programa 2 debe contener al menos un carácter para generar el código de operación "declaración sin efecto", lo que significa que la mejor puntuación posible en un programa es 255. Todavía no he encontrado una manera de incluir una barra diagonal inversa en el programa 1 de tal manera que el personaje que lo sigue inmediatamente no puede ser reemplazado de manera que el programa se rompa, pero no me sorprendería si fuera posible (lo que lleva a un puntaje de 255 + 1 = 256 )
fuente
C, 231
Programa A
Un montón de no imprimibles arriba. Aquí está el xxd hexdump:
Programa B
Estos compilan exactamente el mismo código objeto. GCC incrusta el nombre del archivo en el código del objeto, por lo que deberá asignar el mismo nombre a los archivos (en diferentes directorios).
Estaba preocupado de que el hecho de que no haya referencias
i
pueda hacer que el compilador optimice esta variable por completo, pero creo que convertirlo en una garantía global de que estará presente en el objeto. Esto puede verificarse mediante la inspección del conjunto generado:Tenga en cuenta que en el programa B, (la mayoría de) los valores de caracteres se dan en octal. También podrían haberse dado en decimal, pero al usar octal, obtenemos un par de caracteres adicionales,
8
y9
en el conjunto de diferencias.Parece que a GCC no le gustan los caracteres CR, LF y (por razones obvias) NUL dentro de comillas simples
''
.Pruébalo en línea y puntúa .
fuente
char
lugar de implícitaint
, en detrimento de la puntuación.Python, puntaje
16262728Personajes únicos
-+;132547698<ACBEDFOXabopsx|
Calcular la puntuación
Programa 1:
En el programa 1, hay 5 espacios en la línea aparentemente en blanco.
Programa 2:
Se encontró ayuda con el código fuente del optimizador de mirillas .
Probado con este script de ayuda: ¡ Pruébelo en línea!
fuente
Python 3.6,
2 3 56Programa 1:
Programa 2:
Python normalmente no se compila, pero sí compila su código fuente en archivos pyc. De manera crucial, dicha compilación incluye un pase de optimización que cambia "1111 + 4168" a 5279. Los guiones bajos tienen dos propósitos: uno es agregar uno al puntaje, y el otro es mantener la longitud, que se almacena en la pyc encabezado igual. Todas las asignaciones de variables que no sean 'x' son para mantener el
co_consts
orden correcto. Alx*x
final sirve para mantenerco_stacksize
lo mismo.fuente
compile
función incorporada, que no agrega el encabezado. solo se aplica al encabezadoos.utime
funciónFASM, 254
no 0x00 y 0x1A porque fasm no admite los dos símbolos
fuente