Escribamos el código más corto para realizar una variante simplificada del método de borrado DoD 5220.22-M con solo dos pases de escritura.
Se acepta cualquier lenguaje de programación, pero está prohibido el uso de bibliotecas orientadas a la limpieza de discos.
Así es como debemos implementarlo en 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
En otras palabras, este código se ejecutará dos veces, con un pase de escritura y un pase de verificación para 0
, y un pase de escritura y un pase de verificación para 1
.
¿Alguien lo suficientemente valiente como para implementarlo al estilo de golf de código? ;)
Respuestas:
Código de máquina x86 (Linux), 116 bytes
Toma el nombre de archivo como argumento
Asamblea (NASM):
Pruébalo en línea! (Utiliza un archivo temporal)
-11 bytes optimizando registros móviles y usando la pila como un búfer en lugar de una ubicación constante en la memoria.
fuente
En un sistema Linux no hay necesidad de manejo especial de dispositivos. Simplemente use la interfaz de archivo del dispositivo.
Python 3 (cadenas de bytes) - 141 bytes
Es bastante sencillo y no está muy optimizado, pero funciona. Aquí hay un resumen básico.
salir del bucle cuando el incremento es lo suficientemente alto
Como beneficio adicional, puede modificar esto para cualquier conjunto y número de patrones de modificación de bytes, como 0x55 / 0xaa para efectos de sobrescritura más fuertes.
Realmente probé esto en un archivo de dispositivo, usando loopback. Sin embargo, no estoy 100% seguro de que la verificación realmente funcione. Puede ser necesario cerrar y volver a abrir el archivo cada pasada, debido a los comportamientos de almacenamiento en búfer. Espero que flush evite esto.
* editado para incorporar algunas sugerencias en los comentarios
fuente
=
python. También puede reducir su recuento de bytes al usar;
para reducir la sangría.f.seek(0);f.seek(0)
(19 bytes) puede sers=f.seek;s(0);s(0)
(18 bytes). Además,if f.read()==x:i+=1
puede seri+=f.read()==x
.b'\0'
lugar deb'\x00'
debería funcionar.C (clang) ,
-DZ=lseek(d,0
+ 139 = 152 bytesPruébalo en línea!
Toma el nombre del archivo como argumento
Sin golf:
fuente
Tcl, 286 bytes
Realmente no optimizado tan bien. Intenté lo que pude, pero no sé mucho sobre Tcl.
Guardar como "f.tcl" y ejecutar en Unix con
tclsh f.tcl "your filename"
. ¡Asegúrate de que haya exactamente un argumento! Probé esto en un archivo simple, pero también debería funcionar en un archivo de dispositivo.Establecer variables e indexación está más involucrado en Tcl, así que decidí poner el código común entre los pases en una función. Luego lo llamo primero con "\ 0" y repito mientras no se verifica. Hago lo mismo con "\ xff".
Me sonrojé después de escribir; Puede que no sea necesario.
fconfigure -translation binary -buffering none
es más largo.-2 bytes eliminando comillas alrededor
r+
.fuente