Ваша задача - создать программу, которая при запуске возвращает себя в качестве вывода (это называется quine). Тем не менее, эта квинна должна, когда она копируется n
раз, возвращает квин, но с каждым из ее символов, продублированных по местам n
, где n
положительное целое число.
Если ваша оригинальная программа Derp
:
Derp -> Derp (must return itself as output to be a quine)
DerpDerp -> DDeerrpp
(the "Derp" is copied twice, so each character in the output has to be copied twice)
DerpDerpDerp -> DDDeeerrrppp
etc. etc.
Имейте в виду, что вам разрешено иметь пробелы в вашей «базовой» программе, но они учитываются при «переплетении». Скажи, что твоя программа
Derp
{newline}
(Новая строка означает завершающий символ новой строки, после которого есть дополнительный пробел Derp
). Когда дублируется, чтобы стать
Derp
Derp
{newline}
Вы должны вывести
DDeerrpp
{newline}
{newline}
Имейте в виду, что 2
после DDeerrpp
.
Правила и характеристики:
- Ваша программа должна содержать как минимум два разных символа (это означает, что ваш код должен быть длиной не менее 2 байтов).
- Применяются стандартные правила Квина .
Это код-гольф , поэтому выигрывает самый короткий код в байтах!
code-golf
quine
source-layout
clismique
источник
источник
Ответы:
Деление , 6 байт
Попробуйте онлайн! Попробуйте две копии! Попробуй три!
объяснение
Это просто стандартная квинция деления . Это работает для этой задачи, потому что у Fission есть явные точки входа в программу. В частности, дублируя программу, мы добавляем еще один,
R
который добавляет еще один атом (указатель инструкции). Поскольку исходный код является тороидальным, эффективный исполняемый код не изменяется в противном случае - для каждого атома код по-прежнему выглядит одинаково локально. Однако атомы выполняются в шаге блокировки, так что вещи, которые они печатают, чередуются, и мы получаем дополнительную копию каждого символа в выводе.Для полноты картины я просто вкратце повторю, как работает сама программа. Независимо от того, повторяем ли мы программу или нет (например
'!+OR"'!+OR"'!+OR"
), каждый атом видит следующий код:"
Режим печати переключает строки, так что программа начинается печать'!+OR
непосредственно на STDOUT, что все , кроме Куайной цитаты. Затем'!
устанавливает массу атома в код символа!
,+
увеличивает его, что дает"
, иO
печатает его, одновременно уничтожая атом. Затем программа завершается, потому что не осталось ни одного атома.источник
Python 2,7
377310304194191 байт!Это мой первый гольф, поэтому я не ожидал, что он будет слишком хорошим. Но я думал, что концепция в предложенном мной решении была несколько забавной, поэтому я все равно публикую ее.
В самом деле, это Quine; Вы можете попробовать это здесь . Он злоупотребляет модулем проверки довольно сложно.
Если мы попробуем запустить его с тем же исходным кодом x2, мы также получим правильный вывод; Вы можете попробовать это здесь . х3, х4 и т.д. все работают как положено.
Разгромленный с объяснением:
источник
inspect
? (см. соответствующий мета-пост ). На PPCG у нас есть конкретные определения того, что делает квину действительной, и «чтение источника» обычно рассматривается как мошенничество.import threading,inspect as i
может бытьimport threading as T,inspect as i
CJam , 19 байтов
Попробуйте онлайн!
Как это устроено
источник
RProgN , 66 байт
Значительный пробел будет смертью меня
Разъяснения
Боже мой, я монстр ...
Попробуйте онлайн!
источник
~["[%q]F01+`0=`.{0m}R"]F01+`0=`.{0m}R
в целом работает нормально, это недопустимое решение, поскольку нет способа реплицировать маркер ZSS.Perl 5, 107 байт
Ungolfed:
Попробуйте онлайн!
источник
Питон 3 ,
122121112 байтовПопробуй онлайн: одна копия | две копии | три копии | четыре копии, с автоматической проверкой
Как это устроено
При этом используется стандартная строка Python: сохраняйте код, который вы хотите выполнить, в переменной (в виде строки); включить некоторую логику в эту строку, чтобы напечатать себя, все до него и все после него; затем выполните эту строку.
Код, который выполняется через строку s следующий.
Первая строка безоговорочно импортирует модуль atexit , что позволит нам зарегистрировать обработчик выхода. Попытка импортировать один и тот же модуль несколько раз никак не повлияет на сценарий. Затем он пытается увеличить переменную n , чтобы отслеживать, сколько копий исходного кода было выполнено.
Вторая строка выполняется только в том случае, если первая содержит ошибку. Это будет иметь место в первой итерации, так как n все еще не определено. В этом случае мы инициализируем n как 1 и регистрируем лямбду, которая выполняет действительную магию.
Зарегистрированный обработчик выхода
будет вызван прямо перед завершением программы. Лямбда сама создает строку
"s=%r;exec(s);"%s
-%r
создает строковое представление правильного аргумента ( ов ), который включает все между одинарными кавычками и самими кавычками, - затем перебирает свои символы. Для каждого символа c мы просто печатаем n копий c . Переходя вc*n
качестве имени аргументаend
вprint
означает , что нет перевода строки не будет прилагаемым.источник
CJam , 14 байтов
Попробуйте онлайн!
Пояснения
источник