Печать кусочков полиглота


22

Как правило, полиглоты создаются таким образом, что каждый язык может игнорировать части кода, которые присутствуют для других языков, оборачивая их в строковые литералы, используя синтаксис комментариев или другие подобные трюки.

Ваша цель - написать полиглот, в котором для каждого языка выводится код из полиглота, который производит этот вывод. В частности, выходные данные должны быть построены из кода полиглота только с удалениями, и это должен быть 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на оба языка из-за вышеуказанного правила).
  • Все выходы должны быть максимально короткими. Например, если ваш код был 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

без завершающего перевода строки.

Попробуйте полиглот | Попробуйте квайн.

расщепление

Деление видит только вторую строку, которая является стандартной формой деления, поэтому она печатает

'!+OR"

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

Попробуйте квайн.

Желе

Pilcrow - это псевдоним для перевода строки в Jelly, поэтому источник эквивалентен:

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 for») и печатаем все), выполнение никогда не перемещается из нее, поэтому оно фактически игнорирует остальные код.

Для 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))

Первая строка - no-op, потому что Aне используется никоим образом. Вторая строка задает Sстроку S=%s;console.log(S,uneval(S)), а третья печатает ее после замены %sна unevalпредставление ed S(просто Sзаключенное в кавычки). Результатом является quine в 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заключенным в одинарные кавычки). Результатом является quine в 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квинту Япта, а вторая S- часть квин JS. Однако в 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 - это квинна . Выход> <> - первая строка.

объяснение

Эта программа основана на классическом Quine 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) , Таким образом, мне нужно было изменить жгут Quine следующим образом:

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 pelican, формула> <> #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`
#\`#

Питон , сетчатка

Python:

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 видит:

Все это. Python использует весь код для создания своего quine. Я решил встроить часть quine в строку документации (хотя в конечном итоге это спасло бы байты для удаления, но я думаю, что это круто). Это модификация стандартной техники квиннинга.

Попробуйте онлайн!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.