Проще говоря, ваша цель состоит в том, чтобы создать законченную программу, которая изменяет свой собственный исходный код до тех пор, пока каждый символ источника не будет отличаться от того, с которого он начинался.
Пожалуйста, включите начальный источник, а также конечный источник в ваш пост, а также описание. Например, опишите, что (еще) делает ваша программа, язык, который вы использовали, вашу стратегию и т. Д.
правила
- Ваша программа должна остановиться через некоторое время после завершения модификации.
- Он должен фактически изменить свой собственный, в настоящее время работающий исходный код (не обязательно файл, который вы передали интерпретатору, он изменяет его инструкции), а не печатать новую программу или писать новый файл.
- Стандартные лазейки запрещены.
Кратчайшая программа выигрывает.
Если ваш язык может изменить свой собственный файл и выполнить новый процесс компилятора, но не может изменить свой собственный (в настоящее время работающий) исходный код, вы можете вместо этого написать такую программу со штрафом + 20% байтов, округленным в большую сторону. Реальные самоизменяющиеся языки должны иметь преимущество.
Изменить : Если ваша программа останавливается с ошибками, пожалуйста, укажите его как таковой (и, возможно, сказать, что ошибки.)
источник
Ответы:
/// , 1 байт
Программа находит
/
(начало группы замены шаблона) и удаляет ее при подготовке к замене. Затем он достигает EOF, поэтому он сдается и останавливается.источник
Лабиринт , 2 байта
В
>
вращает источник , так что он становитсяУказатель инструкции теперь находится в тупике и поворачивается, чтобы ударить,
@
что завершает программу.Конечно,
<@
тоже будет работать.источник
Python 2, 225 байт
Конечный исходный код представляет собой строку
"0"
s, длина которой равна числу байтов в исходном объекте скомпилированного кода.Код находит работающий объект кода
sys._getframe().f_code.co_code
и создает структуру, которая представляет объекты строки Python. Затем он получает память, которую фактически занимает код, и заменяет ее"0"*len(c)
.При запуске программа завершается со следующей трассировкой:
Это показывает, что перезапись была успешной, и программа умирает, потому что
0
не является действительным кодом операции.Я удивлен, что это даже возможно в python, фреймы доступны только для чтения, я не могу создавать новые. Единственная сложная вещь, которую это делает, - это изменение неизменяемого объекта (строки).
источник
"1"
строка в коде на самом деле не является частью «кода», это просто константа, на которую ссылается байт-код. На самом деле я меняю скомпилированные коды операций виртуальной машины python, а не константы или переменные. Так что я меняю не исходный код, а скомпилированный код. Я мог бы изменить исходный код как сохраненный, но это фактически не повлияло бы на код во время выполнения, потому что он уже был бы скомпилирован. Если бы вы хотели, я мог бы опубликовать это в «скомпилированных кодах Python 2.7 с константами», но это было бы глупо для ИМО."1"
значение<backtick>1+1<backtick>
только на 2 байта1+1
из моего предложения превращается2
в скомпилированную версию ... Компилятор слишком умен для своей пользы!зло , 1 байт
У зла есть несколько хранилищ памяти: один - это сам исходный код, а другой - колесо, представляющее собой круговую очередь, которая инициализируется одним нулем.
q
меняет местами исходный код и колесо, поэтому он заменяет исходный код нулевым байтом. Тем не менее, только строчные буквы являются действительными операторами зла, поэтому этот символ просто не используется, и программа завершается.источник
МСМ , 8 байт
Преобразует исходный код в
pqpqpqpq
МСМ оперирует списком строк. Команды берутся слева и обрабатывают правую сторону как стек. МСМ всегда работает на свой собственный источник.
Трассировка выполнения:
источник
Malbolge, 1 или 2 байта.
Язык Malbolge «шифрует» каждую инструкцию после ее выполнения, поэтому это письмо (Malbolge NOP) станет
!
(что также является nop), а затем завершится. По какой-то причине для использования интерпретатора Malbolge, который я использую, требуется два байта, что даетDC
(оба из которых являются nops) ставшими!U
(оба из которых также являются nops)Редактирование: начальное состояние памяти Malbolge зависит от последних двух символов в коде, поэтому оно не является четко определенным для односимвольных программ. (Хотя этот код не заботится о начальном состоянии памяти)
источник
x86 asm - 6 байт
не уверен, относится ли «до тех пор, пока каждый символ источника отличается от того, с которого он начинался», относится к каждому байту, каждому немоническому или общему изменению. если я неверный, я могу изменить xor на rep xor, чтобы каждый бит менял значения, но надеялся не делать этого, чтобы сохранить еще 6 байтов, чтобы они оставались хотя бы немного сравнимыми с этими специальными языками гольфа.
Все, что это делает, это изменяет c2 на c3 retn, получая действующий адрес eip и хоринг 5 байтов впереди.
источник
SMBF , 92 байта
Может быть в гольф, и я, вероятно, над этим поработаю позже.
объяснение
Программа генерирует следующие команды в конце своей ленты, чтобы стереть себя, поэтому она должна генерировать следующие значения на ленте:
Создайте связку
91
s с нулями (показано как_
) между ними для использования в качестве временных значений.Отрегулируйте значения по различиям
Лента после выполнения будет иметь все нули, за исключением сгенерированного кода
[_[_-_]_<_]
.Замечания:
Эта программа дала мне понять, что мой интерпретатор Python для SMBF имеет одну или две ошибки,
и я еще ненашелисправления.Это исправлено сейчас.источник
Emacs Lisp 22 байта
Запустить из REPL:
Функция теперь оценивается как
nil
.Поочередно (отвязать себя) 30 байтов
Оцените и ошибки как
void-function
. Функция существовала до запуска.источник
Redcode , 7 байт, 1 инструкция (просто пример. Не конкурирует)
Это тривиальный пример.
Перемещает следующую ячейку памяти на себя, затем останавливает (потому что инициализируется вся память
DAT 0 0
, что останавливает программу при выполнении.)источник
Powershell 65 байт
Определите функцию, которая переписывает себя в нуль.
Оцените это один раз, и оно само себя устраняет.
Поочередно (удаляет себя из памяти) 36 байт
Вызов его сначала удаляет, а затем пытается рекурсивно оценить. Ошибка как неизвестная команда.
источник
MIXAL, 6 байт (считая 2 вкладки)
Программа запускается в ячейке памяти 0, а затем записывает 0 в ячейку памяти 0, тем самым стирая себя. Машина останавливается автоматически.
Это язык ассемблера для гипотетического компьютера MIX Дональда Кнута, который может быть собран и запущен с использованием комплекта разработки GNU MIX ( https://www.gnu.org/software/mdk/ ).
источник
> <> ,
403430 байтПопробуй это здесь!
Объяснение:
По сути, это помещает в стек набор из 3-х символьных блоков следующим образом: (ypos, xpos, ASCII символ), который в конце переворачивается, поэтому последняя команда 'p' читает (символ, xpos, ypos) и устанавливает эту позицию в код для этого символа. Первый символ вручную устанавливается как «<», так что код заканчивается в конце как «> p <» для цикла команды. Затем каждый другой символ перезаписывается как '', включая символ p. '' На самом деле является "ASCII CHAR 0", который НЕ является NOP и выдаст ошибку при чтении.
Кроме того, перед командой «p» должно быть нечетное (?) Количество символов, иначе оно не будет возвращено в последний раз и перезаписано.
источник
Пакет, 11 байт
Изменяет исходный код
ECHO is on.
Это
@
есть, поэтому команда не отображается, но в основном так, чтобы эти двеecho
строки не совпадали.источник
@
может быть удалена, потому чтоECHO
( в верхнем регистре) =!echo
( в нижнем регистре)echo
не могут выстроиться в линию.Джольф, 4 байта, неконкурентный
Это
₯S
устанавливает₯C
значение элемента ode на вход, такundefined
как ни один не указан. Попробуй это здесь!источник
(Файловая система) Befunge 98, 46 байт
Обратите внимание, что эта программа создает и манипулирует файлом с именем
a
. Как это устроено:a
содержащим весь код (до 256 символов в каждом измерении), смещенный на один пробел вверх и на два влево.a
одной строкой, заменяя всю первую строку содержимымa
файла.a
файл во вторую строку, сдвинув два места вправо.Как побочный эффект, конечный исходный код даже не действует Befunge! (потому что он содержит новые строки в виде данных в одной строке)
источник
Python 2, 238 байт + 20% = 285,6
По сути, это переключает текущую кодировку файла источника Python между
ascii
иutf-8
, таким образом, существенно изменяя каждый символ источника!источник
) as
->)as
,) else
->)else
,"utf-8"if
,'w',encoding
.