Метаполіглот квінти


18

У свій час на PPCG я помітив, що проблеми з квітами та проблеми з поліглотом є досить популярними. Також мета-рішення проблем, тобто сценарії, які генерують програму, яка є вирішенням проблеми, як правило, отримують багато позитивних відгуків від громади. Тому я створив цей виклик, який реалізує ці три ідеї.

Тоді ваше завдання, читач і любитель , - створити якомога коротший сценарій, який може працювати двома мовами A і B, щоб генерувати лайки для A і B. Коли ваша програма працює мовою A, вона повинна генерувати програма, яка є лайкою мовою B, але не мовою A і навпаки. Мови A і B можуть бути різними версіями однієї і тієї ж мови, якщо ви пам’ятаєте, що згенеровані quines повинні працювати лише в одній з версій.

Майте на увазі, що стандартні лазівки слід вважати закритими, а дозволені лише належні лайки .

Удачі, найменше перемагає персонажів!


1
Квінка - це в основному мета-мета-мета-мета-мета-мета-мета тощо. програма все
одно

Як підрахувати байти, якщо обидві мови використовують різні кодування символів? Ви, мабуть, повинні забивати символи, а не байти
Луїс Мендо

1
Якщо я запускаю quine мовою A, щоб генерувати quine для мови B, чи слід це виконувати в A?
corvus_192

2
@LuisMendo Коли пишуть поліглот для мов з різними кодуваннями, я вважаю, що вони обидва отримують однаковий потік байтів (не різні кодування одних і тих же символів).
Мартін Ендер

1
@Pavel Я написав подібне виклик тут , але він закрився як дублікат.
Олівер Ні

Відповіді:


5

CJam 0.6.6 dev / GolfScript, 15 14 12 байт

"0$p"0$~a:n;

Дякуємо @ jimmy23013 за те, що виграли на 2 байти!

Відпочинок має бути оновлений.

Перевірка

Оскільки подання передбачає значне пробіли, найкраще порівняти шістнадцяткові.

$ xxd -g 1 mpquine
0000000: 22 60 30 24 7e 22 30 24 7e 4e 4d 3a 6e 3b        "`0$~"0$~NM:n;
$
$ cjam mpquine | tee quine.gs | xxd -g 1
0000000: 22 60 30 24 7e 22 60 30 24 7e 0a                 "`0$~"`0$~.
$ golfscript quine.gs | xxd -g 1
0000000: 22 60 30 24 7e 22 60 30 24 7e 0a                 "`0$~"`0$~.
$ cjam quine.gs | xxd -g 1
0000000: 22 60 30 24 7e 22 60 30 24 7e                    "`0$~"`0$~
$
$ golfscript mpquine | tee quine.cjam | xxd -g 1
0000000: 22 60 30 24 7e 22 60 30 24 7e                    "`0$~"`0$~
$ cjam quine.cjam | xxd -g 1
0000000: 22 60 30 24 7e 22 60 30 24 7e                    "`0$~"`0$~
$ golfscript quine.cjam | xxd -g 1
0000000: 22 60 30 24 7e 22 60 30 24 7e 0a                 "`0$~"`0$~.

CJam

Відбитки CJam "`0$~"0$~та зворотний податок на лінії . Спробуйте в Інтернеті!

Згенерована програма друкує "`0$~"0$~за допомогою трейлінгу linefeed у GolfScript ( Спробуйте його в Інтернеті! ), Але без linefeed у CJam ( Спробуйте в Інтернеті! ).

Як працює метахін

"`0$~"         e# Push that string on the stack.
      0$~      e# Push a copy and evaluate it:
               e#   `     Inspect the string, pushing "\"`0$~\"".
               e#    0$   Push a copy.
               e#      ~  Evaluate, pushing "`0$~".
               e# Both "\"`0$~\"" and "`0$~" are now on the stack.
         NM    e# Push "\n" and "".
           :n; e# Map print over the elements of "" (none) and pop the result.
               e# "\"`0$~\"", "`0$~", and "\n" are now on the stack, and the
               e# characters they represent will be printed implicitly.

