Друкувати шматки поліглоту


22

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

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

Правила

  • Дозволені лише належні лайки (жодне зчитування вихідного коду, не приймаючи введення, вихід повинен бути STDOUT або найближчою альтернативою, якщо STDOUT не є опцією, а програми повинні складатися з більш ніж просто літералів, які друкуються неявно).
  • Оскільки різні мови можуть використовувати різні кодування, то тут важливі необроблені байти. Наприклад, якщо мова A використовує UTF-8, а мова B використовує CP437, (шістнадцятковий) код C3 88 46 47буде ÈFGдля мови A і ├êFGдля мови B.
  • Усі результати повинні бути чіткими (знову ж таки, порівнюючи необроблені байти). Це дозволяє уникнути ускладнень при спробі обмежити незначні мовні версії - якщо дві мови використовують одну й ту саму частину коду, щоб зробити те саме, ви не можете вимагати їх обох.
    • Якщо у вас є дві мови A і B, які XYє дійсним результатом для обох, але YZтакож є дійсним у B, ви можете вибрати XYяк вихід для A і YZяк вихід для B, так що ви можете вимагати їх обох у своєму рахунку ( але ви не можете претендувати XYна обидві мови через вищезазначене правило).
  • Всі виходи повинні бути максимально короткими. Наприклад, якби ваш код був print('foo')#somethingдля Python 3 (ігноруючи той факт, що вихідний результат невірний), код, який потрібно було б вивести, був би print('foo')і print('foo')#не був дозволений. Якщо є кілька рядків однакової (мінімальної) довжини, які дають правильний вихід, ви можете вибрати будь-який з них.
  • Подання повинні бути поліглотами принаймні на 2 мовах.
  • Ваша оцінка буде надана о (number of programming languages with distinct outputs)**3/(total byte size of polyglot). Виграє найвищий бал. У випадку, якщо два подання досягнуть однакового балу, виграє подання, яке вперше досягло цього бала.

2
Друге за останнім правилом звучить так, що нам потрібно довести, що далі неможливо переграти отриману квіточку будь-яким іншим можливим набором видалень. Це навмисно?
Мартін Ендер


Як ви визначаєте "видалення" у випадку мови, команди якої не мають 8 біт? Чи видаляєте ви з джерела команду за один раз або байт за раз?

@MartinEnder Можна припустити добросовісність. Якщо хтось не знайде коротшу квітку, яку можна сформувати з поліглоту, відповідь вважається достовірною.
Мего

@ ais523 Все робиться на рівні байтів.
Мего

Відповіді:


11

GolfScript + CJam + Fission 2 + Jelly , 4 мови, 24 байти, оцінка 2,667

Почнемо з шестнадцяткового дампа:

00000000:  3322 3024 700a 2721 2b4f 5222 0a3c 3024 700a 6523 7fff cccc

Для GolfScript, CJam та Fission 2 ми інтерпретуємо це у деяких сумісних ASCII однобайтових кодуваннях, таких як ISO 8859-1 (точне кодування насправді не має значення, оскільки мови в будь-якому випадку визначають лише оператори для символів ASCII):

3"0$p
'!+OR"
<0$p
e#<DEL>ÿÌÌ

Де <DEL>контрольний символ 0x7f.

У Jelly це передбачається на власній кодовій сторінці Jelly, де вона замість цього виглядає так:

3"0$p½'!+OR"½<0$p½e#¶”ṘṘ

GolfScript

eНа останній рядок змінних невідомі і #коментарі з решти рядки, так що відбитки

"0$p"
0$p

із заднім рядком. Це поліглот-версія GolfScript / CJam стандартної лайки:

".p"
.p

Спробуйте поліглот. | Спробуйте квінт.

CJam

Тут e#коментується останній рядок, так що майже ідентично це друкується

"0$p"
0$p

без зворотного каналу.

Спробуйте поліглот | Спробуйте квінт.

Ділення

Fission бачить лише другий рядок, який є стандартним Fission quine, тому він друкує

'!+OR"

Я не можу надати тут онлайн-посилання для поліглоту, оскільки TIO надсилає файл у Fission як UTF-8, але Fission зчитує вихідний байт за байтом, що робить останній рядок занадто довгим. Однак я перевірив це локально за допомогою закодованого файлу ISO 8859-1 (у якому останній рядок має ту саму довжину, що й другий), щоб підтвердити, що це працює.

