Роздрукуйте квінку, яка містить введення


15

Завдання

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

Ваш вихід повинен бути повноцінною програмою на тій же мові, вихідний код якої містить вхідні дані, і є належною квинтом.

Приклад

Ваша програма отримає вхід abcі вихід:

...abc...

Вищенаведене має бути повноцінною програмою на тій же мові, яка не вимагає введення та виводу:

...abc...

тобто вона виводить себе.

Оцінка балів

Це . Найкоротша відповідь у байтах виграє.

Список літератури


3
Хм .. Тож як "кват" (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'чи будь-яке число, не виправляє це. (Ørjan Johansen).


Дуже креативно використовувати ім’я змінної.
Leaky Nun

3
Не працює для введення "for"чи будь-якого іншого зарезервованого слова в Python.
HyperNeutrino

Можна підтвердити. Він працює не на всіх можливих введеннях. Спробуйте в Інтернеті
mbomb007

@HyperNeutrino, Помітив, також не маю ідеї, як його обійти
c ..

Ви можете додати додатковий символ, який не знаходиться в кінці жодного ключового слова, наприклад 'x'.
Ørjan Johansen

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

Спробуйте в Інтернеті!

Як це працює

Це стандартна Jelly quine. Спочатку,

“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):^ - що саме по собі квіточка.

Як це працює

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

)(Думаю, насправді це не є вкладом.
Rɪᴋᴇʀ

@Riker Правда, Underload, на жаль, не підтримує невідповідні дужки. Але питання вказує a- z.
Ørjan Johansen

Ага, гаразд. Не помічав цього.
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.
Ørjan Johansen

Я навіть не думав просто виконати рядковий літерал, який дає користувач, виходячи з того, що робота програми вже закінчена в цей момент, і не (будучи символом, який з’являється у вході, всі програми обов'язково нічого не зроблять і не впадуть. Я навіть не думаю, що це специфічно для TIO; програма недійсна, але вона вже видала потрібний результат у момент її виходу з ладу.

2

V , 9 байт

ñ"qPxÉÑ~j

Спробуйте в Інтернеті!

Це модифікація стандартної V-квінки , і я пишаюся, що це лише один байт довше.

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вказаний вхід, будує квіточку аромату

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

яка є стандартною ланцюгом RProgN2, {']C'.}]Cяка перед завершенням додає та знищує введений рядок.

Спробуйте в Інтернеті!


1

Сітківка , 14 байт

Кількість байтів передбачає кодування ISO 8859-1.

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

Спробуйте в Інтернеті!

Для введення xдані:


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

Пояснення

Вихід є незначною модифікацією стандартної квінти . Ми просто використовуємо регулярний вимір |xзамість порожнього. Оскільки |все ще дозволяє (і пріоритизує) і порожнє збіг, на саму функціональність не впливає, і з тих пірx буде містити лише букви, гарантовано буде правильним синтаксисом регулярних виразів.

Друк для цього фактично використовує техніку, схожу на саму квіну. Щоб уникнути дублювання quine, ми вставляємо ¶\(*S1`|лише один раз на початок рядка. Це рівно половина вихідного коду. Щоб надрукувати його двічі без передачі рядків, ми використовуємо конфігурацію \(\, яка охоплює всю програму в групі і робить як сам етап, так і групу, що містить його, друкувати результат без рядкового передачі.


1

Japt , 14 байт

"\"iQ ²ª`"+U ²

Перевірте це в Інтернеті! Для введення abc, виходів

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

яка виводить себе. Перевірте це в Інтернеті!

Пояснення

Це розширення стандартної Japt quine, здатної до корисної навантаження:

"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". Оскільки результатом першої частини завжди є не порожній рядок (truthy), то|| ніколи не запускається.

Існує кілька альтернативних версій однакової довжини:

"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.