Написать Полихин


33

Полихин - это как квин, так и полиглот. 1 Вы должны написать квинну, которая действительна как минимум на двух разных языках. Это код гольф, поэтому самый короткий ответ (в байтах) выигрывает.

1 Я сделал это. Или, скорее, Geobits сделал . Видимо, он тоже не был первым .

Правила для Quines

Принимаются только настоящие квины. То есть вам нужно вывести весь исходный код дословно в STDOUT без :

  • чтение вашего исходного кода, прямо или косвенно.
  • полагаясь на среду REPL, которая просто оценивает и печатает каждое выражение, которое вы передаете.
  • полагаться на языковые функции, которые в некоторых случаях просто распечатывают источник.
  • используя сообщения об ошибках или STDERR, чтобы написать полностью или частично quine. (Вы можете писать что-то в STDERR или выдавать предупреждения / несмертельные ошибки, если STDOUT является действительным кванем, а сообщения об ошибках не являются его частью.)

Кроме того, ваш код должен содержать строковый литерал.

Правила для полиглотов

Используемые два языка должны быть совершенно разными. Особенно:

  • Они не должны быть разными версиями одного и того же языка (например, Python 2 против Python 3).
  • Они не должны быть разными диалектами одного и того же языка (например, Паскаль против Дельфи).
  • Один язык не может быть подмножеством другого (например, C против C ++).

4
«Ваш код должен содержать строковый литерал» Даже в тех языках, которые не имеют строковых литералов, таких как Brainfuck?
Питер Олсон

@PeterOlson Цель этого правила - избежать нескольких лазеек в языках для игры в гольф (например, в этом ). Поскольку я не могу предвидеть, к чему приведет удаление или ослабление правила (и, поскольку я не фанат изменения правил, если в этом нет крайней необходимости), извините, но представления BF не будут действительны для этой цели. вызов. Если это утешит, подача БФ, скорее всего, не будет конкурентоспособной. ;)
Мартин Эндер

1
"он тоже не первый" ссылки куда?
Эрик Outgolfer

2
C на самом деле не является подмножеством C ++.
MD XF

Считаются ли два разных языка на основе Brainf ** k одним и тем же языком, например Brainf ** k и MOO?
MD XF

Ответы:


14

CJam / GolfScript, 34 байта

