Как правило, полиглоты создаются таким образом, что каждый язык может игнорировать части кода, которые присутствуют для других языков, оборачивая их в строковые литералы, используя синтаксис комментариев или другие подобные трюки.
Ваша цель - написать полиглот, в котором для каждого языка выводится код из полиглота, который производит этот вывод. В частности, выходные данные должны быть построены из кода полиглота только с удалениями, и это должен быть quine на данном языке.
правила
- Допускаются только правильные кавычки (без чтения исходного кода, без ввода данных, вывод должен быть 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
на оба языка из-за вышеуказанного правила).
- Если у вас есть два языка A и B, которые
- Все выходы должны быть максимально короткими. Например, если ваш код был
print('foo')#something
для Python 3 (игнорируя тот факт, что вывод неправильный), то код, который вам нужно будет выводить, будетprint('foo')
иprint('foo')#
не будет разрешен. Если есть несколько строк одинаковой (минимальной) длины, которые дают правильный вывод, вы можете выбрать любую из них. - Материалы должны быть полиглоты как минимум на 2 языках.
- Ваша оценка будет предоставлена
(number of programming languages with distinct outputs)**3/(total byte size of polyglot)
. Самый высокий балл побеждает. В случае, если две заявки наберут одинаковый балл, победит тот, кто набрал этот балл первым.
Ответы:
GolfScript + CJam + Fission 2 + Jelly , 4 языка, 24 байта, оценка 2,667
Давайте начнем с шестнадцатеричного дампа:
Для GolfScript, CJam и Fission 2 мы интерпретируем это в некоторой ASCII-совместимой однобайтовой кодировке, такой как ISO 8859-1 (точная кодировка на самом деле не имеет значения, потому что языки в любом случае определяют операторы только для символов ASCII):
Где
<DEL>
находится управляющий персонаж0x7f
.В Jelly это предполагается в собственной кодовой странице Jelly, где она выглядит следующим образом:
GolfScript
В
e
последней строке неизвестная переменная#
, которая закомментирует оставшуюся часть строки, поэтомус завершающим переводом строки. Это версия полиглота для GolfScript / CJam:
Попробуйте полиглот. | Попробуйте квайн.
CJam
Здесь,
e#
комментарии в последней строке, так что почти идентично, это печатаетбез завершающего перевода строки.
Попробуйте полиглот | Попробуйте квайн.
расщепление
Деление видит только вторую строку, которая является стандартной формой деления, поэтому она печатает
Я не могу предоставить онлайн ссылку для полиглота здесь, потому что TIO отправляет файл в Fission как UTF-8, но Fission читает исходный байт за байтом, что делает последнюю строку слишком длинной. Однако я проверил это локально с помощью файла в кодировке ISO 8859-1 (длина последней строки которого равна длине второй), чтобы убедиться, что это работает.
Попробуйте квайн.
Желе
Pilcrow - это псевдоним для перевода строки в Jelly, поэтому источник эквивалентен:
Все, кроме последней строки программы Jelly, являются «вспомогательными ссылками» (то есть функциями), которые можно игнорировать, если они не вызваны, при условии, что они синтаксически допустимы. Это на самом деле причина, по которой
3
в программах CJam и GolfScript на первом месте, потому что в противном случае"
они не могут быть проанализированы в Jelly.В противном случае, поскольку функция не вызывается, программа эквивалентна только ее второй строке, которая является стандартной Jelly quine.
Попробуйте полиглот. | Попробуйте квайн.
источник
> <> + Python, 2 языка,
5146 байт, оценка ~ =0,160,17Поскольку ответов пока нет, начну с простого
Попробуйте это для > <> и Python
Для> <> первая строка - это quine (# отражает, «помещает всю строку в стек, затем мы нажимаем 34 (charcode for») и печатаем все), выполнение никогда не перемещается из нее, поэтому оно фактически игнорирует остальные код.
Для Python первая строка - это комментарий, а вторая - quine (стандартный подход в python, использующий подстановку строк с одинаковой строкой в обоих аргументах).
источник
.
! Я адаптировал свою квинну, используя этот подход, хотя я предпочитаю сохранять строку в обратном порядке (поскольку это экономит байты) и избегать ее использованияg
(поскольку ее можно интерпретировать как «чтение исходного кода»)JavaScript + Python 2 + Japt, 3 языка, 132 байта, оценка ~ = 0,205
Это печатает
в JavaScript (только в Firefox),
в Python 2 и
в японии ( Проверьте это онлайн! )
JavaScript
Вот что видит JavaScript:
Первая строка - no-op, потому что
A
не используется никоим образом. Вторая строка задаетS
строкуS=%s;console.log(S,uneval(S))
, а третья печатает ее после замены%s
наuneval
представление edS
(простоS
заключенное в кавычки). Результатом является quine в JavaScript.питон
Это в основном то, что видит Python:
Первая строка в значительной степени не работает; единственная важная часть -
A=1
в конце. Это превращаетсяA
в число, так что целочисленное делениеA//2
во второй строке не выдает ошибку.Вторая строка в основном аналогична, за исключением того, что она устанавливает
S
строкуS=%r;print S%%S
. Третья строка печатаетсяS
после замены%r
необработанным представлениемS
(простоS
заключенным в одинарные кавычки). Результатом является quine в Python 2.Japt
Это код JavaScript, который видит интерпретатор Japt:
Как вы можете видеть, он в основном совпадает с ответом JavaScript, но с одним основным исключением: последние две строки объединяются. В результате это то, что на самом деле видит переводчик:
Первая строка задает
A
квинту Япта, а втораяS
- часть квин JS. Однако в Japt только последнее выражение отправляется на вывод; этоA
, так что выход`i96d)p2`i96d)p2
.источник
uneval
? Не работает для меняДжольф +> <>, оценка = 2 ** 3/15 = 0,533 ....
Работаем над добавлением другого языка к этому.
источник
> <>, Python 2 и 3, 3 языка, 107 байт, оценка = 27/107 ~ = 0,252
Попробуйте онлайн: Python 2 , Python 3 , > <>
Выход Python 3 - это точно вторая строка, а вывод Python 2 - это квинна . Выход> <> - первая строка.
объяснение
Эта программа основана на классическом Quine Python 2:
Во-первых, чтобы сделать его совместимым как с Python 2, так и с Python 3, я изменил
print
оператор на вызов функции и добавил дополнительный пробел, который пригодится позже:Затем мне понадобился способ отличить Python 2 от Python 3. Один из самых простых способов - воспользоваться тем, что
/
в Python 2 делится на целочисленное, а в Python 3 - на деление с плавающей точкой. Таким образом, следующий код оцениваетсяTrue
в Python 2, ноFalse
в Python 3:Для того, чтобы выходные данные были различны между двумя языками, мне нужно было выборочно удалить первую и последнюю скобки в
print
вызове (вот почему мне понадобилось пространство раньше - без пробела, это не было бы допустимымprint
утверждением в Python 2) , Таким образом, мне нужно было изменить жгут Quine следующим образом:Это выражение имеет
a:-a|9
значение0:9
в Python 2 и1:-1
в Python 3. Таким образом,b
это"(_%(_,b))"
в Python 3, но в Python 2 первые и последние символы отбрасываются, оставляя_%(_,b)
. И с этой модификацией полиглот был действительным для этой задачи.Как предложил Teal pelican, формула> <>
#o<}-1:"
можно добавить довольно легко, благодаря тому, что#
в Python начинается однострочный комментарий. Просто добавив его, новая строка добавляет другой язык и увеличивает результат почти в десять раз.источник
Python 2 + Retina, 2 языка, 55 байт, оценка = 2 ^ 3/55 ≈ 0,145
Я использовал
$n
вместо того,¶
чтобы сохранить их оба действительными ASCII.Питон , сетчатка
Python:
Сетчатка:
источник
> <> + Pyke + Python 2, 81 байт, оценка = 3 ** 3/81 ~ 0,333
Я пытался сделать что-то другое со всеми языками.
> <> видит:
Это небольшая модификация стандартной> <> quine для использования строки в тройных кавычках в начале. Это позволяет заключительным тройным кавычкам для Python находиться на другой строке.
Попробуйте онлайн!
Пайк видит:
Я раньше не создавал в Пайке хайва и поэтому должен был подумать об этом. Я использовал традиционные методы квинтинга для создания строки, а затем оценивал ее как вход. Обратите внимание, чтобы это работало без визуального воздействия, предупреждения должны быть отключены. Ошибки с делением на 0 ошибка на этапе генерации.
Попробуй это здесь! Или просто часть Куайн.
Python видит:
Все это. Python использует весь код для создания своего quine. Я решил встроить часть quine в строку документации (хотя в конечном итоге это спасло бы байты для удаления, но я думаю, что это круто). Это модификация стандартной техники квиннинга.
Попробуйте онлайн!
источник