Распечатать квинну, содержащую ввод


15

задача

Вам будет дана строка на входе, состоящая только из символов от ato z, т.е. вход будет соответствовать регулярному выражению /^[a-z]*$/.

Ваш вывод должен быть законченной программой на том же языке, исходный код которого содержит входные данные и представляет собой правильный quine.

пример

Ваша программа будет получать ввод abcи вывод:

...abc...

Выше должно быть полная программа на том же языке, которая не требует ввода и вывода:

...abc...

т.е. он сам выводит.

счет

Это . Кратчайший ответ в байтах побеждает.

Ссылки


3
Хм .. Так как "quat" (quine + cat)?
Мэтью Ро,

Ответы:


7

Python 3, 57 61 байт

lambda x:"s='s=%r;print(s%%s)';print(s%s)".replace('s',x+'x')

Принимает базовый Python 3 Quine отсюда и заменяет имя переменной на вход.

Примечание: Как отметил Hyper Neutrino в комментариях, это не работает для зарезервированных ключевых слов , таких как for, ifи т.д.

Добавление символа, который не заканчивается ни одним из зарезервированных ключевых слов, таких как 'x'или любое число, исправляет это. (Эрджан Йохансен).


Очень креативно использовать имя переменной.
Утренняя монахиня

3
Не работает для ввода "for"или любого другого зарезервированного слова в Python.
HyperNeutrino

Могу подтвердить. Это не работает для всех возможных входов. Попробуйте онлайн
mbomb007

@HyperNeutrino, отметил, также не знаю, как обойти это
c ..

Вы можете добавить дополнительный символ, который не находится в конце любого ключевого слова, например 'x'.
Орджан Йохансен

6

Желе , 9 байт

Генератор

;“¶Øv”ṾØv

Попробуйте онлайн!

Как это устроено

;“¶Øv”ṾØv  Main link. Argument: s (string of letters)

;“¶Øv”     Concatenate s and the string "\nØv".
      Ṿ    Uneval; get its string representation.
           (implicit) Print the previous return value since the next link is an
           otherwise unparsable nilad.
       Øv  Set the return value to "Ṙv".

Куайн

Если введено quine, генерируется следующая программа.

“quine
Øv”Ṙv

Попробуйте онлайн!

Как это устроено

Это стандартное желе-квин. Первый,

“quine
Øv”

устанавливает левый аргумент и возвращаемое значение в строку "quine\nØv".

Затем печатает строковое представление (код из предыдущего блока) и возвращает неизмененную строку.

Затем vпринимает левый аргумент и передает его в качестве ввода в программу Jelly

quine
Øv

Во всех программах Jelly выполняется только основная ссылка (определенная в последней строке), поэтому первая строка полностью игнорируется.

Наконец, Øvустанавливает возвращаемое значение равным "Ṙv", которое неявно печатается после завершения внешней программы.



4

Haskell , 51 байт

q берет строку и возвращает строку.

q s|t<-"main=putStr$fst`mappend`show$"=t++show(t,s)

Попробуйте онлайн!

Пример вывода для putStr$q"test":

main=putStr$fst`mappend`show$("main=putStr$fst`mappend`show$","test")

Попробуйте онлайн!

  • Помещает основной текст квин и нужную строку в кортеж.
  • Используется fstдля извлечения основного текста.
  • Использует, showчтобы превратить весь кортеж в строку.
  • Использует mappendдля объединения двух предыдущих функций. Удобно mappendдля двух функций дает функцию, которая применяет каждую функцию к своему аргументу и объединяет результаты с mappendтипом результата (здесь конкатенация строк).

4

Недогрузка , 14 байтов

(~aSaS(:^)S):^

Попробуйте онлайн!

Используйте как (test)(~aSaS(:^)S):^- что само по себе является квинем.