Як працює квінта

"`0$~"          # Push that string on the stack.
      0$~       # As in CJam.
         <LF>   # Does nothing.
                # "\"`0$~\"" and "`0$~" are now on the stack, and the characters
                # they represent will be printed implicitly, plus a linefeed.

На відміну від GolfScript, CJam не друкує за замовчуванням зворотний потік рядків, тому це не четверо в CJam.

GolfScript

Відбитки GolfScript "`0$~"0$~, не маючи пробілів. Спробуйте в Інтернеті!

Згенерована програма друкує "`0$~"0$~без обмеження пробілів у CJam ( Спробуйте це в Інтернеті! ), Але GolfScript додає лінійку передач ( Спробуйте в Інтернеті! ).

Як працює метахін

"`0$~"0$~       # As in CJam.
         NM     # Unrecognized token. Does nothing.
           :n   # Store the top of the stack – "`0$~" – in the variable n. n holds
                # "\n" by default. When the program finishes, the interpreter
                # prints n implicitly, usually resulting in a trailing linefeed.
                # By redefining n, it will print "0$~" instead.
             ;  # Pop the string from the stack so it won't be printed twice.

Як працює квінта

"`0$~"0$~      e# Works as in GolfScript.

На відміну від CJam, GolfScript додасть виправлення рядків до вмісту стеку, так що це не quine в GolfScript.


Просто цікаво, в широкому розумінні, в чому різниця між CJam і GolfScript, і чому ваш код працює?
Павло

CJam був сильно натхненний GolfScript і здебільшого сумісний ззаду назад. Одна велика різниця полягає в тому, що GolfScript за замовчуванням додає виведення рядків до виводу, а CJam - ні, що я тут використовую. Я додам детальне пояснення якнайшвидше.
Денніс

1
"0$p"0$~a:n;.
jimmy23013

@ jimmy23013 Приємно, дякую! Я грав з a:n, але використання pмені не прийшло в голову.
Денніс

8

CJam / Fission, 22 байти

"'!+OR'")5-"{'_'~}_~";

Спробуйте в CJam. Спробуйте це у Fission.

У CJam це друкує стандартну квітку Fission :

'!+OR"

Спробуйте квітку Fission.

У Fission це друкує "варіант без стандарту стандартної CJam quine:

{'_'~}_~

Спробуйте CJam quine.

Це також працює для 22 байтів (друкуючи ті самі лайки):

"& *NQ!":)R"{'_'~}_~";

Пояснення

У CJam:

"'!+OR'"    e# Push this string.
)           e# Pull off the last character.
5-          e# Subtract 5, turning ' into ".
"{'_'~}_~"  e# Push this string.
;           e# And discard it again.

Отже в кінці програми стек містить рядок "'!+OR"та символ ", обидва з яких неявно друкуються.

У Fission потік програми починається Rз атома, що рухається справа. '"просто змінює масу атомів ), 5і -з різних причин ігнорується. Тоді атом переходить у режим друку на "і видає друк {'_'~}_~. ;знищує атом і припиняє програму.


4
+1 для смайлика{'_'~}
betseg

5
знищує атом. Я краще не буду десь поруч, коли це станеться
Луїс Мендо

6

Clojure / Common Lisp, 274 байт

(defmacro t []"((fn [s] (print (list s (list (quote quote) s)))) (quote (fn [s] (print (list s (list (quote quote) s))))))")(if '()(print(let[s clojure.string/replace](.toUpperCase(s(s(s(s(s(t)"fn""lambda")"[s]""(s)")"(quote ""'")"e)""e")")))))""))))"))))(eval '(princ(t))))

Додано пробіли для читання

(defmacro t []"((fn [s] (print (list s (list (quote quote) s))))
     (quote (fn [s] (print (list s (list (quote quote) s))))))")
