Давайте напишем кратчайший код для выполнения упрощенного варианта метода вытеснения DoD 5220.22-M всего за два прохода записи.
Разрешен любой язык программирования, но использование ориентированных на очистку диска библиотек запрещено.
Вот как мы должны реализовать это в псевдокоде:
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
Другими словами, этот код будет выполняться дважды, с проходом записи и проверкой для 0
, а также проходом записи и проверкой для 1
.
Кто-нибудь достаточно смелый, чтобы реализовать его в стиле «код-гольф»? ;)
Ответы:
машинный код x86 (Linux), 116 байт
Принимает имя файла в качестве аргумента
Сборка (NASM):
Попробуйте онлайн! (Использует временный файл)
-11 байт за счет оптимизации движущихся регистров и использования стека в качестве буфера вместо постоянного расположения в памяти.
источник
В системе Linux нет необходимости в специальной обработке устройств. Просто используйте интерфейс файла устройства.
Python 3 (байтовые строки) - 141 байт
Это довольно просто и не сильно оптимизировано, но работает. Вот краткое изложение.
выходной цикл, когда приращение достаточно велико
В качестве бонуса вы можете изменить это для любого набора и количества шаблонов модификации байтов, таких как 0x55 / 0xaa для более сильных эффектов перезаписи.
Я действительно проверял это на файле устройства, используя loopback. Однако я не уверен на 100%, что проверка действительно работает. Может потребоваться закрыть и снова открыть файл при каждом проходе из-за поведения буферизации. Я надеюсь, что флеш предотвращает это.
* отредактировано для включения некоторых предложений в комментарии
источник
=
в Python. Вы также можете уменьшить количество байтов, используя;
для уменьшения отступов.f.seek(0);f.seek(0)
(19 байт) может бытьs=f.seek;s(0);s(0)
(18 байт). Кроме того,if f.read()==x:i+=1
может бытьi+=f.read()==x
.b'\0'
вместо того,b'\x00'
чтобы работать.C (лязг) ,
-DZ=lseek(d,0
+ 139 = 152 байтаПопробуйте онлайн!
Принимает имя файла в качестве аргумента
Ungolfed:
источник
Tcl, 286 байт
Не очень хорошо оптимизирован. Я пытался, что мог, но я не так много знаю о Tcl.
Сохранить как "f.tcl" и запустить на Unix с
tclsh f.tcl "your filename"
. Убедитесь, что есть только один аргумент! Я проверил это на простом файле, но он должен работать и на файле устройства.Настройка переменных и индексация более важны в Tcl, поэтому я решил поместить общий код между проходами в функцию. Затем я вызываю его сначала с "\ 0" и повторяю, пока он не может проверить. Я делаю то же самое с "\ xff".
Я покраснел после записи; это может быть не нужно.
fconfigure -translation binary -buffering none
длиннее-2 байта, удаляя кавычки вокруг
r+
.источник