La tarea es escribir un irradiador endurecido por radiación. ¿Qué quiero decir con eso exactamente?
Un irradiador es un programa que, cuando se le asigna una cadena como entrada, generará todas las versiones posibles de la cadena con un carácter eliminado. Por ejemplo, dada la entrada Hello, world!
, el programa debería generar:
ello, world!
Hllo, world!
Helo, world!
Helo, world!
Hell, world!
Hello world!
Hello,world!
Hello, orld!
Hello, wrld!
Hello, wold!
Hello, word!
Hello, worl!
Hello, world
Sin embargo, un irradiador debe protegerse de su radiación, por lo que el irradiador que usted escriba también debe sobrevivir cuando se transforme. Es decir, cuando se elimina cualquier byte de su programa, el programa aún debe funcionar correctamente.
Casos de prueba
abc -> bc; ac; ab
foo bar -> oo bar:fo bar:fo bar:foobar:foo ar:foo br:foo ba
source -> ource;surce;sorce;souce;soure;sourc;
Especificaciones
- Puede recibir información por cualquier método aceptable según nuestras reglas estándar de E / S
- La salida puede ser una lista de cadenas o una lista impresa delimitada por un carácter o grupo de caracteres. Un delimitador final es aceptable
- La salida puede estar en cualquier orden siempre que contenga todas las versiones posibles
- Las entradas duplicadas (como las dos
Helo, world!
s en el primer ejemplo) pueden filtrarse, pero esto no es necesario - Como se trata de code-golf , el programa más pequeño, en bytes, gana
code-golf
radiation-hardening
TheOnlyMrCat
fuente
fuente
v
invoid
eliminado no compilaráRespuestas:
05AB1E ,
2926 bytesPruébalo en línea! o pruebe todas las versiones irradiadas .
El irradiador más corto que pude encontrar es de 5 bytes:
La idea es repetir eso 3 veces, luego votar por mayoría:
Å
es un prefijo para comandos de 2 bytes, pero no hay ningúnÅ`
comando, por lo queÅ
se ignora. Sin embargo, lo necesitaremos más tarde.La clasificación asegura que el voto mayoritario esté en el medio de la matriz. Volcar y luego intercambiar lleva ese valor a la parte superior de la pila.
Cualquier irradiación en la parte inicial solo da como resultado un error en la matriz global, que se resuelve con el voto de la mayoría. Las irradiaciones en la parte final
{Å`s
son mucho más difíciles de razonar sobre:Å
se ignora de todos modos, así que está bien irradiarloSi se irradia el backtick, se
Å`s
convierte en elÅs
comando extendido "get middle of the array".Si están irradiados
{
os
no, eso significa que nada más lo está, por lo que la matriz global tiene el mismo valor tres veces. En ese caso no necesitamos ordenar / intercambiar, cualquier valor funcionará.fuente
Código de máquina 8086 (MS-DOS .COM), 83 bytes
Ejecutable en DOSBox o su motor informático de vapor favorito. La cadena a irradiar se proporciona como un argumento de línea de comando.
Binario:
Legible:
En mal estado
La parte activa se duplica para que siempre haya una que no haya sido tocada por la radiación. Seleccionamos la versión saludable a modo de saltos. Cada salto es un salto corto, por lo que tiene solo dos bytes de longitud, donde el segundo byte es el desplazamiento (es decir, la distancia al salto, con el signo que determina la dirección).
Podemos dividir el código en cuatro partes que podrían irradiarse: salto 1, código 1, salto 2 y código 2. La idea es asegurarse de que siempre se use una parte limpia del código. Si se irradia una de las partes del código, se debe elegir la otra, pero si se irradia uno de los saltos, ambas partes del código estarán limpias, por lo que no importa cuál se elija.
La razón para tener dos partes de salto es detectar la irradiación en la primera parte saltando sobre ella. Si se irradia la primera parte del código, significa que llegaremos un byte fuera de la marca. Si nos aseguramos de que un aterrizaje fallido seleccione el código 2, y un aterrizaje adecuado seleccione el código 1, somos dorados.
Para ambos saltos, duplicamos el byte de desplazamiento, haciendo que cada parte del salto tenga 3 bytes de longitud. Esto asegura que la irradiación en uno de los dos últimos bytes todavía hará que el salto sea válido. La irradiación en el primer byte detendrá el salto, ya que los dos últimos bytes formarán una instrucción completamente diferente.
Da el primer salto:
Si
0x28
se elimina cualquiera de los bytes, seguirá saltando al mismo lugar. Si0xEB
se elimina el byte, terminaremos conque es una instrucción benigna en MS-DOS (otros sabores pueden estar en desacuerdo), y luego pasamos al código 1, que debe estar limpio, ya que el daño estaba en el salto 1.
Si se da el salto, aterrizamos en el segundo salto:
Si esta secuencia de bytes está intacta, y aterrizamos justo en la marca, eso significa que el código 1 estaba limpio, y esta instrucción salta a esa parte. El byte de desplazamiento duplicado garantiza esto, incluso si uno de estos bytes de desplazamiento está dañado. Si aterrizamos un byte (debido a un código dañado 1 o salto 1) o el
0xEB
byte es el dañado, los dos bytes restantes también serán benignos:Cualquiera que sea el caso, si terminamos ejecutando esas dos instrucciones, sabemos que el salto 1, el código 1 o el salto 2 fueron irradiados, lo que hace que la caída al código 2 sea segura.
Pruebas
El siguiente programa se utilizó para crear automáticamente todas las versiones del archivo .COM. También crea un archivo BAT que se puede ejecutar en el entorno de destino, que ejecuta cada binario irradiado y canaliza sus salidas a archivos de texto separados. Comparar los archivos de salida para validar es bastante fácil, pero DOSBox no lo tiene
fc
, por lo que no se agregó al archivo BAT.fuente