(if '()(print(let[s clojure.string/replace](.toUpperCase
    (s(s(s(s(s(t)"fn""lambda")"[s]""(s)")"(quote ""'")"e)""e")")))))""))))"))))
    (eval '(princ(t))))

В основному визначає макрос, який повертає quine в Clojure. Clojure вимагає параметрів для визначення макросу, що надаються як вектор ( []), тоді як Common Lisp (на щастя) просто ігнорує його. Після цього ми розрізняємо дві мови, оцінюючи, '()що дорівнює nilта, таким чином, фальсифікується у Common Lisp та є trueу Clojure. Тоді ми робимо рядкові маніпуляції за допомогою Clojure, які Common Lisp навіть не намагається оцінити, як це відбувається в іншій ifгалузі. Clojure з іншого боку намагається перевірити, чи є інша гілка принаймні правильною перед виконанням, тому довелося використовувати evalтам, щоб обидва були коректними в Clojure і виводили правильний рядок у Common Lisp.

Примітка: просто повернення двох різних рядків, можливо, може бути коротшим, але тоді це не буде відрізнятись від викликів поліглоту щодо виведення різних рядків на різних мовах. ¯ \ _ (ツ) _ / ¯

Запуск оригінального джерела Clojure: https://ideone.com/SiQhPf

Поширений початковий джерело Lisp: https://ideone.com/huLcty

Клоджурський вихід: ((LAMBDA (S) (PRINT (LIST S (LIST 'QUOTE S)))) '(LAMBDA (S) (PRINT (LIST S (LIST 'QUOTE S)))))

Загальний вихід Lisp: ((fn [s] (print (list s (list (quote quote) s)))) (quote (fn [s] (print (list s (list (quote quote) s))))))

Вихід Clojure у Common Lisp: https://ideone.com/T1DF7H

І навпаки: https://ideone.com/Fezayq


4

Jelly / GolfScript, 18 16 байт

0000000: 3a 6e 22 ff cc cc 22 7d 7f fe 22 3a 6e 60 ff 3b  :n"..."}..":n`.;

Перевірка

Тестування всіх залучених програм точними потоками байтів можна проводити лише локально.

$ LANG=en_US # Latin-1. Jelly doesn't care about the exact encoding,
$            # as longs as it's not UTF-8.
$
$ xxd -g 1 mpquine
0000000: 3a 6e 22 ff cc cc 22 7d 7f fe 22 3a 6e 60 ff 3b  :n"..."}..":n`.;
$
$ jelly f mpquine | tee quine.gs | xxd -g 1
0000000: 22 3a 6e 60 22 3a 6e 60                          ":n`":n`
$ golfscript quine.gs | xxd -g 1
0000000: 22 3a 6e 60 22 3a 6e 60                          ":n`":n`
$ jelly f quine.gs 2> /dev/null | xxd -g 1
$
$ golfscript mpquine | tee quine.jelly | xxd -g 1
0000000: ff cc cc                                         ...
$ jelly f quine.jelly | xxd -g 1
0000000: ff cc cc                                         ...
$ golfscript quine.jelly | xxd -g 1
0000000: 0a

Желе

З кодовою сторінкою Jelly програма виглядає наступним чином.

:n"”ṘṘ"}
“":n`”;

Це відбитки ( спробуйте в Інтернеті! )

":n`":n`

яка є квинтом у GolfScript ( Спробуйте в Інтернеті! ), але помилка розбору в Jelly ( Спробуйте в Інтернеті! ).

GolfScript

На латині-1 програма виглядає так, з недрукованим символом DEL між }і þ.

:n"ÿÌÌ"} þ":n`ÿ;

Це відбитки ( спробуйте в Інтернеті! )

ÿÌÌ

або, візуалізовані на кодовій сторінці Jelly,

”ṘṘ

яка є королевою в Jelly ( Спробуйте це в Інтернеті! ), але друкує тільки подачу ліній у GolfScript ( Спробуйте в Інтернеті! ).


1
Старий добрий ”ṘṘ, таким чином, ØVповинно піти, правда?
Ерік Аутгольфер

3

JavaScript / C 278 байт

На приголомшливих 278 байт:

//\
console.log('int main(){char*A="int main(){char*A=%c%s%c;printf(A,34,A,34);}";printf(A,34,A,34);}');/*
int main(){puts("A='A=;B=String.fromCharCode(39);console.log(A.slice(0,2)+B+A+B+A.slice(2));';B=String.fromCharCode(39);console.log(A.slice(0,2)+B+A+B+A.slice(2));");}//*/

C quine:

int main(){char*A="int main(){char*A=%c%s%c;printf(A,34,A,34);}";printf(A,34,A,34);}

JavaScript quine:

A='A=;B=String.fromCharCode(39);console.log(A.slice(0,2)+B+A+B+A.slice(2));';B=String.fromCharCode(39);console.log(A.slice(0,2)+B+A+B+A.slice(2));


Свята мати цариць ...
MD XF


1

Python / Retina, 70 65 64 66 байт

Я використовував ту саму стратегію, що і в попередньому поліглоті Python / Retina .

#
print"\nS`((.+))"*2+"\n\n"
#?
#_='_=%r;%_\n';_
#?;
#;print _%
#

Спробуйте в Python | Спробуйте в сітківці

#є коментарем у Python, тому він просто надрукує сітківку сітківки в Python. У Retina перший етап (2 рядки) нічого не робить, тому що його немає #у введенні. Наступний етап нічого не замінює основу квітки Python. Третій етап замінює кожну крапку з комою на #print _%шматок. Останній етап видаляє всі #.


Quine в сітківці:


S`((.+))
S`((.+))


Quine в Python:

_='_=%r;print _%%_\n';print _%_

У quines використані можна побачити в цій проблемі . Сітка сітківки є помилкою в Python, а квітка Python не має виводу в сітківці.


Чи можете ви додати пояснення до своєї відповіді про те, як працює метахін?
Павло

@Pavel додав його.
mbomb007

1

Python 3 / Python 2, 62 байти

_='_=%r;print(_%%_['+'~'*-~int(-1/2)+'int(-1/2):])';print(_%_)

Спробуйте в Python 2 , Python 3 .

На основі квітки Python тут . Відмінним фактором між двома версіями є те, що вони роблять int(-1/2): у Python 2 /це ціле ділення (округлення вниз), в результаті -1; в Python 3 - /це поділ з плаваючою комою ( -0.5), який intскорочується 0.

Будуємо рядок _з трьох частин. '_=%r;print(_%%_['і 'int(-1/2):])'завжди однакові. Цікава частина'~'*-~int(-1/2) :

  • У Python 2, -~int(-1/2)є0 , а тильда не додається до рядка;
  • У Python 3, -~int(-1/2)є1 , а тильда додається до рядка.

Таким чином, Python 2 виводить Python 3 quine

_='_=%r;print(_%%_[int(-1/2):])';print(_%_[int(-1/2):])

і Python 3 виводить Quine Python 2

_='_=%r;print(_%%_[~int(-1/2):])';print(_%_[~int(-1/2):])

У кожній версії вираз всередині [ :]оцінюється до 0, що змушує фрагмент включати всю рядок, тоді як у неправильній мові, яку він оцінює -1, змушує фрагмент включати лише останній символ, обрізання виводу, тому він не є повною ланкою.


1

Brain-Flak , мозковий ебать 4617 4009 байт

((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()()()())))()())[()()])))()()())[()()])))())[()])[()()()()])))))))))))))))))))))))))))))))))))))))))))()()())()())[()()()()])()()())[()()])()())[()()()()])()()()))()()())[()()])[()()()()])))))))))))))))))))()())))()()())[()()()()])()()()()())[()()]))()())[()()()])()())[()()])))()()())[()()])))())[()()])[()()()])))))))))))))))))))))))))))))))))))))))))))()()()())[()()()])()()()())[()()])[()()()]))()()()())[()()()])()()()())[()()])[()()()])()()()())[()()()])()()()())[()()])[()()()]))))))))))))))()()()())[()()()])()()()())[()()])[()()()]))()()()())[()()()])()()()())[()()])[()()()])))))))))))))))))))))))))))))()()()())[()()()])()()()())[()()])[()()()]))()()()())[()()()])()()()()()))))))[()()()])[()])()()))))()()){({}<>)<>}<>([]){({}[()]<(({}[()]<((((((()()()){}())){}{}){}())<>)>)<>){({}[()]<({}()())>){({}[()]<({}())>){({}[()]<({}((()()()){}()){})>){({}[()]<({}()())>){({}[()]<({}(((()()()){}()){}){}())>){(<{}({}()())>)}}}}}}{}([]<({}<{({}<>)<>}<>>)>){({}[()]<({}<>)<>>)}{}{({}[()]<(({}))>)}{}(((({})(((()()())){}{}){}())))<>>)}{}{<>({}<>)}{+++++++>>>+>>>+++++++>>>++++++++>>>+++>>>++++>>>++>>>+++>>>++++>>>++++++++>>>+++>>>++++>>>+>>>+++++>>>++++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+>>>+>>>+>>>+>>>+>>>+>>>+>>>+>>>++>>>+>>>++>>>+>>>++>>>+>>>++>>>+>>>++>>>++>>>+++++++>>>++++++++>>>++>>>+++++++>>>++++++++>>>++>>>+++++++>>>++++++++>>>++>>>+++>>>++++>>>++>>>++>>>+>>>++>>>++>>>++>>>++++>>>++>>>+++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+>>>++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+>>>+>>>+>>>+>>>++>>>+>>>++>>>+>>>++>>>++>>>++>>>+++++++>>>++++++++>>>+++++++>>>++++++++>>>++>>>+++++++>>>++++++++>>>+>>>++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+>>>++>>>+>>>++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+>>>+>>>+>>>+>>>++>>>+>>>++>>>+>>>++>>>++>>>+++++++>>>++++++++>>>+>>>++>>>++>>>+++++++>>>++++++++>>>++>>>+++++++>>>++++++++>>>+>>>++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+>>>++>>>+>>>++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+>>>+>>>+>>>+>>>++>>>+>>>++>>>+>>>++>>>+>>>++>>>+>>>++>>>++>>>++>>>+++++++>>>++++++++>>>+++++++>>>++++++++>>>++>>>+++++++>>>++++++++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++>>>+++++++>>>++++++++>>>+>>>+++++++>>>++++++++>>>+>>>++>>>+>>>++>>>++>>>++++>>>++>>>++++++++>>>++++++++>>>++++++++>>>++++++++>>>++++++++>>>++++++++>>>++++++++>>>+++++++>>>++++++++>>>+>>>+++++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++>>>++++>>>++>>>+++>>>++++>>>++++++++>>>+++>>>++++>>>++++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+++>>>++++>>>++>>>+++>>>++++>>>++++>>>++>>>++++++++>>>+++++++>>>++++++++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>++>>>+>>>++>>>++>>>++>>>++++>>>++>>>++++++++>>>+++++++>>>++++++++>>>+++>>>++++>>>++++>>>++>>>++++++++>>>+++++++>>>++++++++>>>+++>>>++++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++>>>++++>>>++>>>+++>>>++++>>>++++++++>>>+++>>>++++>>><<<[<<<]>>>[>++++++++++++++++++++++++++++++++++++++++.<[->.+.->+<<]>+.[-]>>]<[<<<]>>>[<++++++++++++++++++++++++++++++++++++++++>-[<+>-[<+++++++++++++++++++>-[<++>-[<+++++++++++++++++++++++++++++>-[<++>-[<++++++++++++++++++++++++++++++>-[<++>-]]]]]]]<.>>>>]}{}

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

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

Пояснення на шляху, я все ще займаюся цим


Це породжує мозгову лайку в мозковій ебаті, а мозгову-лайкову - у Мозговий Флак. Він повинен генерувати мозкову лайку при запуску в Brain-Flak і Brain-Flak Quine при запуску в мозковий ебать.
Павло

Я зроблю це ще раз. Вибачте, що мені просто важко слідувати за As і Bs
Post Rock Garf Hunter
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.