Écrivons le code le plus court pour effectuer une variante simplifiée de la méthode de nettoyage DoD 5220.22-M avec seulement deux passes d'écriture.
Tout langage de programmation est accepté, mais l'utilisation de bibliothèques orientées sur l'effacement des disques est interdite.
Voici comment nous allons l'implémenter en pseudocode:
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 d'autres termes, ce code s'exécutera deux fois, avec une passe d'écriture et une passe de vérification pour 0
, et une passe d'écriture et une passe de vérification pour 1
.
Quelqu'un est-il assez balleux pour l'implémenter comme un golf de code? ;)
Réponses:
code machine x86 (Linux), 116 octets
Prend le nom de fichier comme argument
Assemblage (NASM):
Essayez-le en ligne! (Utilise un fichier temporaire)
-11 octets en optimisant les registres en mouvement et en utilisant la pile comme tampon au lieu d'un emplacement constant en mémoire.
la source
Sur un système Linux, aucune manipulation particulière des périphériques n'est nécessaire. Utilisez simplement l'interface de fichier de l'appareil.
Python 3 (chaînes d'octets) - 141 octets
C'est assez simple, et pas vraiment optimisé lourdement, mais ça marche. Voici un aperçu de base.
boucle de sortie lorsque l'incrément est suffisamment élevé
En prime, vous pouvez le modifier pour n'importe quel ensemble et nombre de modèles de modification d'octets, comme 0x55 / 0xaa pour des effets d'écrasement plus forts.
J'ai effectivement testé cela sur un fichier de périphérique, en utilisant le bouclage. Cependant, je ne suis pas sûr à 100% que la vérification fonctionne réellement. Il peut être nécessaire de fermer et de rouvrir le fichier à chaque passage, en raison de comportements de mise en mémoire tampon. J'espère que la chasse d'eau empêchera cela.
* modifié pour incorporer quelques suggestions dans les commentaires
la source
=
python. Vous pouvez également réduire votre nombre d'octets en utilisant;
pour réduire l'indentation.f.seek(0);f.seek(0)
(19 octets) peut êtres=f.seek;s(0);s(0)
(18 octets). En outre,if f.read()==x:i+=1
peut êtrei+=f.read()==x
.b'\0'
qu'au lieu deb'\x00'
devrait fonctionner.C (clang) ,
-DZ=lseek(d,0
+ 139 = 152 octetsEssayez-le en ligne!
Prend le nom de fichier comme argument
Non golfé:
la source
Tcl, 286 octets
Pas vraiment optimisé aussi bien. J'ai essayé ce que j'ai pu, mais je ne sais pas grand-chose sur Tcl.
Enregistrez sous "f.tcl" et exécutez sous Unix avec
tclsh f.tcl "your filename"
. Assurez-vous qu'il y a exactement un argument! J'ai testé cela sur un fichier ordinaire, mais cela devrait également fonctionner sur un fichier de périphérique.La définition de variables et l'indexation sont plus impliquées dans Tcl, j'ai donc décidé de mettre le code commun entre les passes dans une fonction. Ensuite, je l'appelle d'abord avec "\ 0", et répète pendant qu'il ne parvient pas à vérifier. Je fais la même chose avec "\ xff".
J'ai rougi après les écritures; cela pourrait ne pas être nécessaire.
fconfigure -translation binary -buffering none
est plus long.-2 octets en supprimant les guillemets
r+
.la source