Вы должны написать программу или функцию , которая, когда дана непустая строка S из N символов ASCII для печати † , выводит программу , которая будет завершаться с кодом выхода C , где C является ASCII элемент кода в положении 0 в S . Эта программа , которую вы напишете дополнительно выводить программу P , таким образом , что при запуске, он выходит с выходом кодом C ' , где C' является ASCII элемент кода в положении 1 в S . Программа P выведет другую программу P ′ . Этот процесс повторяется до тех пор, пока в S не останется символов, После того, как это сделано, вы должны ничего не выводить, за которым следует необязательный перевод строки; и должен выйти с кодом выхода 0.
† Знаки между 0x20
и 0x7e
включительно.
Еще несколько правил:
- Самомодифицирующиеся программы недопустимы: вы должны вывести источник в STDOUT (или сначала вернуть значение)
- Вы не можете читать свой собственный исходный код.
Победит самая короткая такая программа в байтах.
Для некоторого элементарного тестирования может использоваться этот скрипт ruby . (Первый аргумент - это способ вызова сценария, второй - программа, а третий - входная строка.)
Гипотетический пример
Скажи, что программа есть FOO
. Когда дана строка «ABC», она выводит BARA
. Эта программа выходит с кодом 65
и выходами BARB
. Это в свою очередь выходит с кодом 66
и выходами BARC
. Эта программа выходит с кодом 67
и выходами BAR!
. Это ничего не выводит и выходит с кодом 0
.
0
это успех tio.run/nexus/…33 throw
броска произвольного числа. Вы используете негативы для уровня ОС, а смещение -512. ИДК тоже много, но я смотрю здесь: complang.tuwien.ac.at/forth/gforth/Docs-html/…Ответы:
Python 2,
12610194 байтаВ процессе этого я обнаружил, что код Python может не содержать буквенных байтов NUL.
Попробуйте онлайн (показывает код выхода в информации отладки)
Обратите внимание, что каждая из непустых программ ниже имеет завершающий перевод строки.
Для ввода
Hello
вышеуказанных выходов:какие отпечатки
...
какие отпечатки
какие отпечатки
который ничего не печатает (пустая программа)
который ничего не печатает и выходит с кодом 0.
источник
Python 3, 77 байт
Этот код принимает входные данные из STDIN и выводит первую программу в STDOUT.
Если входные данные
ABCDE
, результатыгде каждая строка содержит код завершения и выходные данные ранее выполненной программы (первая строка - первая программа).
источник
Python 3 ,
115108100 байтПопробуйте онлайн!
Для ввода
Hello
программа печатает:Программа выше печатает:
и выходит с кодом
72
.Попробуйте онлайн!
Программа выше печатает
и выходит с кодом
101
.Попробуйте онлайн!
Программа выше печатает:
и выходит с кодом
108
.Попробуйте онлайн!
Программа выше печатает:
и выходит с кодом
108
.Попробуйте онлайн!
Программа выше ничего не печатает и выходит с кодом
111
.Попробуйте онлайн!
Пустая программа ничего не печатает и завершает работу с кодом
0
.Попробуйте онлайн!
источник
C 156 байт
Попробуйте онлайн! (Откройте вкладку отладки, чтобы увидеть код выхода.)
Принимает ввод в качестве аргумента командной строки.
Для входа "ABC", это выводит программу
который возвращает 65 и выводит
который возвращает 66 и выводит
который возвращает 67 и выводит
который ничего не выводит и возвращает 0.
источник
Python 2, 67 байт
Основан на этом ответе , но изменен для использования Python 2, с тривиальной программой,
0
чтобы ничего не печатать и выйти.Попробуйте онлайн
источник
RPL, 73 байта
С кодовой страницей hp8.
Включите ваш HP48 или аналогичный, или включите droid48 . Не забудьте
-52 SF
для лучшей визуализации стека. Я предполагаю, что вы уже поместили строку, например"ABC"
, в стек. Затем введите следующую функцию:(Для удобства я предлагаю дважды нажать клавишу «α», прежде чем что-либо вводить, поэтому блокируем режим альфа-ввода. В последнем случае просто используйте клавишу DEL, чтобы отменить автоматически вставленные закрывающие разделители. Просто используйте клавишу ВВОД для подтверждения. Не забывайте пробел после удар ножом.)
Эта функция немедленно помещает в стек самоизменяющуюся программу в виде списка. (Но функция выше не меняет себя). Поскольку L в RPL первоначально обозначает LISP, нажатие клавиши EVAL действительно оценит эту программу. Он возвращает код завершения на уровне стека два и оставляет себя модифицированным (да, здесь это сомнительно) для последнего EVAL. Поэтому нажимайте кнопку EVAL до тех пор, пока программа, наконец, не остановится, чтобы опуститься на первый уровень стека. Окончательный код выхода 0, таким образом, появляется на первом уровне, а предыдущие коды выхода указаны выше. Если вы забыли , ваши друзья. Самомодификация заключается в удалении использованного символа из встроенной строки ( ветви). Следовательно, отброшенная программа короче после каждого EVAL. Ветвь не обеспечивает выход ничего
-52 SF
, вы можете перемещаться в стеке после каждого EVAL, нажимая клавишу ((выйдите из этого режима навигации с помощью клавиши ON). Вышеуказанная функция принимает строки с 0x0-символами внутри, чтобы создавать такие строки0 CHR
и+
SUB 2 SWAP PUT
4 DROPN
Инструкция от ОП соблюдается, отбрасывая среди прочего саму программу. Конечно, все это предполагает ваше замечание-55 SF
адепта. Пользователи-55 SF
должны быть забанены. Навсегда.Я предполагаю, что решение RPL / 2 существует и может содержать настоящий код выхода Unix, но на самом деле RPL / 2 имеет ограниченный самоанализ и не может оценивать списки.
источник
Сед ,
467461 байтКоды символов жесткие:
Попробуйте онлайн!
В противном случае логика довольно проста: (1) экранировать специальные символы (их два), (2) перенести в дополнительный
s/^/…/;q\1
слой, (3) повторить.Вот вывод для
hello
:И маленький скрипт, который я использовал:
источник
PowerShell,
172156 байт.h3l}'{l0
Ввода приведет к следующему выводуПопробуйте онлайн!
Который в свою очередь выведет
Попробуйте онлайн!
Последний запуск ничего не даст и код выхода будет 0.
Попробуйте онлайн!
источник