Vamos escrever o código mais curto para executar uma variante simplificada do método de limpeza DoD 5220.22-M com apenas dois passes de gravação.
Qualquer linguagem de programação aceita, mas o uso de bibliotecas orientadas à limpeza de disco é proibido.
Aqui está como devemos implementá-lo no pseudocódigo:
Set x to 0
[Start]
'Write Pass
For each sector in disk write the content of x
'Verification Pass
For each sector in disk {
If sector does not contain the content of x then goto [Start]
}
'Check whether we already did the pass with 1
If x is not 1 then {
Set x to 1
GoTo [Start]
}
Else end
Em outras palavras, esse código será executado duas vezes, com um passe de gravação e um passe de verificação 0
e um passe de gravação e passe de verificação para 1
.
Alguém ousado o suficiente para implementá-lo no estilo de código-golfe? ;)
Respostas:
código de máquina x86 (Linux), 116 bytes
Leva o nome do arquivo como argumento
Montagem (NASM):
Experimente online! (Usa um arquivo temporário)
-11 bytes, otimizando os registros móveis e usando a pilha como um buffer em vez de um local constante na memória.
fonte
Em um sistema Linux, não há necessidade de manipulação especial de dispositivos. Basta usar a interface do arquivo do dispositivo.
Python 3 (cadeias de bytes) - 141 bytes
É bastante direto, e não é muito otimizado, mas funciona. Aqui está um resumo básico.
loop de saída quando o incremento é alto o suficiente
Como bônus, você pode modificar isso para qualquer conjunto e número de padrões de modificação de bytes, como 0x55 / 0xaa, para efeitos de substituição mais fortes.
Na verdade, testei isso em um arquivo de dispositivo, usando loopback. No entanto, não tenho 100% de certeza de que a verificação realmente funcione. Pode ser necessário fechar e reabrir o arquivo a cada passagem, devido a comportamentos de buffer. Eu espero que o flush evite isso.
* editado para incorporar algumas sugestões nos comentários
fonte
=
python. Você também pode reduzir sua contagem de bytes usando;
para reduzir o recuo.f.seek(0);f.seek(0)
pode usar o apelido de algumas de suas funções, por exemplo, (19 bytes) pode sers=f.seek;s(0);s(0)
(18 bytes). Além disso,if f.read()==x:i+=1
pode seri+=f.read()==x
.b'\0'
vez deb'\x00'
deve funcionar.C (clang) ,
-DZ=lseek(d,0
+ 139 = 152 bytesExperimente online!
Leva o nome do arquivo como argumento
Ungolfed:
fonte
Tcl, 286 bytes
Não está realmente otimizado tão bem. Eu tentei o que pude, mas não sei muito sobre Tcl.
Salve como "f.tcl" e execute o Unix com
tclsh f.tcl "your filename"
. Verifique se há exatamente um argumento! Eu testei isso em um arquivo simples, mas também deve funcionar em um arquivo de dispositivo.Definir variáveis e indexação está mais envolvido no Tcl, então decidi colocar o código comum entre as passagens em uma função. Então eu chamo primeiro com "\ 0" e repito enquanto ele não verifica. Eu faço a mesma coisa com "\ xff".
Eu liberado depois de escrever; pode não ser necessário.
fconfigure -translation binary -buffering none
É mais longo.-2 bytes removendo aspas
r+
.fonte