Как это устроено

  • Недогрузка - это конкатенационный (основанный на стеке) эзотерический язык. Он не поддерживает чтение ввода, поэтому любые аргументы изначально помещаются в стек.
  • (test)и (~aSaS(:^)S)являются строковыми литералами, поэтому поместите себя в стек, с последним сверху.
  • :дублирует (~aSaS(:^)S)строку в верхней части стека, а затем ^запускает ее содержимое как подпрограмму.
  • ~поменяет местами два верхних элемента в стеке, так что теперь (test)это самый верхний элемент .
  • aЗаворачивает (test)в дополнительные скобки.
  • Sберет строку ((test))сверху стека и печатает ее без внешних скобок (которые являются просто буквальным синтаксисом).
  • Теперь aSпечатает оставшиеся (~aSaS(:^)S)в стеке аналогичным образом (с круглыми скобками).
  • Наконец, (:^)Sпечатает финал :^.

)(Я не думаю, что это действительно работает как вход.
Rɪᴋᴇʀ

@Riker Правда, к сожалению, Underload не поддерживает несовместимые скобки. Но вопрос уточняет a- z.
Орджан Йохансен

Ах хорошо. Не заметил этого
Rɪᴋᴇʀ

4

Недогрузка , 14 байтов

a(aS(:^)S)~*:^

Попробуйте онлайн!

Отличный подход от другого ответа Underload; вместо того, чтобы быть квинном, он создает квайн. Интересно, что получается одинаковое количество байтов. Это функция, которая берет свой аргумент из стека и выводит на стандартный вывод.

объяснение

a(aS(:^)S)~*:^
a               Generate a string literal containing the input
 (aS(:^)S)~*    Prepend "aS(:^)S"
            :^  Mockingbird: run the resulting function with itself as argument

Результирующая функция выглядит так:

aS(:^)S(input)
aS              Print a string literal containing the argument
  (:^)S         Print ":^"
       (input)  Push "input" onto the stack

Другими словами, он печатает строковый литерал, содержащий себя, а затем :^. Это явно квинна (потому что то, что было только что напечатано, совпадает с кодом, который мы выполнили, чтобы запустить его в первую очередь).


Похоже, в TIO вы можете отбросить инициал a, если вы не возражаете против ошибки ошибки сегментации, которая выводится в stderr, когда вход содержит a.
Орджан Йохансен

Я даже не думал о том, чтобы просто выполнить строковый литерал, который дает пользователь, на том основании, что работа программы уже завершена в этот момент, и, не (будучи символом, который появляется на входе, все программы обязательно будут ничего не делать или аварийно завершаться. Я даже не думаю, что это специфично для TIO; программа недействительна, но она уже выдает желаемый результат в момент сбоя.

2

V , 9 байт

ñ"qPxÉÑ~j

Попробуйте онлайн!

Это модификация стандарта V quine , и я горжусь тем, что это всего на один байт длиннее.

HexDump:

00000000: f122 7150 78c9 d17e 6a                   ."qPx..~j

Объяснение:

ñ           " Record the following commands into register 'q'
 "qP        " Paste register 'q' before all input
    x       " Delete the last character of what we just pasted (this will be a 'ÿ')
     ÉÑ     " Insert 'Ñ' at the beginning of this line
       ~    " Toggle the case of this character
        j   " Move down a line. During playback, this will cancel playback of the current macro,
            " So everything after here is a NOOP

Затем запись неявно останавливается и воспроизводится. Это сгенерирует следующий вывод:

ñ"qPxÉÑ~jHello

Так jкак воспроизведение макроса прервется, ничего Helloне запустится.


2

Python 2, 38 байт

Хотя ввод требуется только для поддержки a-z, он должен работать с любым однострочным вводом, который не содержит байтов NUL.

s='s=%r;print s%%s#'+input();print s%s

Попробуйте онлайн

Для ввода abcполученная квинета:

s='s=%r;print s%%s#abc';print s%s#abc

Попробуйте онлайн


1

RProgN 2 , 15 байт

"{']C'.%q[}]C"F

Разъяснения

Используя формат

{']C'.%q[}]C}

где %qвводится qouted, строится квинат аромата

{']C'."Some Text"[}]C

которая является стандартной RProgN2-квиной, {']C'.}]Cкоторая, прежде чем закончить, добавляет и уничтожает введенную строку.

Попробуйте онлайн!


1

Сетчатка , 14 байт

Количество байтов предполагает кодировку ISO 8859-1.

\(\`^
¶\(*S1`|

Попробуйте онлайн!

Для ввода xэто выводит:


\(*S1`|x
\(*S1`|x

объяснение

Вывод является незначительной модификацией стандартного quine . Мы просто используем регулярное выражение |xвместо пустого регулярного выражения. Поскольку |все еще разрешено (и расставляет приоритеты) и пустое совпадение, на саму функциональность это не влияет, и, поскольку в нем xбудут только буквы, гарантированно будет действительный синтаксис регулярного выражения.

Печать этого на самом деле использует технику, которая похожа на саму квинну. Чтобы избежать дублирования квин, мы вставляем ¶\(*S1`|только один раз в начало строки. Это ровно половина исходного кода. Чтобы напечатать его дважды без перевода строки, мы используем конфигурацию \(\, которая оборачивает всю программу в группу и заставляет как сам этап, так и группу, содержащую ее, печатать результат без перевода строки.


1

Japt , 14 байт

"\"iQ ²ª`"+U ²

Проверьте это онлайн! Для входа abc, выходов

"iQ ²ª`abc"iQ ²ª`abc

который выводит сам. Проверьте это онлайн!

объяснение

Это расширение стандартной строки Japt с поддержкой полезной нагрузки:

"iQ ²"iQ ²

"iQ ²"      // Take this string.  iQ ²
      iQ    // Insert a quote.    "iQ ²
         ²  // Repeat this twice. "iQ ²"iQ ²
            // Implicit: output result of last expression

Разница лишь в том, что мы добавляем ª`abcв конце, что в JavaScript в основном ||"abc". Так как результатом первой части всегда является непустая строка (правда), ||никогда не запускается.

Есть несколько альтернативных версий одинаковой длины:

"iQ ²ª`abc"iQ ²ª`abc   quine||"abc"
"iQ ²ª$abc"iQ ²ª$abc   quine||abc
"iQ ²ª{abc"iQ ²ª{abc   quine||function(){ ... }
"iQ ²ªXabc"iQ ²ªXabc   quine||X.a(...) (X could be any uppercase letter or digit)
"iQ ²//abc"iQ ²//abc   quine//abc      (// is a comment in JS/Japt)
"iQ ²;[abc"iQ ²;[abc   quine;          (unmatched [ causes a parsing error)

0

CJam , 16 14 байтов

"`_~"q`';++`_~

Попробуйте онлайн!

Как это устроено

"`_~"           e# Push "`_~"
     q`         e# Push a string representation of the input (input wrapped in quotes)
       ';       e# Push a semicolon
         ++     e# Concatenate all this together
           `    e# Get the string representation of the resulting string
            _~  e# Duplicate it and eval it (pushing the original string on the stack again)

Который выводит что-то вроде "`_~\"test\";"`_~"test";.



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.