В этом задании вы напишите программу, которая выводит программу, которая в два раза длиннее исходной программы. Выведенная программа должна выводить новую программу программы удвоить свою длину.
Примеры
Если моя программа a
:
< a
> aa
< aa
> aaaa
< aaaa
> aaaaaaaa
правила
- Нет встроенных модулей
- В исходной программе должен быть хотя бы один байт
- Последовательность должна теоретически работать бесконечно
- Ваша программа не имеет права читать что-либо (файл, stdio)
Ваша оценка - это размер оригинальной программы.
code-golf
sequence
quine
code-generation
Downgoat
источник
источник
Ответы:
CJam, 10 байтов
Проверьте это здесь.
объяснение
источник
JavaScript,
626137 байтСпасибо @ Doᴡɴɢᴏᴀᴛ за помощь!
Оригинал [37 байт]:
Ребенок [74 байта]:
Внук [148 байт]:
Альтернативно (с печатью на консоль и в виде полной программы):
Оригинал [61 байт]:
Ребенок [122 байта]:
Внук [244 байта]:
Как это устроено!
1.
f=_=>
Определите функцию f какconsole.log(...)
2.
;f()
Запустите функцию f.3. (в функции f)
console.log(...)
Распечатайте следующее:f=
буквальный текст "f ="${'_'.repeat((0+f).length+5)
«_» повторяется для длины f, измененной для учета символов, не включенных в строковое выражение f+f}
Стрификация функции f;f()
буквальный текст "; f ()"Заметки
console.log
необходимо, а неalert
потому,alert
что не очень хорошо работает с очень длинными строками (по крайней мере, на моей машине / в конфигурации браузера)_
«ы вставляются имя ( не используется) параметр функции F, чтобы гарантировать , что они включены в stringification из ф.console.log
) первого решения по сравнению со вторым: добавление10
к функции вместо0
преобразования ее в строку увеличивает длину на один байт, избавляя от необходимости добавлять 1 к длине впоследствии, сохраняя байт.источник
0+f
также должен работать, чтобы привести функцию к строке(f=_=>`(f=${'_'.repeat((0+f).length+5)+f})()`)()
Минколанг 0,15 ,
1914 байтОригинал , ребенок , внук .
объяснение
То, что
r
делает бит между s, дублирует конечный период достаточно раз, чтобы выполнить критерий удвоения..
является символом «остановки программы», поэтому многие периоды в конце ничего не делают, кроме как быть там.источник
CJam, 12 байтов
При запуске это напечатает
который, в свою очередь, напечатает
и так далее.
Попробуйте онлайн!
источник
Python 3, 51 байт
Это включает в себя завершающий перевод строки.
Какие выводы:
источник
GolfScript, 11 байт
Попробуйте онлайн!
Как работает исходный код
Если приведенный выше исходный код выполняется один раз, стек в конечном итоге
где пустая строка в начале соответствует начальному состоянию стека (пустой ввод).
Две копии исходного кода оставили бы окончательное состояние
и так далее.
Что произойдет дальше
После выполнения исходного кода интерпретатор делает следующее:
Он оборачивает весь стек в массив и помещает этот массив в стек.
Для единственной копии исходного кода стек теперь содержит
Он выполняется
puts
с намерением распечатать упакованную стопку с последующей переводом строки.puts
определяется как{print n print}
, поэтому он делает следующее.print
печатает свернутую копию стека без проверки его (т. е. без преобразования его в строковое представление). Это отправляетв STDOUT и выскакивает копию стека с вершины стека.
Стек теперь содержит
выполняет блок кода, который мы определили ранее.
:
начинается с сохранения["" {: ".~"]} ".~"]
в символе пробела, затем".~"
помещает себя]
в стек и оборачивает стек в массив.n
выдвигает строку, состоящую из одного перевода строки.Стек теперь содержит
выполняется еще раз. Однако он был переопределен, когда мы вызывали его впервые, и теперь содержит массив, а не блок кода.
На самом деле, это толкает
["" {: ".~"]} ".~"]
, оставляя стек какНаконец,
print
печатает самый верхний элемент стека, не проверяя его, отправляячтобы вывести.
источник
𝔼𝕊𝕄𝕚𝕟, 26 символов / 36 байтов
Try it here (Firefox only).
Обратите внимание, что есть завершающий перевод строки.
объяснение
Стандартный Quine:
⟮ⒸⅩ222+ᶈ0
Модификации:
ô
функцию для вывода всех результатов вместо последних результатов (как это делается с использованием неявного вывода)\u27ee⦃ᶈ0}\u27ef\n
и закройте блок копирования, чтобы избежать конфликтов с последующими блоками копирования.ď2
чтобы повторить строку дважды.источник