Создайте программу A таким образом, чтобы при ее запуске на языке A создавалась программа B, а при запуске программы A на языке B создавалась программа C.
Программа B при запуске на языке B создает программу A, а при запуске программы B на языке A создается программа C.
Программа C при запуске на языке A или языке B печатает «Неверный язык!».
Program | Language | Result
--------|----------|----------
A | A | Program B
B | B | Program A
A | B | Program C
B | A | Program C
C | A | "Wrong language!"
C | B | "Wrong language!"
Ваш ответ должен использовать этот шаблон:
Язык A / Язык B, {a байтов} + {b байтов} = {всего байтов} байтов
Программа А:
a code
Программа Б:
b code
Программа С:
c code
Источник:
# Language A/Language B, <a bytes> + <b bytes> = <total bytes> bytes
Program A:
a code
Program B:
b code
Program C:
c code
- Ни одна из этих программ не должна принимать данные.
- Разные версии одного и того же языка считаются разными языками. (хотя это не рекомендуется, потому что это приводит к скучным решениям)
- Языки A и B должны быть разными.
- Вы не должны читать свой собственный исходный код из файла. Программы не могут быть пустыми
- Применяются стандартные лазейки.
Советы
- C ++ и [Python / Bash / другие
#
комментируемые языки] являются хорошими комбинациями, потому что вы можете определить макросы, которые один язык может игнорировать
Это код-гольф , поэтому выигрывает наименьшая сумма байтов в программах А и В.
code-golf
quine
code-generation
polyglot
noɥʇʎԀʎzɐɹƆ
источник
источник
Wrong language!
быть выведен в любой форме (т.е. все заглавные буквы, все строчные и т. Д.)?Ответы:
Befunge-98 (PyFunge) / > <> , 123 + 123 =
Программа А:266 250246 байтПопробуйте это в Befunge-98! , Попробуйте в> <>!
Программа Б:Попробуйте это в> <>! , Попробуйте в Befunge-98!
Программа С:Попробуйте это в Befunge-98! Попробуйте это в> <>!
Как это работает:
Вторая строка в обеих программах идентична и выполняет одинаковую функцию для обоих языков. При вводе влево от
<<<<
, он печатает всю вторую строку. При вводе справа от них распечатайте программу C.Когда первая строка запускается не на том языке, она входит в секцию создания программы C. В противном случае он печатает верхнюю строку назад с
"
передней частью и входит во вторую секцию создания строки.Первая строка
Программа А: Программа Б:Вторая линия:
Программа С
источник
JavaScript (ES6) / Python 3, 264 + 258 = 522 байта
Программа А:
Программа Б:
Программа С:
Возможно, гольф ...
Объяснение JavaScript
Программа А:
Программа Б:
Программа С:
Объяснение Python
Программа А:
Программа Б:
Программа С:
источник
Python 3 + JavaScript (Rhino), 171 + 171 = 342 байта
Программа A (выводит программу B на Python 3, программу C на JavaScript; примечание завершается новой строкой):
Программа B (выводит программу A на JavaScript, программу C на Python; примечание завершается новой строкой):
Программа C (выводит «Неверный язык!» На любом языке; также есть завершающий перевод строки, который не учитывается в счете):
Обратите внимание, что я использую необычный диалект JavaScript здесь. Люди обычно используют реализации браузера, но у них есть проблемы с выводом, делая это странным образом (используя
alert
). Я использую пакет Ubuntu,rhino
который представляет собой «автономную» реализацию JavaScript с другим набором библиотек, реализованных в типичном браузере (он задуман как встраиваемый язык сценариев); это примечательно тем, что обеспечиваетprint
оператор в том же стиле, что и, например, Python 3.Это «истинный полиглот» в том смысле, что оба языка выполняют одинаковые вычисления в одинаковом порядке, придавая им одинаковое значение. Они оба имеют один и тот же AST (и довольно просто создать Python 3 + JavaScript с полиглотом через сокращение этой программы). Нет кода, специфичного для одного языка, который помогает мне сократить длину. Кстати, вам нужно использовать Python 3, чтобы использовать точки с запятой для разделения операторов (если вы использовали переводы строки, вам нужно было бы избегать переходов на новую строку).
Программа начинается с определения строк
s
иd
которые удерживают одинарные кавычки и двойные кавычки соответственно. Это позволяет выводить кавычки, не упоминая их позже в исходном коде, избегая проблем с экранированием (которые часто кажутся проблемами с квин; ,Сердцем программы является массив,
r
который содержит основную часть двух программ, используемых в задании; одна из программ (та, которая идет первой в программе A, и вторая в программе B) - это почти quine, которая просто выводит исходную программу посредством объединения частей (взятых в основном изr
себя, с несколькими строковыми литералами), и другие печатает программу C. Чтобы сделать программу не истинной формулой (что не позволило бы обнаружить, что мы работали на неправильном языке), элементыr
печатаются в обратном порядке;r[0]
в программе А находитсяr[1]
в программе Б, и наоборот.Наконец, все, что нужно, это
eval
использовать правильный элементr
. Это достигается с помощью выражения,([11]+[0])[1]
которое создает другое значение в Python 3 и в JavaScript. Оба языка анализируют его одинаково, но у них разные представления о том, что делает дополнение со списками:Когда Python 3 добавляет
[11]
к[0]
, он получает[11, 0]
(объединяет списки), а затем, взяв второй элемент списка ([1]
), дает нам целое число 0.Когда JavaScript добавляет
[11]
к[0]
, он получает"110"
(объединяет строковые представления списков), а затем, принимая второй символ строки ([1]
), дает нам строку"1"
, которую JavaScript очень рад использовать в качестве индекса в списке.Таким образом, Python 3 запускает первый элемент
r
в обеих программах (создание почти-quine при запуске программы A и печать программы C при запуске программы B); JavaScript запускает второй элемент и, таким образом, обрабатывает программу A и программу B противоположным образом.Между прочим, если вы запустите программу A на Ruby, она напечатает программу B, за исключением завершающего перевода строки. Если вы запустите программу B в Ruby, она напечатает программу C, за исключением завершающего перевода строки. Другими словами, это решение почти работает с другим набором языков, заменяя Python 3 на Ruby (единственная причина, по которой я не просто удаляю новую строку из программы B, чтобы получить оценку 341, заключается в том, что несоответствие новой строки в программе C будет дисквалифицировать представление).
(Я работал над «настоящим полиглотом», подобным этому, по другой причине, которую я сейчас опубликовал как вызов, и понял, что методы могут быть адаптированы и к этой.)
источник
<pre><code>...</code></pre>
их, чтобы появиться ."a"[0]
,"a"["0"]
И"a"[[[[[[[["0"]]]]]]]]
все сделать то же самое.C / Python, 733 байта + 733 байта = 1466 байтов
Программа А:
Программа Б:
Программа С:
Я использовал ваш намек на использование C / C ++ с Python. Не очень лаконично, но, по-моему, все еще соответствует требованиям.
источник
Python 2 / Retina, 550 + 645 =
137312541221,1195 байт.Я не совсем уверен , что если
unichr
иreplace
детали могут быть golfed больше. Я пытался использовать Python 3, но многое теряется из-за необходимости добавлять скобки и обрабатывать их. Я попытался установитьR=unicode.replace
и использовать это, но вывод испортился.Обратите внимание, что по умолчанию в Retina есть завершающий символ новой строки, который не включен в программы. Если кто-то говорит, что мне нужно удалить это, это можно сделать тривиально. Кроме того, код Python работает в repl.it, но он не гарантированно работает на Ideone.com.
Также обратите внимание, что начальные и конечные символы новой строки имеют важное значение в коде ниже.
Программа A (Python 2):
638587566550 байт (UTF-8)Python 2 , Retina
Программа B (Retina):
735667655645 байт (ISO 8859-1)Сетчатка , Питон 2
Программа С:
Python 2 , Retina
На самом деле это можно сделать короче, используя
#!`W.*!
вместо двух последних строк, но это делает А и В длиннее, потому что наличие`
в строке, где не было ни одного, означает, что мне нужно обрабатывать это по-другому (потому что первый обратный удар в строке в Retina это разделитель конфигурации).Объяснение:
Программа С:
Сначала я написал Программу C во время первой попытки и оставил ее практически неизменной. В Python он печатает строку и игнорирует комментарий. В Retina он ничего не заменяет,
print"Wrong language!"
а затем удаляет части вокругWrong language!
.Чтобы лучше понять сложные программы, давайте рассмотрим упрощенные версии:
Программа А (упрощенная):
Когда я начал все заново, я использовал
PYTHON
бит в качестве заполнителя для кода, который должен печатать Программу А. Эта более простая версия упростила объяснение того, как будут печататься и Программа В, и Программа С.Все
print
и внутри - это то, что печатает Программу B, но сначала давайте посмотрим, как печатается Программа C, потому что это просто. После того,print"..."
как#|
. Этот трюк спас НАГРУЗКИ от трудностей, которые я испытал в своей первой попытке. Это позволяет Retina ничего не заменять на 2-ю строку, которая будет программой C, за исключением того, что есть#
перед. Последние 2 строки удаляют это первым#
. Я использовал,#{2}
чтобы предотвратить удаление сцены все случаи#
. Я не могу использовать,#1`#
как я использовал в Программе B, потому что это вызывает проблемы с тем, что в первой строке Программы A.Это подводит меня к следующему заданию - распечатка программы B. Возможно, вы заметили другое отличие от реального кода. В самом коде нет обратных галочек, так как я заменил их на вкладки. Я должен был заменить символ, потому что любой обратный удар мог бы сделать предыдущий код строкой конфигурации в Retina, что привело бы к тому, что синтаксис был недействительным. Я выбрал вкладки, потому что они видны, а кодовая точка состоит из одной цифры (
9
). Код печатает Программу B, как показано в упрощенной версии ниже.Программа Б:
Первые две строки ничего не заменят на код Python, но на
#
передний, а некоторые символы немного отличаются. Эта часть опущена для ясности. Следующий этап удаляет это первым#
. Затем я использую этап транслитерации (T) ,#T`²-¹`_o`[^¹]
чтобы отменить некоторые изreplace
операций видели в полной программе А. Используя этот этап является способом вывода буквальный знак абзаца¶
в сетчатке, которые в противном случае могли бы быть impossible.¹ Он заменяет·
с¶
, и³
с²
, Появления¹
останутся такими же, потому что их игнорируют[^¹]
.Программа А:
Новые строки и вкладки были добавлены для удобства чтения.
Это следует общей структуре следующей Python quine:
Когда вы добавляете вещи до или после, вы также должны поместить их в строку.
Я хотел использовать строку с тройными кавычками, чтобы упростить включение кавычек (избегая использования обратной косой черты).
s=U(39)*3;
это строка'''
. Я также использовал%s
вместо%r
, чтобы избежать некоторых проблем с переводом строки или других символов с помощью обратной косой черты.Итак, теперь замены. Первая замена
.replace(U(9),U(96));
заключается в замене вкладок обратными галочками, которые мы видим в Программе B. Эта замена выполняется перед форматированием строки, поскольку вкладки должны оставаться вкладками в Программе А. Другие замены - просто избегать использования определенных символов во 2-й. линия программы B:Эти последние три замены предполагают стадию транслитерации в программе B, чтобы предотвратить удаление или транслитерацию этих символов, когда они не должны быть.
Единственная другая часть кода - это код из Программы B, который по сути копируется символ за символом, за исключением изменений, вызванных заменами.
¹ Благодаря Мартину за его кончик о том , как выводить буквальное
¶
в сетчатке. Это сделало все намного проще.источник
Befunge / Python,
381 + 485259 + 345229 + 304 = 533 байтаПрограмма A: Попробуйте в Befunge | Попробуй в Python
Программа Б: Попробуйте на Python | Попробуй в Befunge
Программа C: попробуйте в Befunge | Попробуй в Python
объяснение
Программа C: Это основано на том факте, что Befunge-93 игнорирует неподдерживаемые инструкции, поэтому, пока
p
безвредно записывают ноль в 0; 0, остальныеprint
игнорируются вплоть до<
инструкции, которая меняет направление. Затем, проходя справа налево,+5+5
помещает 10 (перевод строки) в стек, за которым следует строка сообщения, а затем выполняется стандартная выходная последовательность для записи строки. В Python он просто печатает два строковых литерала, которые объединяются вместе, но первый (содержащий код Befunge) обрезается ссылкой на массив в конце ([+5+5:]
).Программа B: Первая строка - это довольно простая последовательность Befunge для распечатки Программы C. Единственная интересная вещь - это то, как она генерирует символы кавычек с помощью
50g
(т. Е. Читает символ из памяти), что более эффективно, чем вычисление кода ASCII.#>
(Мост через инструкцию направления) является по существу NOP , что препятствует коду быть увиденным Python , поскольку#
это символ комментария Python. Интерпретация Python начинается со второй строки и просто печатает многострочную строку, содержащую исходный код Программы А.Программа A: В Python первые три строки снова игнорируются, потому что они начинаются с
#
, в то время как последняя строка просто печатает Программу C. Код Befunge перемещается взад и вперед через первые три строки, создавая источник для Программы B в стеке. в обратном порядке. Он начинается с трех кавычек, затем последовательности, которая делает копию исходного кода программы А, и, наконец, по сути, представляет собой жестко закодированную строку с открытиемprint """
и первой строкой кода Befunge. Тогда нужно просто записать его со стандартной последовательностью вывода.Некоторые спорные вопросы:
Мне сказали, что квин, использующий
g
команду, не считается подходящим квинем, насколько это сообщество обеспокоено. Я не уверен, применимо ли это правило и к этой проблеме, но если так, то этот ответ также не может считаться правильным решением.Хотя я и сказал, что Befunge-93 игнорирует неподдерживаемые инструкции, это технически не определено в спецификации, и вам нужно будет использовать
-q
(тихую) опцию командной строки в ссылочном интерпретаторе, чтобы избежать предупреждений в программе C. Большинство других интерпретаторов будут хотя все будет хорошо, но некоторые из них могут потерпеть крах. Также обратите внимание, что Befunge-98 отражает неподдерживаемые инструкции, поэтому интерпретатор 98 будет просто зацикливаться бесконечно.источник
-q
флаг на самом деле «довольно», или вы имели в виду «тихий»? Мм-да, этот флаг довольно полезен.r
инструкции eflect и от 0, который былp
в первой ячейкеPerl / JavaScript, 176 байт + 176 байт = 352 байт
Не думаю, что я могу поделиться 52 байтами с базовым механизмом для награды, но мне понравилось строить это. Я думаю, что то, что я произвел, соответствует критериям ...
Программа А:
Программа Б:
Программа С:
объяснение
Использует мой Perl / JavaScript Polyquine в качестве основы, но устанавливает дополнительную переменную,
$P
которая контролирует, какую программу генерировать. Использует проверку, которая+[]
верна в Perl, но ложна в JavaScript.источник