Спробуйте хінну.

Желе

Стовпчик - псевдонім для годівниць в Желе, тому джерело еквівалентно:

3"0$p½'!+OR"½<0$p½e#
”ṘṘ

Усі, крім останнього рядка програми Jelly, - це "допоміжні посилання" (тобто функції), які можна ігнорувати, якщо вони не викликаються, за умови, що вони синтаксично дійсні. Це насправді причина, що 3вперше вступає в програми CJam і GolfScript, оскільки в іншому випадку "неможливо розібрати в Jelly.

Інакше, оскільки функція не викликається, програма еквівалентна лише її другому рядку, який є стандартним Jelly quine.

Спробуйте поліглот. | Спробуйте квінт.


9

> <> + Python, 2 мови, 51 46 байт, оцінка ~ = 0,16 0,17

Оскільки відповіді ще немає, я розпочну з простої

#.09;!?lo}*2+2f"
_='_=%r;print _%%_';print _%_

Спробуйте для <<> та Python

Для> <> перший рядок є quine (# відображає, "кладе весь рядок у стек, потім ми натискаємо 34 (charcode для") і друкуємо все), виконання ніколи не рухається від нього, тому він ефективно ігнорує решту кодекс.

Для Python перший рядок - це коментар, а другий - quine (стандартний підхід у python, використовуючи підстановку рядків тим же рядком, що і обидва аргументи).


1
Незначна адаптація на відповідь> <> може заощадити кілька байт: - # "~ r10gol?!; 60. |!
Teal pelican

@Tealpelican Дякую, що нагадали мені про використання .! Я адаптував свою квітку, використовуючи цей підхід, хоча я вважаю за краще тримати рядок у зворотному порядку (оскільки це економить байти) та уникати використання g(оскільки це можна інтерпретувати як "читання вихідного коду")
Лев

Це досить справедливий момент, коли не використовується g. Подивившись і трохи поміркувавши про це, ви можете ще більше зменшити його, скориставшись # (ascii 35) зі стека, щоб отримати "like; # .09;!? Lo} -1"
Teal pelican

7

JavaScript + Python 2 + Japt, 3 мови, 132 байти, оцінка ~ = 0.205

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S";"""
console.log(S,uneval(S))//""";print S%S

Це відбитки

S="S=%s;console.log(S,uneval(S))";console.log(S,uneval(S))

у JavaScript (лише у Firefox),

S='S=%r;print S%%S';print S%S

в Python 2 та

`i96d)p2`i96d)p2

в Япті. ( Перевірте це в Інтернеті! )

JavaScript

Ось що бачить JavaScript:

A="`i96d)p2`i96d)p2";1
S="S=%s;console.log(S,uneval(S))";A
console.log(S,uneval(S))

Перший рядок - неоперативний, оскільки Aне використовується жодним чином. Другий рядок встановлюється Sна рядок S=%s;console.log(S,uneval(S)), а третій друкує його після заміни %sна unevaled-представлення S(просто Sзагорнуте в лапки). Результат - це лайка в JavaScript.

Пітон

Це в основному те, що бачить Python:

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S"
print S%S

Перший рядок - майже неоперативний; Єдина важлива частина - A=1це кінець. Це перетворюється Aна число, так що ціле ділення A//2на другому рядку не видає помилки.

Другий рядок здебільшого однаковий, за винятком того, що він задається Sна рядок S=%r;print S%%S. Третій рядок друкується Sпісля заміни на %rнеоброблене подання S(просто Sзагорнуте в одинарні лапки). Результат - квінт у Python 2.

Japt

Це код JavaScript, який бачить інтерпретатор Japt:

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S";"","\nconsole.log(S,uneval(S))//","";.p("r".i("n".t(),S%S))

Як бачите, це здебільшого те саме, що відповідь на JavaScript, за одним головним винятком: останні два рядки поєднуються. Як результат, ось що насправді бачить перекладач:

A="`i96d)p2`i96d)p2";1
S="S=%s;console.log(S,uneval(S))";A

Перший рядок встановлюється Aна квітку Japt, а другий - Sна частину JS quine. Однак у Japt виводиться лише останній вираз; це A, значить, вихід є `i96d)p2`i96d)p2.


