Машинный код 8086 (MS-DOS.COM), 83 байта
Запускается в DOSBox или в вашей любимой паровой вычислительной машине. Строка для облучения задается как аргумент командной строки.
Двоичный:
{
Читабельно:
Ås
Наезжать
Активная часть дублируется, так что всегда есть одна, не затронутая радиацией. Методом прыжков выбираем здоровый вариант. Каждый прыжок является коротким, поэтому его длина составляет всего два байта, где второй байт — это смещение (т. е. расстояние прыжка со знаком, определяющим направление).
Мы можем разделить код на четыре части, которые могут быть подвергнуты облучению: переход 1, код 1, переход 2 и код 2. Идея состоит в том, чтобы всегда использовать чистую часть кода. Если одна из частей кода облучается, необходимо выбрать другую, но если облучается один из переходов, обе части кода будут чистыми, поэтому не имеет значения, какая из них будет выбрана.
Причина наличия двух частей прыжка заключается в том, чтобы обнаружить облучение в первой части, перепрыгнув через нее. Если первая часть кода облучается, это означает, что мы прибудем на один байт от отметки. Если мы убедимся, что такая неудачная посадка выберет код 2, а правильная посадка выберет код 1, мы в выигрыше.
Для обоих переходов мы дублируем байт смещения, делая каждую часть перехода длиной 3 байта. Это гарантирует, что облучение в одном из двух последних байтов все равно сделает переход действительным. Облучение в первом байте вообще остановит переход, так как последние два байта будут формировать совершенно другую инструкцию.
Совершите первый прыжок:
Å`s
Если любой из Å
bytes are removed, it will still jump to the same place. If the {Å`s
байт удален, вместо этого мы получим
Å
это вполне безопасная инструкция для MS-DOS (другие версии могут с этим не согласиться), а затем мы переходим к коду 1, который должен быть чистым, поскольку повреждение произошло в прыжке 1.
Если прыжок выполнен, мы приземляемся на втором прыжке:
Å`
Если эта последовательность байтов цела и мы попадаем прямо на отметку, это означает, что код 1 был чистым, и эта инструкция возвращается к этой части. Дублированный байт смещения гарантирует это, даже если один из этих байтов смещения был поврежден. Если мы либо потеряем один байт (из-за поврежденного кода 1 или перехода 1), либо Å
byte is the damaged one, the two remaining bytes will also here be benign:
æIg<ù # irradiate
ˆ # add the result to the global array
\ # pop (in case the above instruction gets irradiated)
æIg<ùˆ\ # idem
æIg<ùˆ # no pop, it's okay to dirty the stack at this point
¯ # push global array
¯ # and again, so at least one goes through
{ # sort
Å # conveniently ignored by the parser
` # dump
s # swap
# and implicitly output
В любом случае, если мы в конечном итоге выполним эти две инструкции, мы будем знать, что либо переход 1, либо код 1, либо переход 2 были облучены, что делает переход к коду 2 безопасным.
Тестирование
Следующая программа использовалась для автоматического создания всех версий файла .COM. Он также создает BAT-файл, который можно запустить в целевой среде, который запускает каждый облученный двоичный файл и передает их выходные данные в отдельные текстовые файлы. Сравнение выходных файлов для проверки достаточно просто, но в DOSBox нет æ # powerset of the input
Ig # length of the input
< # - 1
ù # elements of a with length b
, so it was not added to the BAT file.
æIg<ùˆ\æIg<ùˆ\æIg<ùˆ¯¯{Å`s