A tarefa é escrever um irradiador endurecido por radiação. O que quero dizer com isso exatamente?
Um irradiador é um programa que, quando recebe uma string como entrada, gera todas as versões possíveis da string com um caractere removido. Por exemplo, dada a entrada Hello, world!
, o programa deve gerar:
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
Um irradiador, no entanto, deve ser protegido de sua radiação, de modo que o irradiador que você escreve também deve sobreviver quando for passado por si mesmo. Ou seja, quando qualquer byte único do seu programa é removido, o programa ainda deve funcionar corretamente.
Casos de teste
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;
Especificações
- Você pode receber informações de qualquer método aceitável de acordo com nossas regras de E / S padrão
- A saída pode ser uma lista de cadeias ou uma lista impressa delimitada por um caractere ou grupo de caracteres. Um delimitador à direita é aceitável
- A saída pode estar em qualquer ordem, desde que contenha todas as versões possíveis
- Entradas duplicadas (como as duas
Helo, world!
s no primeiro exemplo) podem ser filtradas, mas isso não é necessário - Como se trata de código-golfe , o menor programa, em bytes, ganha
code-golf
radiation-hardening
TheOnlyMrCat
fonte
fonte
v
invoid
removido não será compiladoRespostas:
05AB1E ,
2926 bytesExperimente online! ou tente todas as versões irradiadas .
O irradiador mais curto que encontrei é de 5 bytes:
A idéia é repetir isso três vezes e, em seguida, votar por maioria:
Å
é um prefixo para comandos de 2 bytes, mas não háÅ`
comando, e é por isso que elesÅ
são ignorados. No entanto, precisaremos mais tarde.A classificação garante que a maioria dos votos esteja no meio da matriz. Despejar e trocar trocam esse valor para o topo da pilha.
Qualquer irradiação na parte inicial resulta apenas em um erro na matriz global, que é resolvida pelo voto da maioria. As irradiações no
{Å`s
bit final são muito mais difíceis de raciocinar sobre:Å
é ignorado de qualquer maneira, então não há problema em irradiá-loSe o backtick for irradiado,
Å`s
torna-seÅs
, que é o comando estendido "get middle of the array".Se
{
ous
for irradiado, isso significa que nada mais é, portanto a matriz global terá o mesmo valor três vezes. Nesse caso, não precisamos de triagem / troca, qualquer valor funcionará.fonte
Código de máquina 8086 (MS-DOS .COM), 83 bytes
Executável no DOSBox ou no seu mecanismo de computação a vapor favorito. A cadeia a irradiar é fornecida como um argumento de linha de comando.
Binário:
Legível:
Atropelar
A parte ativa é duplicada para que sempre haja uma intocada pela radiação. Selecionamos a versão saudável por meio de saltos. Cada salto é um salto curto e, portanto, tem apenas dois bytes, onde o segundo byte é o deslocamento (ou seja, a distância do salto, com sinal determinando a direção).
Podemos dividir o código em quatro partes que podem ser irradiadas: salto 1, código 1, salto 2 e código 2. A idéia é garantir que uma parte limpa do código seja sempre usada. Se uma das partes do código for irradiada, a outra deverá ser escolhida, mas se um dos saltos for irradiado, ambas as partes do código estarão limpas, portanto, não importa qual delas for escolhida.
A razão para ter duas partes de salto é detectar a irradiação na primeira parte, saltando sobre ela. Se a primeira parte do código for irradiada, significa que chegaremos a um byte da marca. Se garantirmos que uma aterrissagem com falhas selecione o código 2 e uma aterragem adequada selecione o código 1, seremos dourados.
Nos dois saltos, duplicamos o byte de deslocamento, tornando cada salto com 3 bytes de comprimento. Isso garante que a irradiação em um dos dois últimos bytes ainda torne o salto válido. A irradiação no primeiro byte impedirá que o salto aconteça, uma vez que os dois últimos bytes formarão uma instrução completamente diferente.
Dê o primeiro salto:
Se um dos
0x28
bytes for removido, ele ainda pulará para o mesmo local. Se o0xEB
byte for removido, acabaremos comque é uma instrução benigna no MS-DOS (outros tipos podem discordar) e, então, passamos ao código 1, que deve estar limpo, pois o dano ocorreu no salto 1.
Se o salto for dado, pousamos no segundo salto:
Se essa sequência de bytes estiver intacta e aterrissarmos bem na marca, isso significa que o código 1 estava limpo e essa instrução retornará a essa parte. O byte de deslocamento duplicado garante isso, mesmo se um desses bytes de deslocamento estiver danificado. Se pousarmos um byte (por causa de um código danificado 1 ou pular 1) ou se o
0xEB
byte estiver danificado, os dois bytes restantes também serão benignos:Seja qual for o caso, se acabarmos executando essas duas instruções, sabemos que o salto 1, o código 1 ou o salto 2 foram irradiados, o que torna seguro o detalhamento do código 2.
Teste
O programa a seguir foi usado para criar automaticamente todas as versões do arquivo .COM. Ele também cria um arquivo BAT que pode ser executado no ambiente de destino, que executa cada binário irradiado e canaliza suas saídas para separar arquivos de texto. Comparar os arquivos de saída para validar é fácil, mas o DOSBox não possui
fc
, portanto não foi adicionado ao arquivo BAT.fonte