{"__X.0#@@?LL
;~"N}__X.0#@@?LL
;~

Счетчик байтов содержит завершающий перевод строки, так как без него программа не была бы quine.

Хотя CJam и GolfScript очень похожи в некоторых аспектах, есть много различий. Чтобы сделать этот «честный» полихин, я решил как можно больше полагаться на различия . За исключением блочного и строкового синтаксиса (который разделяют языки с очень многими другими), ни одна часть кода не достигает абсолютно одинакового в обоих языках.

У онлайн-интерпретатора GolfScript есть ошибка; Эта программа работает только с официальным переводчиком.

Пример запуска

$ cat polyquine
{"__X.0#@@?LL
;~"N}__X.0#@@?LL
;~
$ md5sum polyquine <(cjam polyquine) <(golfscript polyquine)
e2f1f3cd68abbbceec58080513f98d9a  polyquine
e2f1f3cd68abbbceec58080513f98d9a  /dev/fd/63
e2f1f3cd68abbbceec58080513f98d9a  /dev/fd/62

Как это работает (CJam)

" Push that block.                                                                        ";

{"__X.0#@@?LL
;~"N}

" Push two copies of the block, 1 (computed as 1**0) and rotate the block copies on top.  ";

__X.0#@@

" If 1 is truthy (oh, the uncertainty), execute the first copy; else, execute the second.
  Evaluating the block pushes the string it contains; N pushes a linefeed.                ";

?

" Push two empty arrays.                                                                  ";

LL

" Discard one empty array and dump the second.                                            ";

;~

" (implicit) Print all items on the stack.                                                ";

Как это работает (GolfScript)

# Push that block.

{"__X.0#@@?LL
;~"N}

# Push a copy of the block; _ and X are noops, # initiates an inline comment.

__X.0#@@?LL

# Discard the 0 and execute the copy of the block.
# Evaluating the block pushes the string it contains; N is a noop.

;~

# (implicit) Print all items on the stack, followed by a linefeed.

CJam / GolfScript, 12 байт

{"0$~"N}0$~

Обманчивое решение, которое максимально избегает языковых различий.

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

Как это работает (CJam)

 "0$~"       " Push that string.                                                          ";
      N      " Push a linefeed.                                                           ";
{      }0$~  " Push a copy of the block and execute it.                                   ";
             " (implicit) Print the stack.                                                ";

Как это работает (GolfScript)

 "0$~"       # Push that string.
      N      # Undefined token (noop).
{      }0$~  # Push a copy of the block and execute it.
             # (implicit) Print the stack, followed by a linefeed.

14

C # / Java, 746 байт

Я использую свойство, что символы в Java могут быть записаны как идентичные последовательности Юникода. Если у нас есть Aинструкция для компилятора C # и Bинструкция для Java, мы можем использовать следующий фрагмент кода:

//\u000A\u002F\u002A
A//\u002A\u002FB

Это будет "распознано" следующим образом с C #:

//\u000A\u002F\u002A
A//\u002A\u002FB

И следующим образом по Java:

//
/*
A//*/B

Потому что \u000Aэто разрыв строки, \u002Fесть /и \u002Aесть *в Java.

Итак, последний полиглот-квин:

//\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[]a=new int[]{33,94,38,64,35,39,36};String[]b=new String[]{!&!!,!&n!,!&&!,!&@!,!&#!,!&'!,s};for(int i=0;i<7;i++)t=t.//@#'^Replace//'#replace^(!!+(char)a[i],b[i]);//@#'^Console.Write//'#System.out.printf^(t);}}",t=s;int[]a=new int[]{33,94,38,64,35,39,36};String[]b=new String[]{"\"","\n","\\","\\u000A","\\u002F","\\u002A",s};for(int i=0;i<7;i++)t=t.//\u000A\u002F\u002A
Replace//\u002A\u002Freplace
(""+(char)a[i],b[i]);//\u000A\u002F\u002A
Console.Write//\u002A\u002FSystem.out.printf
(t);}}

Однако размер слишком велик из-за многословия языков.

Компиляция доступна на ideone.com: C # , Java .


3
Добро пожаловать в сообщество Programming Puzzles & Code Golf!
Эрик Outgolfer

2
Я знаю, что прошло почти два года, но вы можете играть в гольф 58 байтов. Попробуйте онлайн на Java. и попробуйте это онлайн C # .NET.
Кевин Круйссен

Вы имели в виду 688 байт?
Иван Кочуркин

13

Python 3 и JavaScript, 134 байта

Вот моя (последняя?) Попытка:

a='eval(a.split(" ")[2%-4]),1//2# q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(-8)) print(a[-12:]%a) a=%r;eval(a)';eval(a)

Вероятно, это может быть немного больше, особенно если кто-нибудь знает лучший способ получить одинарные кавычки в JavaScript.


Сложившаяся программа выглядит так:

a='a long string';eval(a)

eval()Функция будет вычислять выражения на обоих языках. Таким образом, выполняется длинная строка:

eval(a.split(" ")[2%-4]),1//2# ... the rest gets commented out

Это разбивает длинную строку на пробелы и оценивает подстроку, проиндексированную 2%-4. JavaScript будет запускать третью substring ( 2 % -4 == 2), а Python - last last ( 2 % -4 == -2), потому что их операторы по модулю ведут себя по-разному для негативов.

Остальная часть строки игнорируется на обоих языках. JavaScript останавливается на //, а Python видит его как целочисленное деление и останавливается на #.

Таким образом, JavaScript выводит исходный код на консоль здесь:

q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(-8))

И Python здесь:

print(a[-12:]%a)

Оба используют последнюю часть строки, которая является шаблоном программы:

a=%r;eval(a)

+1 Golfed его до 140 байт: a='print(a[78:]%a)1q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(82))1a=%r;eval(a.split(1)[0|0=="0"])';eval(a.split(1)[0|0=="0"]). Протестировано в JavaScript, но не в python ... но это должно работать.
soktinpk

@soktinpk Спасибо, но я не думаю, что Python позволит a.split(1).
GRC

1
-8 байт:q=unescape("%27")
Патрик Робертс

8

Ruby / Perl / PHP, 52

$b='$b=%c%s%c;printf$b,39,$b,39;';printf$b,39,$b,39;

Скопировано дословно из Perl quine Кристофера Дурра .

Это правила злоупотребления. Ruby и Perl определенно не являются тем же языком, и при этом Perl не является подмножеством Ruby (например, большинство связанных Perl-квин не работают в Ruby). Но Ruby был разработан, чтобы иметь возможность выглядеть очень похожим на Perl, если вы этого хотите, и это часто случается при игре в гольф.


Может ли это быть сделано для работы (или уже работает) в PHP? Если я правильно читаю документ, вы можете запустить его из командной строки, -Rи вам не нужны теги сценария. php.net/manual/en/features.commandline.options.php
hmatt1

Я бы не назвал это нарушением правил. Поиск квин, который работает на пересечении двух языков, безусловно, является подходящим способом решения этого вопроса. Однако, учитывая, что это не ваша собственная работа, я бы предпочел, чтобы вы отметили ее вики сообщества.
Мартин Эндер

@chilemagic действительно так и есть!
гистократ

@ MartinBüttner готово.
гистократ

6

Bash / GolfScript, 73

.~0 () 
{ 
    declare "-f" @* ".~0" " () 
"+@n.;
    echo '.~0;'
}
.~0;

На каждой из первых трех строк есть пробел.

Bash / GolfScript, 78

alias :a~a.='eval "alias :a~a."\
;set [61 39]+a[39]+n"":a;echo ":a~a."'
:a~a.

5

PHP / Perl - 171

#<?PHP$s=1;$t="";
$a='%s<%cPHP$s=1;$t="";%c$a=%c%s%c;$t==$s?$t="#":$s;printf($a,$t,63,10,39,$a,39,10,63);%c#%c>';$t==$s?$t="#":$s;printf($a,$t,63,10,39,$a,39,10,63);
#?>

Бежать с:

$ php quine.pl
$ perl quine.pl

phpКод на самом деле работает (не только самая печать).


5

Баш / Рубин, 104 82

"tee`#";puts <<a*2+'a'#`" -<<'a';echo a
"tee`#";puts <<a*2+'a'#`" -<<'a';echo a
a

Старая версия:

"alias" "puts=f()(tee -;echo a);f"
puts <<a *2+"a"
"alias" "puts=f()(tee -;echo a);f"
puts <<a *2+"a"
a

Bash / Ruby, 128 без неопределенного поведения

"alias" 'puts=f()(a=`cat`;echo "$a
$a
a");f'
puts <<'a' *2+"a"
"alias" 'puts=f()(a=`cat`;echo "$a
$a
a");f'
puts <<'a' *2+"a"
a

вау, я даже не понимаю, как работает код Ruby: D
Мартин Эндер

@ MartinBüttner <<aв Ruby работает так же, как Bash, но возвращает строку. Я не писал программу на Ruby раньше. Я только что нашел случайный язык с этой функцией.
jimmy23013

Я не знаю, как это работает в bash: P
Мартин Эндер

@ MartinBüttner Это называется heredoc. <<wordвозвращает строку, закрытую строкой с одним word.
jimmy23013

5

reticular / befunge-98, 28 байт [неконкурентный]

<@,+1!',k- ';';Oc'43'q@$;!0"

Попробуйте ретикулярно! Попробуйте befunge 98!

Все, что находится между ;s в befunge, игнорируется и !пропускается в сегмент между ;s для ретикулярной записи. Таким образом, сетчатка видит:

<@,+1!',k- ';';Oc'43'q@$;!0"
<                             move left
                           "  capture string
                          0   push zero
                        ;!    skip `;` (end program)
                       $      drop zero
                     q@       reverse TOS
                 '43'         push 34 (")
                c             convert to char
               O              output all
              ;               end program

Befunge видит:

<@,+1!',k- ';';Oc'43'q@$;!0"
<                            move left
                           " capture string
                         !0  push 1
              ;         ;    skip this
         - ';'               push 27
       ,k                    output top 27 chars
   +1!'                      push 34 (")
  ,                          output "
 @                           end program

4

Ruby / Mathematica, 225 байтов

Вот моя собственная многообещающая полихина (которая служит примером и проверкой концепции):

s="s=%p;puts s%%s;#Print[StringReplace[s,{(f=FromCharacterCode)@{37,112}->ToString@InputForm@s,f@{37,37}->f@37}]]&@1";puts s%s;#Print[StringReplace[s,{(f=FromCharacterCode)@{37,112}->ToString@InputForm@s,f@{37,37}->f@37}]]&@1

Первая часть основана на этой рубиновой квине и в основном:

s="s=%p;puts s%%s;#MathematicaCode";puts s%s;#MathematicaCode

Назначение строк в Mathematica точно такое же. puts s%sИнтерпретируются как произведение 4 символов: putsстрока s, %(последний результат REPL или , Out[0]если это первое выражение вы оцениваете) и другой s. Это, конечно, совершенно бессмысленно, но Mathematica не заботится и ;подавляет любой вывод, так что это просто обрабатывается без вывода сообщений. Затем #делает оставшуюся часть комментария для Ruby, а Mathematica продолжается.

Что касается кода Mathematica, то большая его часть состоит в том, чтобы моделировать обработку строк в формате Ruby без использования строковых литералов. FromCharacterCode@{37,112}есть %pи FromCharacterCode@{37,112}есть %%. Первый заменяется самой строкой, (где InputFormдобавляются кавычки), второй - одиночным %. Результат Printред. Последний улов - как бороться с этим #на фронте. Это символ Mathematica для первого аргумента чистой (анонимной) функции. Итак , что мы делаем, мы сделать все , что в чистой функции путем добавления &и немедленно вызвать функцию с аргументом 1. Предшествующий 1к вызову функции «умножает» результат на1, который Mathematica снова просто проглатывает, независимо от того, какую вещь возвращает функция.


2

> <> и CJam, 165 байт

"~~~~~~~~~~~~~~~~~~~~~~~r00gol?!v93*0.Hi
'                               <       .1*5av!?log10oar~~~r
'"`{"`"\"_~e#.21 <.2+4*96;!?log10oa"}_~e#.21 <.2+4*96;!?log10oa

Для CJam программа начинается с многострочного строкового литерала. Это экранируется `, и затем он использует стандартный quine для печати кода quine, а также завершающий комментарий.

To> <>, первый "запускает строковый литерал, который проходит всю первую строку, помещая каждый символ в стек. После этого завершающие пробелы (созданные из-за дополняемого ввода) удаляются, а затем стек переворачивается. Каждый символ в стеке (т. Е. Весь первый ряд) выводится, а затем он перемещается вниз во второй ряд.

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

Наконец, он переходит на третью строку. Единственное существенное отличие состоит в том, что вы должны пропустить блок CJam, что делается с помощью .одинарной кавычки, которая захватывает всю строку (снова, в обратном направлении), а затем выводится.


2

C / PHP, 266 304 300 282 241 203 + 10 байт

//<?php
function main($a){printf($a="%c//<?php%cfunction main(%ca){printf(%ca=%c%s%c,13,10,36,36,34,%ca,34,36,10,10,10);}%c#if 0%cmain();%c#endif",13,10,36,36,34,$a,34,36,10,10,10);}
#if 0
main();
#endif

+10 байт, потому что для компиляции в C требуется флаг компилятора GCC -Dfunction=.

Как это работает (в PHP):

  • Интерпретатор PHP просто печатает все перед <?phpHTML. //это не комментарий в HTML, поэтому он просто печатается.
  • mainобъявлен как функция с переменной a.
  • printfпечатает возврат каретки (чтобы переопределить уже напечатанный //), а затем исходный код, используя стандартный метод цитирования C / PHP.
  • #if 0 игнорируется PHP.
  • main($a)инициализирует пустую переменную a. (Ранее использовался error_reporting(0)для игнорирования ошибок, вызванных вызовом main())
  • #endif также игнорируется PHP.

Как это работает (в C):

  • //<?php это однострочный комментарий, поэтому он игнорируется.
  • functionКлючевое слово игнорируется в связи с компилятором аргумента командной строки -Dfunction=.
  • GCC и Clang не волнует, начинаются ли переменные с или содержат $. (Это спасло день.)
  • printf печатает возврат каретки (бесполезный в данном случае), а затем исходный код, используя стандартный метод цитирования C / PHP.
  • #if 0игнорирует все до тех пор endif, пока не сможет вызвать PHP main.
  • #endif заканчивает блок "игнорируй меня"

2

Wumpus / > <> / Befunge-98 28 байт

"]#34[~#28&o@,k+deg0 #o#!g00

Попробуйте это в Wumpus! , Попробуйте в> <>! , Попробуйте в Befunge-98!

Как это работает:

Код Wumpus:

  " Start string literal
    Bounce off end of line and come back
  " End string literal
   ] Push top of stack to bottom
    #34 Push double quote
       [~ Get bottom of stack and swap it with the double quote
         #28 Push 28
            &o@ Print the top 28 items on stack and terminate program

> <> Код:

  " Start string literal
    Wrap when it reaches the end of the line
  " End string literal
   ]# Clear stack and reflect
  " Wrapping string literal again, but backwards
                     g00 Get the character from cell 0 (")
                 #o#! Skip into the printing loop
                      Exit with an error

Код Befunge-98:

  " Wrapping string literal
   ] Turn right
   ] Turn right again, going West
  " Wrapping string literal going West
                 !g00 Get double quote and invert it
              #o# Skip over the o instruction
           g0   Get double quote
        +de Push 27
     @,k    Print 27+1 items from the stack and terminate program.

1

05AB1E / 2sable, 14 байтов, неконкурентный

0"D34çý"D34çý

Попробуйте онлайн! (05AB1E)
Попробуйте онлайн! (2sable)

2sable является производным от 05AB1E и аналогичен, но имеет существенные отличия.

Завершающий перевод строки.


1
Я не знаю, каково текущее состояние 2sable и 05AB1E, но в прошлый раз, когда я проверял, я бы посчитал их разными диалектами одного языка.
Мартин Эндер

1

C / TCL, 337 байт

#define set char*f= 
#define F 
#define proc main(){ 
set F "#define set char*f= 
#define F 
#define proc main(){ 
set F %c%s%c; 
proc /* {} {} 
puts -nonewline %cformat %cF 34 %cF 34 91 36 36] 
set a {*/printf(f,34,f,34,91,36,36);} 
"; 
proc /* {} {} 
puts -nonewline [format $F 34 $F 34 91 36 36] 
set a {*/printf(f,34,f,34,91,36,36);} 

1

C / Vim 4.0, 1636 байт

Содержит управляющие символы.

map () {}/*
map g ;data0df"f"cf"
f"cf"
f"D2kyyP;g6k2dd4x5jA"JxA","JxA","jyyPkJxA"jok;g2kdd4xkJx3jdd
map ;g O"vdldd0i# 0# 1# 2# 3# 4# 5# #0lx2lx2lx2lx2lx2lx2lx:s/##/#/g
o:s//"/gk0y2lj02lp"addk@ao:s//\\/gk0ly2lj02lp"addk@ao:s///gk04ly2lj02lp05l"vp"addk@ao:s///gk05ly2lj02lp05l"vp"vp"addk@ao:s//
/gk06ly2lj02lp05l"vp"vp"vp"addk@ao:s//
/gk02ly2lj02lp05l"vp"addk@a
unmap ()

map ;data o*/ char*g[]={"map () {}/*#2map g ;data0df#0f#0cf#0#5#3f#0cf#0#5#3f#0D2kyyP;g6k2dd4x5jA#0#3JxA#0,#0#3JxA#0,#0#3jyyPkJxA#0#3jo#3k;g2kdd4xkJx3jdd#2map ;g O#4#4#4#4#3#0vdldd0i## 0## 1## 2## 3## 4## 5## ###30lx2lx2lx2lx2lx2lx2lx:s/####/##/g#5o:s//#0/g#3k0y2lj02lp#0addk@ao:s//#1#1/g#3k0ly2lj02lp#0addk@ao:s//#4#4#3/g#3k04ly2lj02lp05l#0vp#0addk@ao:s///g#3k05ly2lj02lp05l#0vp#0vp#0addk@ao:s//#4#4#5/g#3k06ly2lj02lp05l#0vp#0vp#0vp#0addk@ao:s//#4#4#5/g#3k02ly2lj02lp05l#0vp#0addk@a#2unmap ()#2#2map ;data o*/ char*g[]={","#A#0#a#0,#0#b#0,#0#c#0#C#2","}; /*#3#2#2#0*/  print(char*s){char*t=s,c,d;while(c=*t++)if(c==35){c=*t++;if(c==35)putchar(c);else if(c==48)putchar(34);else if(c==49)putchar(92);else if(c==50)printf(#0#1n#0);else if(c==51)putchar(27);else if(c==52)putchar(22);else if(c==53)putchar(13);else if(c>64&&c<91)print(g[c-65]);else printf(g[c-97]);}else putchar(c);}  main(){print(g[1]);}"}; /*

"*/  print(char*s){char*t=s,c,d;while(c=*t++)if(c==35){c=*t++;if(c==35)putchar(c);else if(c==48)putchar(34);else if(c==49)putchar(92);else if(c==50)printf("\n");else if(c==51)putchar(27);else if(c==52)putchar(22);else if(c==53)putchar(13);else if(c>64&&c<91)print(g[c-65]);else printf(g[c-97]);}else putchar(c);}  main(){print(g[1]);}

Ваш Vim должен иметь следующий набор:

set noai
set wm=0
set nosi
set tw=0
set nogdefault

1

C / Lisp, 555 байт

t(setq /*;*/){}main(){char q='\"',s='\\';char*a= 
"~%t(setq /*;*/){}main(){char q='~A';char*a= 
~S;char*b=/* 
)(setq a ~S) 
(setq */ ~S;printf(b,s,q,s,s,q,a,q,q,s,s,s,q,s,s,s,s,q,q,b,q/* 
)(format t /* a /* a */);}~%";char*b=/* 
)(setq a "\\\"',s='\\\\") 
(setq */ " 
t(setq /*;*/){}main(){char q='%c%c',s='%c%c';char*a= 
%c%s%c;char*b=/* 
)(setq a %c%c%c%c%c',s='%c%c%c%c%c) 
(setq */ %c%s%c;printf(b,s,q,s,s,q,a,q,q,s,s,s,q,s,s,s,s,q,q,b,q/* 
)(format t /* a /* a */);} 
";printf(b,s,q,s,s,q,a,q,q,s,s,s,q,s,s,s,s,q,q,b,q/* 
)(format t /* a /* a */);} 

Преднамеренно пустая первая строка.


1

Perl / Javascript (SpiderMonkey), 106 байт

$_='$q=+[]?h^O:unescape("%27");print("$_="+$q+$_+$q+";eval($_)"||(q($_),"=$q$_$q;",q(eval($_))))';eval($_)

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

объяснение

Данные Quine хранятся на $_обоих языках и затем evalредактируются, что является довольно стандартной процедурой в Perl. Я выбрал SpiderMonkey на TIO, так как он имеет printфункцию, но ее можно легко перенести в браузер на + 20 байт (добавьте eval("print=alert");в начало $_определения s).

Perl видит данные, хранящиеся в них, $_и видит evalих как обычно. Так как +[]это правда в Perl, 'хранится в $qчерез stringwise-XOR hи O. Последний трюк заключается в вызове того, printгде используется первая часть JavaScript +, которая в Perl обрабатывает все элементы как числа и складывает их 0, затем мы используем ||оператор, чтобы вернуть то, что мы на самом деле хотим, (q($_),"=$q$_$q;",q(eval($_)))что эквивалентно "\$_=$q$_$q;eval(\$_)".

В JavaScript, +[]возвращается 0, поэтому мы называем unescape("%27")хранить 'в $q(к сожалению, atobdoesm't , присутствуют в SpirderMonkey ...). В вызове print, поскольку +в JavaScript есть оператор конкатенации, первый блок создает желаемый вывод, а вторая часть после ||него игнорируется.

Спасибо комментарию Патрика Робертса за unescapeтрюк!


Perl / JavaScript (браузер), 108 байт

$_='eval("q=_=>_+``;printf=console.log");printf(q`$_=%s%s%s;eval($_)`,$q=+[]?h^O:atob("Jw"),$_,$q)';eval($_)

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

$_='eval("q=_=>_+``;printf=console.log");printf(q`$_=%s%s%s;eval($_)`,$q=+[]?h^O:atob("Jw"),$_,$q)';eval($_)

объяснение

Мы храним данные quine $_на обоих языках, а затем evalих, что является довольно стандартной процедурой в Perl.

Perl видит данные, хранящиеся в них, $_и видит evalих как обычно. evalВнутри $_выполнен и не в разбор, но так как это eval, не ошибка. printfЗатем вызывается с единственной строкой в ​​кавычках q(), `в качестве разделителя, так как простое использование `приведет к выполнению команд в оболочке, а затем при первом использовании $q, поскольку +[]это правда в Perl, 'сохраняется в $qчерез stringwise-XOR of hи O.

В JavaScript evalблок внутри $_устанавливает функцию q, которая имеет returnсвой аргумент как a Stringи псевдоним console.logдля printf, так как console.logформатирует строку как printfв Perl. Когда printfвызывается, +[]возвращается 0, поэтому мы вызываем atobдля декодирования 'и сохранения в $q.


1

Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1031 байт

s=1//2;_=r'''<?#/.__id__;s=+0;#';read -d '' q<<'';s=\';Q='echo s=1//2\;_=r$s$s$s\<\?\#/.__id__\;s=+0\;#$s\;read -d $s$s q\<\<$s$s\;s=\\$s\;Q=$s$Q$s\;eval\ \$Q;echo $q';eval $Q
$_='eval("0"?0?"def strtr(s,f,t);s.tr(f,t) end;class String;def chr(n);self+n.chr end;end":"$u=strtr=(s,f,t)=>[...f].reduce((s,a,i)=>s.replace(RegExp(a,`g`),t[i]),s);printf=console.log;(S=String).prototype.chr=function(n){return this+S.fromCharCode(n)}":[]&&"sub strtr{eval q(q(X)=~y/X/X/r)=~s/X/shift/ger}");printf(strtr("%s<?#/.__id__;s=+0;#j;read -d jj q<<jj;s=zj;Q=jecho s=1//2z;_=rksksksz<z?z#/.__id__z;s=+0z;#ksz;read -d ksks qz<z<ksksz;s=zzksz;Q=kskQksz;evalz zkQ;echo kqj;eval kQwk_=j%sj;eval(k_);//;#jjj;f=jjjs=1//2;_=r%%s%%s%%s;f=%%s%%s%%s;q=_[18]*3;print f%%%%(q,_,q,q,f,q)jjj;q=_[18]*3;print f%%(q,_,q,q,f,q)%s","jkwz","".chr(39).chr(36).chr(10).chr(92).chr(92)),[]&&"s=1//2;_=r".chr(39).chr(39).chr(39),$_,$u?"":"".chr(10));';eval($_);//;#''';f='''s=1//2;_=r%s%s%s;f=%s%s%s;q=_[18]*3;print f%%(q,_,q,q,f,q)''';q=_[18]*3;print f%(q,_,q,q,f,q)

Проверьте это онлайн!

Основываясь на моих обновлениях к этому ответу , я решил попробовать оптимизировать код, который печатает другую перестановку, но в итоге добавил Bash, который в любом случае добавил больше байтов. Хотя это более оптимизировано, чем моя первая попытка (сэкономлено более 300 байт), я уверен, что он все еще может быть использован в дальнейшем.


Альтернативный Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1040 байт

s=1//2;_=r'''<?#/.__id__;s=+0;#';read -d '' q<<'';s=\';Q='echo s=1//2\;_=r$s$s$s\<\?\#/.__id__\;s=+0\;#$s\;read -d $s$s q\<\<$s$s\;s=\\$s\;Q=$s$Q$s\;eval\ \$Q;echo $q';eval $Q
$_='$z=0?"$&".next+92 .chr+10 .chr: 0..a||eval("printf=console.log;unescape`$%27%5C%0Ak`");$q=$z[1]?$z[1]:h^O;printf("%s%s%s%s<?#/.__id__;s=+0;#%s;read -d %s%s q<<%s%s;s=%s%s;Q=%secho s=1//2%s;_=r%ss%ss%ss%s<%s?%s#/.__id__%s;s=+0%s;#%ss%s;read -d %ss%ss q%s<%s<%ss%ss%s;s=%s%s%ss%s;Q=%ss%sQ%ss%s;eval%s %s%sQ;echo %sq%s;eval %sQ%s%s_=%s%s%s;eval(%s_);//;#%s%s%s;f=%s%s%ss=1//2;_=r%%s%%s%%s;f=%%s%%s%%s;q=_[18]*3;print f%%%%(q,_,q,q,f,q)%s%s%s;q=_[18]*3;print f%%(q,_,q,q,f,q)%s",[]&&"s=1//2;_=r",$r=[]&&$q,$r,$r,$q,$q,$q,$q,$q,$b=$z[2]?$z[2]:chr(92),$q,$q,$b,$d=$z[0]?$z[0]:h^L,$d,$d,$b,$b,$b,$b,$b,$d,$b,$d,$d,$b,$b,$d,$d,$b,$b,$b,$d,$b,$d,$d,$d,$b,$b,$b,$d,$d,$q,$d,$n=$z[3]?$z[3]:chr(10),$d,$q,$_,$q,$d,$q,$q,$q,$q,$q,$q,$q,$q,$q,$z[4]?"":$n);';eval($_);//;#''';f='''s=1//2;_=r%s%s%s;f=%s%s%s;q=_[18]*3;print f%%(q,_,q,q,f,q)''';q=_[18]*3;print f%(q,_,q,q,f,q)

Проверьте это онлайн!

Немного ближе к моему первоначальному подходу, но повторение аргументов за printfвсе еще безумно. Используя позиционные аргументы , вместо того, чтобы сделать эту работу только в Chrome и сложно заставить работать в PHP , а также потому , что $sв %1$sинтерполирован, но может сэкономить много байт, возможно , используя комбинацию этих двух подходов ...


0

C / dc, 152 байта

z1d//[[z1d//]P91PP93P[dx]Pq 
;main(){char*a="z1d//[[z1d//]P91PP93P[dx]Pq%c;main(){char*a=%c%s%c;printf(a,10,34,a,34);}//]dx";printf(a,10,34,a,34);}//]dx

Воспользовавшись комментариями, да!


0

Perl 5 / Ruby / PHP / JavaScript (браузер), 153 байта

$_='$z=0?"$&".next: 0..a||eval("printf=console.log;atob`JCc`");printf("%s_=%s%s%s;eval(%s_);",$d=$z[0]?$z[0]:h^L,$q=$z[1]?$z[1]:h^O,$_,$q,$d);';eval($_);

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

$_='$z=0?"$&".next: 0..a||eval("printf=console.log;atob`JCc`");printf("%s_=%s%s%s;eval(%s_);",$d=$z[0]?$z[0]:h^L,$q=$z[1]?$z[1]:h^O,$_,$q,$d);';eval($_);

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