CJam, ( 58 56 54 48 46 x 2) * 48% = 44,16
{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~
який друкує
{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~
Непробільні символи в кожному рядку залишаються однаковими між двома взаємними ладами.
Але тепер справді мила частина:
{`"_~"+{_,94\m2/S*a_+\*{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~N/23f/Wf%N*}_`'"#)!*}_~
це королева! :)
Перевірте це тут.
Як це працює
Рекомендую спочатку ознайомитись з поясненнями щодо мого іншого подання, оскільки це загалом пояснює основи квінінгу в CJam.
Цей трохи складніше. Для взаємного quine, як і в іншому випадку, я змінюю представлення рядка блоку, додаючи пробіли перед або після кожного рядка і замінюючи 0 на 2, так що отримана програма ставить пробіли в протилежний кінець.
Зауважте, що пробіли взагалі не впливають на взаємні лайки. У першому вони знаходяться в блоці, який насправді не використовується, а в другому - навколо всього коду.
Щоб отримати звичайну квітку при поєднанні обох, нам потрібно знайти спосіб уникнути внесення всіх цих модифікацій. Зауважте, що структура білого простору та коду означає, що, поєднуючи обидва, ми вставляємо цілість однієї квітки в іншу. Отже, якщо ми помістимо весь код модифікації в блок, ми можемо запустити цей блок залежно від його фактичного вмісту.
Отже, тепер у мене є цей блок ... для взаємних лайків він містить лише код, який я насправді хочу запустити. Для комбінованої квінти вона також містить всю квінку знову, у випадковому положенні, що не має сенсу ... але оскільки це блок, він не запускається автоматично. Таким чином, ми можемо визначити, чи слід змінювати рядок на основі вмісту цього блоку. Ось для чого _`'"#)!
. Він дублює блок, перетворює його в рядок, шукає символу "
(який у взаємних лавах з’являється лише поза блоком) - пошук повертається, -1
якщо символ не знайдено, а додатне ціле число в іншому випадку - збільшує результат і логічно заперечує це. Отже, якщо "
знайдено a, це дає результат, 0
інакше він дає результат 1
. Тепер ми просто робимо*
, який виконує блок один раз, якщо результат був 1, а зовсім не інакше.
Нарешті, ось як працює модифікуючий код:
_,94\m2/S*a_+\*N/23f/Wf%N*
_, "Duplicate the quine string and get its length.";
94\m "Subtract from 94.";
2/ "Divide by two.";
S* "Create a string with that many spaces. This will be
an empty string for the first mutual quine, and contain
23 spaces for the second mutual quine.";
a_+ "Create an array that contains this string twice.";
\* "Join the two copies together with the quine string.";
N/ "Split into lines.";
23f/ "Split each line into halves (23 bytes each).";
Wf% "Reverse the two halves of each line.";
N* "Join with a newline.";
Претензія на винагороду, (12 х 10) * 48% = 57,6
Виявляється, цей код можна легко розділити на кілька рядків за допомогою деяких модифікацій. Додаємо 2 символи, щоб отримати 48 підряд, які потім можна зручно розділити на 8, щоб у нас було 8 рядків із 6 символами коду та 6 пробілами. Для цього нам також потрібно змінити кілька чисел і переставити оператора або двох, щоб вони не розділилися на обидва рядки. Це дає нам працюючу версію розміром 12 х 8 ... одна вимога. Таким чином, ми просто додаємо два рядки, які нічого не роблять (push 1, pop a 1, push 1, pop a 1 ...), тож переходимо до 12 x 10 :
{`"_~"
+{129X
$,m2/S
*a_+\*
N/6f/1
;1;1;1
;1;1;1
;Wf%N*
}_`'"#
)!*}_~
Як і попередній, це виробляє
{`"_~"
+{129X
$,m2/S
*a_+\*
N/6f/1
;1;1;1
;1;1;1
;Wf%N*
}_`'"#
)!*}_~
(Бічна примітка: немає необхідності тримати чергування лівого і правого на проміжних лініях, важливі лише положення першого та останнього рядків. Лівий і правий можна обирати довільно для всіх інших рядків.)
І за чистим збігом обставин повна quine також все ще працює:
{`"_~"{`"_~"
+{129X+{129X
$,m2/S$,m2/S
*a_+\**a_+\*
N/6f/1N/6f/1
;1;1;1;1;1;1
;1;1;1;1;1;1
;Wf%N*;Wf%N*
}_`'"#}_`'"#
)!*}_~)!*}_~
(Я кажу збіг обставин, тому що частина, яка піклується про невиконання внутрішнього коду, зараз дивно перемежовується з іншою лайкою, але все одно виходить добре.)
Коли це було сказано, я міг би лише додати 44 рядки 1;
до мого оригінального подання, щоб виконати вимогу щедрості, але 12 x 10
виглядає набагато акуратніше. ;)
Редагувати: Ха-ха, коли я сказав "чистий збіг", я не міг бути більше на місці. Я роздивився, як працює насправді фінальна квітка, і це абсолютно смішно. Є три вкладені блоки (насправді 4, але внутрішній не має значення). Єдина важлива частина найпотаємнішого з цих 3 блоків - це те, що він містить "
(і не той, який був зроблений в оригінальному поданні, а той самий, '"
який використовується в кінці для перевірки наявності цього самого символу). Отже, основна структура квінки така:
{`"_~"{`"_~"+{___'"___}_`'"#)!*}_~)!*}_~
Розберемо, що:
{`"_~" }_~ "The standard CJam quine.";
{`"_~"+ }_~ "Another CJam quine. Provided it doesn't do
anything in the rest of that block, this
will leave this inner block as a string on
the stack.";
) "Slice the last character off the string.";
! "Negate... this yields 0.";
* "Repeat the string zero times.";
Таким чином, це дійсно робить деякі кумедні магії, але оскільки внутрішній блок залишає одну стежку на стеку, )!*
трапляється перетворювати це в порожній рядок. Єдина умова - це те, що матеріал у внутрішньому блоці після +
цього не робить нічого іншого до стека, тому давайте подивимось на це:
{___'"___} "Push a block which happens to contain
quotes.";
_`'"#)!* "This is from the original code and just
removes the block if it does contain
quotes.";