Напишите простую программу, которая копирует себя при выполнении.
Ваша программа должна быть своего рода исполняемым файлом в Windows, Linux и т. Д., Должна генерировать новый исполняемый файл, который идентичен исходному исполняемому файлу со случайным именем и завершается.
Ваша программа не должна включать чтение или копирование файлов. Разрешается только запись файла для создания нового исполняемого файла.
(PS. Я был довольно смущен, когда в Википедии, Self-replicating program
перенаправляет на Computer virus
статью ...: / ...)
Наименьший размер исполняемого файла побеждает. Ваш ответ может быть программным кодом с соответствующей ОС и компилятором, ассемблерным кодом или HEX-дампом исполняемого файла.
Ответы:
Баш, 236
Дольше, чем строго необходимо, но я ненавижу длинные очереди. Завершающий перевод строки не является обязательным.
источник
Сборка для x86 Linux, 106 байт
Это для сборщика носа. Создайте двоичный файл с помощью командной строки:
nasm -f bin -o a.out selfrep.asm && chmod +x a.out
Вот тот же файл, что и шестнадцатеричный дамп:
7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00 02 00 03 00 01 00 00 00 4C 00 62 2E 2C 00 00 00 00 00 00 00 00 00 00 00 34 00 20 00 01 00 00 00 00 00 00 00 00 00 62 2E 6F 75 74 00 6A 00 00 00 6A 00 00 00 05 00 00 00 00 10 00 00 B0 05 BB 36 00 62 2E B1 41 66 BA B6 01 CD 80 8D 51 29 93 91 B1 00 B0 04 CD 80 B0 01 CD 80
По запросу программа копирует себя в отдельный файл. (Программа могла бы быть значительно короче, если бы ей было позволено просто писать в стандартный вывод и позволить пользователю перенаправлять в файл.)
Я избегал использования граничных трюков, чтобы уменьшить размер. Это должен быть полностью совместимый 32-битный двоичный файл ELF.
Отредактировано, чтобы добавить : В вышеупомянутой версии созданный файл - просто обычный файл, но мне приходит в голову, что за пару байтов (и небольшой изгиб правил) вы можете создать что-то более интересное. Эта версия только на два байта длиннее, в 108 байтов:
Назовите эту версию
asr
для "саморепликатора":nasm -f bin -o asr asr.asm && chmod +x asr
Шестнадцатеричная версия дампа для людей с нарушениями носа:
7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00 02 00 03 00 01 00 00 00 4C 00 01 00 2C 00 00 00 00 00 00 00 00 00 00 00 34 00 20 00 01 00 00 00 00 00 00 00 00 00 01 00 61 73 72 00 6C 00 00 00 6C 00 00 00 07 00 00 00 00 10 00 00 B0 05 BB 38 00 01 00 FE 03 B1 41 66 BA FF 01 CD 80 8D 51 2B 93 91 B1 00 B0 04 CD 80 B0 01 CD 80
Когда вы запускаете его, он создает почти идентичный файл с именем
bsr
, но тот, который сам по себе является исполняемым. Запуск его создаст еще один двоичный файл с именемcsr
. И так далее.(Обратите внимание, что раздражающие вещи начинают происходить после того, как
zsr
. Я подумал о создании версии, которая каскадно меняла бы название наatr
и т. Д., Но я думаю, что большинству людей до этого будет скучно, поэтому, вероятно, это не стоит всех лишних байтов. )источник
Вот примерное доказательство (ungolfed), которое показывает, как сервисы компиляции в .NET могут быть использованы для компиляции исходного кода на лету для генерации идентичного вывода. Первая копия не идентична оригиналу, но последующие копии из последующих прогонов точно идентичны со случайными именами файлов:
Демонстрационный вывод в командной строке:
источник
партия
Версия 1 (30 байт)
Я выигрываю! :)
источник
COM-файл DOS - 50 байт
Создает файл, в
X.COM
которомX
заменяется цифрой единицы текущего времени. COM-файлы просто загружаются в память по смещению100h
сегмента данных (CS и DS установлены одинаковыми), поэтому мы можем просто записать эту память в файл.источник носа
источник
Файл DOS .COM, 29 байт
Символ @ заменяется случайным образом на нечетную букву в первой половине + часть алфавита (A, C, E, G и т. Д.). Выходные файлы имеют размер 255 или 256 байт. Начальные регистры в реальном DOS (в отличие от отладчика) таковы, что AX = 0000, CX = 00FF, SI = 0100.
источник
COM-файл DOS - 36 байт
Имя выходного файла указывается в командной строке, усекается до формата 8.3, пробелы в порядке (пробелы в именах файлов DOS допустимы). Протестировано с использованием командной строки WinXP.
источник