Написать «palipolyquine»: программа , которая является Куайн , а полиглот , и палиндром .
Правила:
- Количество языков полиглотов предпочтительнее, чем размер кода.
- Самый короткий ответ (в байтах) выигрывает в случае ничьей.
- Правила Polyglot и Quine см. Здесь: Напишите Polyquine .
Мой пример (у меня есть репозиторий Freaky-Sources с тестами):
C # / Java (1747 байт):
/**///\u000A\u002F\u002A
using System;//\u002A\u002F
class Program{public static void//\u000A\u002F\u002A
Main//\u002A\u002Fmain
(String[]z){String s="`**?`@#_^using System;?_#^class Program{public static void?@#_^Main?_#main^(String[]z){String s=!$!,t=s;int i;int[]a=new int[]{33,94,38,64,35,95,96,63,36};String[]b=new String[]{!&!!,!&n!,!&&!,!&@!,!&#!,!&_!,!`!,!?!,s};for(i=0;i<9;i++)t=t.?@#_^Replace?_#replace^(!!+(char)a[i],b[i]);t+='*';for(i=872;i>=0;i--)t=t+t?@#_^[i];Console.Write?_#.charAt(i);System.out.printf^(t);}}/",t=s;int i;int[]a=new int[]{33,94,38,64,35,95,96,63,36};String[]b=new String[]{"\"","\n","\\","\\u000A","\\u002F","\\u002A","/","//",s};for(i=0;i<9;i++)t=t.//\u000A\u002F\u002A
Replace//\u002A\u002Freplace
(""+(char)a[i],b[i]);t+='*';for(i=872;i>=0;i--)t=t+t//\u000A\u002F\u002A
[i];Console.Write//\u002A\u002F.charAt(i);System.out.printf
(t);}}/*/}};)t(
ftnirp.tuo.metsyS;)i(tArahc.F200u\A200u\//etirW.elosnoC;]i[
A200u\F200u\A000u\//t+t=t)--i;0=>i;278=i(rof;'*'=+t;)]i[b,]i[a)rahc(+""(
ecalperF200u\A200u\//ecalpeR
A200u\F200u\A000u\//.t=t)++i;9<i;0=i(rof;}s,"//","/","A200u\\","F200u\\","A000u\\","\\","n\",""\"{][gnirtS wen=b][gnirtS;}63,36,69,59,53,46,83,49,33{][tni wen=a][tni;i tni;s=t,"/}};)t(^ftnirp.tuo.metsyS;)i(tArahc.#_?etirW.elosnoC;]i[^_#@?t+t=t)--i;0=>i;278=i(rof;'*'=+t;)]i[b,]i[a)rahc(+!!(^ecalper#_?ecalpeR^_#@?.t=t)++i;9<i;0=i(rof;}s,!?!,!`!,!_&!,!#&!,!@&!,!&&!,!n&!,!!&!{][gnirtS wen=b][gnirtS;}63,36,69,59,53,46,83,49,33{][tni wen=a][tni;i tni;s=t,!$!=s gnirtS{)z][gnirtS(^niam#_?niaM^_#@?diov citats cilbup{margorP ssalc^#_?;metsyS gnisu^_#@`?**`"=s gnirtS{)z][gnirtS(
niamF200u\A200u\//niaM
A200u\F200u\A000u\//diov citats cilbup{margorP ssalc
F200u\A200u\//;metsyS gnisu
A200u\F200u\A000u\///**/
code-challenge
quine
palindrome
polyglot
Иван Кочуркин
источник
источник
1
(которое будет выводиться здесь1
на многих языках и является палиндромным).Ответы:
CJam / GolfScript , 2 языка, 50 байтов
Попробуй CJam! Попробуйте это в GolfScript!
Да, это осталось без ответа на удивление долго.
объяснение
Вероятно, это проще всего объяснить, показав, как я превратил основную квин на каждом языке в палиндромную полиглоту.
Итак, основные квинусы на обоих языках:
В GolfScript и CJam соответственно. Они очень похожи, благодаря тому, что CJam изначально был вдохновлен GolfScript (но с тех пор сильно изменился). Первое отличие, которое мы замечаем, состоит в том, что один использует
.
для дублирования вершины стека, а другой использует_
. Обычный прием, позволяющий избежать этой проблемы, заключается в использовании0$
, поскольку оба языка имеют оператор «копировать-n-элемент-на-стеке»$
. Таким образом, мы получаем{"0$~"}0$~
, хотя для этого все еще нужен завершающий перевод строки в GolfScript. Но давайте позаботимся об этом в конце.Во-первых, нам нужно сделать это палиндромом. Очевидное решение этого - добавить комментарий и поместить туда исходный код в обратном порядке. Это довольно просто, потому что CJam использует
e#
для комментариев, а в GolfScripte
вообще ничего не делает и#
является комментарием. Так что, если мы добавим,e#...
что работает для обоих языков. Вот что у нас есть:Конечно, это на самом деле не печатать часть
e#
вперед. Мы можем восстановить это довольно легко из самого исходного кода. Оба языка могут превратить начальный блок в строку с`
и добавить"0$~"
часть+
, так что мы получаем весь исходный код без зеркального отражения в одной строке. Чтобы добавить зеркальную копию, все, что нам нужно сделать, это0$
снова продублировать строку, а затем перевернуть ее-1%
, что также работает на обоих языках. Итак, теперь у нас есть это:Это действительная палиндромная квинна в CJam, и она также работает в GolfScript, но все еще печатает этот отвратительный конечный перевод строки.
Обычный способ предотвратить это - присвоить пустую строку
n
, потому что на самом деле GolfScript печатает содержимоеn
в конце. Так что нам нужно"":n
. Так что насчет CJam? К счастью, это ничего не делает.""
также является пустой строкой (или пустым списком, это то же самое в CJam) и:
отображает операторn
(печать с переводом строки) поверх списка. Но поскольку список пуст, отображение оператора на него вообще ничего не делает. Следовательно, мы можем избавиться от перевода строки, не связываясь с CJam, и в итоге получить окончательное решение:источник
Perl 5 / Ruby / PHP / JavaScript (браузер), 4 языка, 513 байт
Попробуйте Perl онлайн!
Попробуйте онлайн!
Попробуйте PHP онлайн!
Подтвердите это онлайн!
источник