Schreiben wir den kürzesten Code, um eine vereinfachte Variante der DoD 5220.22-M-Löschmethode mit nur zwei Schreibdurchläufen auszuführen .
Jede Programmiersprache wird akzeptiert, aber die Verwendung von Bibliotheken zum Löschen von Datenträgern ist verboten.
So implementieren wir es im 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
Mit anderen Worten, dieser Code wird zweimal ausgeführt, mit einem Schreib- und Verifizierungspass für 0
und einem Schreibpass und einem Verifizierungspass für 1
.
Ist jemand ballig genug, um es im Code-Golf-Stil umzusetzen? ;)
Antworten:
x86-Maschinencode (Linux), 116 Byte
Nimmt den Dateinamen als Argument
Versammlung (NASM):
Probieren Sie es online aus! (Verwendet eine temporäre Datei)
-11 Bytes durch Optimieren von sich bewegenden Registern und Verwenden des Stapels als Puffer anstelle einer konstanten Position im Speicher.
quelle
Auf einem Linux-System ist keine spezielle Handhabung von Geräten erforderlich. Verwenden Sie einfach die Gerätedateischnittstelle.
Python 3 (Byte-Strings) - 141 Bytes
Es ist ziemlich einfach und nicht wirklich stark optimiert, aber es funktioniert. Hier ist ein grundlegender Überblick.
Exit-Schleife, wenn das Inkrement hoch genug ist
Als Bonus können Sie dies für jeden Satz und jede Anzahl von Bytemodifikationsmustern ändern, z. B. 0x55 / 0xaa für stärkere Überschreibungseffekte.
Ich habe dies tatsächlich an einer Gerätedatei mit Loopback getestet. Ich bin mir jedoch nicht 100% sicher, ob die Überprüfung tatsächlich funktioniert. Aufgrund des Pufferverhaltens kann es erforderlich sein, die Datei bei jedem Durchgang zu schließen und erneut zu öffnen. Ich würde hoffen, dass Flush dies verhindert.
* bearbeitet, um einige Vorschläge in die Kommentare aufzunehmen
quelle
=
Python. Sie können auch die Anzahl der Bytes;
reduzieren, indem Sie die Einrückung reduzieren.f.seek(0);f.seek(0)
(19 Byte)s=f.seek;s(0);s(0)
(18 Byte). Darüber hinausif f.read()==x:i+=1
kann seini+=f.read()==x
.b'\0'
stattb'\x00'
sollte funktionieren.C (Klirren) ,
-DZ=lseek(d,0
+ 139 = 152 BytesProbieren Sie es online aus!
Nimmt den Dateinamen als Argument
Ungolfed:
quelle
Tcl, 286 Bytes
Nicht wirklich so gut optimiert. Ich habe versucht, was ich konnte, aber ich weiß nicht so viel über Tcl.
Speichern Sie als "f.tcl" und führen Sie unter Unix mit
tclsh f.tcl "your filename"
. Stellen Sie sicher, dass es genau ein Argument gibt! Ich habe dies an einer einfachen Datei getestet, aber es sollte auch an einer Gerätedatei funktionieren.Das Festlegen von Variablen und die Indizierung sind in Tcl wichtiger, daher habe ich beschlossen, den gemeinsamen Code zwischen den Durchläufen in eine Funktion einzufügen. Dann rufe ich es zuerst mit "\ 0" auf und wiederhole es, während es nicht überprüft werden kann. Ich mache das gleiche mit "\ xff".
Ich errötete nach dem Schreiben; es könnte nicht notwendig sein.
fconfigure -translation binary -buffering none
ist länger.-2 Bytes durch Entfernen von Anführungszeichen
r+
.quelle