Що таке uneval? Не працює для мене
Cyoce

@Cyoce developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Однак він працює лише у Firefox.
ETHproductions

3

Джольф +> <>, оцінка = 2 ** 3/15 = 0,533 ....

"r0:g>o<
"Q«Q«

Робота над додаванням до цього іншої мови.


2

> <>, Python 2 і 3, 3 мови, 107 байт, оцінка = 27/107 ~ = 0,252

#o<}-1:"
a=1/1is 1;b="(_%(_,b))"[a:-a|9];_='a=1/1is 1;b="(_%%(_,b))"[a:-a|9];_=%r;print %s';print (_%(_,b))

Спробуйте в Інтернеті: Python 2 , Python 3 , > <>

Вихід Python 3 - це другий рядок, а вихід Python 2 - це ця квітка . Вихід> <> - це перший рядок.

Пояснення

Ця програма заснована на класичній квіті Python 2:

_='_=%r;print _%%_';print _%_

По-перше, щоб зробити його сумісним і з Python 2, і з Python 3, я змінив printоператор на виклик функції та додав додатковий простір, який згодом стане у нагоді:

_='_=%r;print (_%%_)';print (_%_)

Далі мені знадобився спосіб відрізнити Python 2 від Python 3. Одним з найпростіших способів є скористатися тим фактом, що /це ціле ділення в Python 2, але поплавковий поділ у Python 3. Таким чином, наступний код оцінюється Trueв Python 2, але Falseв Python 3:

1/1is 1

Для того, щоб виводи відрізнялися між двома мовами, мені потрібно було вибірково видалити першу та останню дужки у printвиклику (саме тому мені знадобився пробіл раніше - не маючи місця, це не було б дійсним printтвердженням у Python 2) . Таким чином, мені потрібно було модифікувати джгути так:

a=1/1is 1;b="(_%(_,b))"[a:-a|9];_='a=1/1is 1;b="(_%%(_,b))"[a:-a|9];_=%r;print %s';print (_%(_,b))

Цей вираз a:-a|9оцінюється як 0:9в Python 2, так і 1:-1в Python 3. Таким чином, bє "(_%(_,b))"в Python 3, але в Python 2 перший і останній символи відкидаються, залишаючи _%(_,b). І з цією модифікацією поліглот був дійсним для цього виклику.

За пропозицією Пелікана Teal, <> quine #o<}-1:"можна було додати досить легко, завдяки тому, що #починається однорядковий коментар у Python. Просто попередньо додавши його, а новий рядок додає іншу мову і збільшує бал майже вдесятеро.


1

Python 2 + Retina, 2 мови, 55 байт, оцінка = 2 ^ 3/55 ≈ 0,145

Я використовував $nзамість того, щоб тримати їх обох дійсних ASCII.

S='S=%r;print S%%S';print S%S#|
#$n\(*S1`$n\(*S1`
#\`#

Пітон , Сітківка

Пітон:

S='S=%r;print S%%S';print S%S

Сітківка:


\(*S1`
\(*S1`

0

> <> + Pyke + Python 2, 81 байт, оцінка = 3 ** 3/81 ~ 0,333

"""r00gol?!;60.
a=%r;print a%%a"""#);"34.Cp\D\Es"DEp00/
a=__doc__[-15:]
print a%a

Я намагався зробити щось інше з усіма мовами.

> <> бачить:

"""r00gol?!;60.

Це невелика модифікація стандартного> <> quine для використання потрійного цитованого рядка на початку. Це дозволяє закінчувати потрійні лапки для Python в іншому рядку.

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

Пайк бачить:

"34.Cp\D\Es"DEp00/

Раніше я не створював лайку в Пайке, і тому довелося придумати її. Я використовував традиційні методи квінінгу, щоб створити рядок, а потім зрівняти його із собою як вхід. Зауважте, щоб це працювало без візуального впливу, попередження доведеться вимкнути. Помилки з поділом на 0 помилки на етапі генерації.

Спробуйте тут! Або просто частину квінта.

Пітон бачить:

Все це. Python використовує весь код для створення своєї quine. Я вирішив вставити частину quine в docstring (хоча в кінцевому рахунку це дозволить заощадити байти, але я думаю, що це круто). Це модифікація стандартної техніки квінінгу.

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

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