Напишіть Поліхін


33

Поліхін є і хином, і поліглотом. 1 Ви повинні написати квинку, яка діє як мінімум для двох різних мов. Це кодовий гольф, тому найкоротша відповідь (у байтах) виграє.

1 Я це вигадав. А точніше, зробив Геобіт . Мабуть, він і не був першим .

Правила для Quines

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

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

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

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

Дві використовувані мови повинні бути чітко різними. Зокрема:

  • Вони не повинні бути різними версіями однієї мови (наприклад, Python 2 проти Python 3).
  • Вони не повинні бути різними діалектами однієї мови (наприклад, Pascal vs. Delphi).
  • Одна мова не може бути підмножиною іншої (наприклад, C проти C ++).

4
"Ваш код повинен містити рядковий літерал" Навіть у мовах, які не мають рядкових літералів, наприклад, Brainfuck?
Пітер Олсон

@PeterOlson Метою цього правила є уникнення декількох лазів на мовах, що стосуються гольфу (наприклад, ця ). Оскільки я не можу передбачити, до чого призведе видалення або ослаблення правила (і оскільки я не прихильник зміни правил, якщо це абсолютно не потрібно), пробачте, але подання BF не буде дійсним для цієї мети виклик. Якщо це будь-яке втіху, подання BF, швидше за все, не буде конкурентоспроможним. ;)
Мартін Ендер

1
"він не був першим" посилання на куди?
Ерік Аутгольфер

2
C насправді не є підмножиною C ++.
MD XF

Дві різні мови на основі Brainf ** k вважаються однією і тією ж мовою, як Brainf ** k та MOO?
MD XF

Відповіді:


14

CJam / GolfScript, 34 байти

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

Кількість байтів містить зворотний канал, оскільки програма не була б без нього.

Хоча 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 можуть бути записані як ідентичні послідовності unicode. Якщо у нас є 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
Ласкаво просимо до спільноти Головоломки програмування та коду для гольфу!
Ерік Аутгольфер

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 запустить третю підрядку ( 2 % -4 == 2), а Python - другу останню ( 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.

Це правила зловживань. Рубі та Perl, безумовно, не є однією і тією ж мовою, а також Perl не є підмножиною Ruby (наприклад, більшість пов'язаних Perl лайків не працюють у 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;

На кожному з перших 3 рядків є пробіл.

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

уау, я навіть не розумію, як працює код Рубі: D
Мартін Ендер

@ MartinBüttner <<aв Ruby працює так само, як Bash, але повертає рядок. Я раніше не писав програму Ruby. Я щойно знайшов випадкову мову з цією функцією.
jimmy23013

Я також не знаю, як це працює в баші: P
Мартін Ендер

@ MartinBüttner Це називається heredoc. <<wordповертає рядок, закритий рядком з одинарним word.
jimmy23013

5

ретикулярна / befunge-98, 28 байт [неконкурентна]

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

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

Все, що знаходиться між ;s in 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

Перша частина заснована на цій лавці Ruby і в основному:

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

Присвоєння рядків точно так само в Mathematica. puts s%sІнтерпретуються як твір 4 символів: putsрядок s, %(останній результат REPL або , Out[0]якщо це перший вираз ви оцінюєте) і інший s. Це, звичайно, абсолютно безглуздо, але Mathematica не піклується і ;пригнічує будь-який вихід, тому це просто обробляється безшумно. Потім #робить решту рядка коментарем до Рубі, поки Mathematica продовжується.

Що стосується коду Mathematica, то найбільша його частина - це імітувати обробку рядків у форматі Рубі без використання жодних літеральних рядків. 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 програма починається з багаторядкового літерального рядка. Цього уникнути `, а потім він використовує стандартну квінку для друку коду квоти, а також зауважуючий коментар.

До> <>, перший " запускає літеральний рядок, який проходить через увесь перший рядок, підштовхуючи кожного символу до стеку. Після цього кінцеві пробіли (створені завдяки вкладеному входу) видаляються, а потім стек повертається назад. Кожен символ у стеку (тобто весь перший рядок) виводиться, а потім він рухається вниз до другого ряду.

Другий ряд по суті робить те ж саме, за винятком того, що він знаходиться в зворотному напрямку, тому не потрібно повертати стек. (Так чи інакше, тому що мені потрібно видалити пробіли.)

Нарешті, він переходить до третього рядка. Єдина основна відмінність полягає в тому, що ви повинні пропустити блок 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 просто друкує все перед тим, <?phpяк HTML. //не є коментарем у HTML, тому він просто надрукований.
  • mainоголошується як функція зі змінною a.
  • printfдрукує повернення каретки (щоб замінити вже надрукований //), а потім вихідний код, використовуючи стандартний метод квінування C / PHP.
  • #if 0 PHP ігнорується.
  • main($a)ініціалізує порожню змінну a. (Раніше використовувався error_reporting(0)для ігнорування помилок, викликаних дзвінками main())
  • #endif PHP також ігнорується.

Як це працює (на С):

  • //<?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 / 2 придатних, 14 байт, неконкурентоспроможні

0"D34çý"D34çý

Спробуйте в Інтернеті! (05AB1E)
Спробуйте в Інтернеті! (2-разовий)

2 придатних є похідною від 05AB1E і схожа, але має основні відмінності.

Трейлінг нового рядка.


1
Я не знаю, який зараз стан 2able і 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 бачить дані , що зберігаються в $_і evalS як зазвичай. Так +[]як truthy в Perl, 'зберігається в $qза допомогою рядка-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($_)

Пояснення

Ми зберігаємо дані квита $_в обох мовах, а потім evalїх, що є майже стандартною процедурою в Perl.

Perl бачить дані , що зберігаються в $_і evalS як зазвичай. evalУсередині $_виконаний і не в розбір, але так як це eval, не помилка. printfПотім викликається однією цитованою рядком q(), з `роздільником, так як тільки використання `призведе до виконання команд у оболонці, то для першого використання $q, оскільки +[]є truthy в Perl, 'зберігається в $qстроково-XOR hіO .

У JavaScript evalблок всередині $_налаштовує функцію q, яка є returnїї аргументом як 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.