Napiszmy najkrótszy kod, aby wykonać uproszczony wariant metody czyszczenia DoD 5220.22-M z tylko dwoma przebiegami zapisu.
Dowolny język programowania jest akceptowany, ale korzystanie z bibliotek zorientowanych na czyszczenie dysku jest zabronione.
Oto jak mamy to zaimplementować w pseudokodzie:
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
Innymi słowy, ten kod będzie działał dwukrotnie, z przepustką zapisu i przepustką weryfikacyjną dla 0
, oraz przepustką zapisu i przepustką weryfikacyjną dla 1
.
Czy ktoś jest wystarczająco bystry, aby wdrożyć ten styl golfa? ;)
Odpowiedzi:
kod maszynowy x86 (Linux), 116 bajtów
Jako argument przyjmuje nazwę pliku
Montaż (NASM):
Wypróbuj online! (Wykorzystuje plik tymczasowy)
-11 bajtów poprzez optymalizację ruchomych rejestrów i wykorzystanie stosu jako bufora zamiast stałej lokalizacji w pamięci.
źródło
W systemie Linux nie ma potrzeby specjalnej obsługi urządzeń. Wystarczy użyć interfejsu pliku urządzenia.
Python 3 (ciągi bajtów) - 141 bajtów
Jest dość prosty i niezbyt mocno zoptymalizowany, ale działa. Oto podstawowe podsumowanie.
pętla wyjściowa, gdy przyrost jest wystarczająco wysoki
Jako bonus, możesz to zmodyfikować dla dowolnego zestawu i liczby wzorców modyfikacji bajtów, takich jak 0x55 / 0xaa dla silniejszych efektów nadpisywania.
Testowałem to na pliku urządzenia, używając sprzężenia zwrotnego. Nie jestem jednak w 100% pewien, że sprawdzanie rzeczywiście działa. Konieczne może być zamknięcie i ponowne otwarcie pliku przy każdym przejściu, ze względu na zachowanie buforowania. Mam nadzieję, że kolor temu zapobiegnie.
* edytowane w celu uwzględnienia sugestii w komentarzach
źródło
=
w Pythonie. Możesz również zmniejszyć liczbę bajtów, używając;
do zmniejszenia wcięcia.f.seek(0);f.seek(0)
(19 bajtów) może byćs=f.seek;s(0);s(0)
(18 bajtów). Ponadtoif f.read()==x:i+=1
może byći+=f.read()==x
.b'\0'
zamiastb'\x00'
powinien działać.C (brzęk) ,
-DZ=lseek(d,0
+ 139 = 152 bajtyWypróbuj online!
Traktuje nazwę pliku jako argument
Nie golfowany:
źródło
Tcl, 286 bajtów
Niezbyt dobrze zoptymalizowane. Próbowałem, co mogłem, ale niewiele wiem o Tcl.
Zapisz jako „f.tcl” i uruchom na Uniksie za pomocą
tclsh f.tcl "your filename"
. Upewnij się, że jest dokładnie jeden argument! Przetestowałem to na zwykłym pliku, ale powinien on również działać na pliku urządzenia.Ustawienie zmiennych i indeksowanie jest bardziej zaangażowane w Tcl, więc postanowiłem umieścić wspólny kod między przejściami w funkcji. Następnie nazywam to najpierw „\ 0” i powtarzam, dopóki się nie weryfikuje. Robię to samo z „\ xff”.
Zarumieniłam się po napisaniu; może nie być konieczne.
fconfigure -translation binary -buffering none
jest dłuższe.-2 bajty poprzez usunięcie cudzysłowów
r+
.źródło