ポリキンを書く


33

ポリキンは、クインとポリグロットの両方です。1少なくとも2つの異なる言語で有効なクインを書きます。これはコードゴルフなので、最短の回答(バイト単位)が勝ちです。

1それを作りました。むしろ、ジオビットはそうしました。どうやら、彼も最初のものではなかったようです。

クインのルール

真のクインのみが受け入れられます。つまり、あなたは、STDOUTに逐語的に全体のソースコードを印刷する必要がなくて

  • ソースコードを直接または間接的に読み取る。
  • REPL環境に依存します。REPL環境は、フィードするすべての式を単に評価および出力するだけです。
  • 特定の場合にソースを出力するだけの言語機能に依存しています。
  • エラーメッセージまたはSTDERRを使用して、クインのすべてまたは一部を書き込みます。(STDOUTが有効なクインであり、エラーメッセージがその一部でない限り、STDERRに書き込むか、警告/致命的でないエラーを生成できます。)

さらに、コードには文字列リテラルが含まれている必要があります。

ポリグロットのルール

使用される2つの言語は明確に異なる必要があります。特に:

  • 同じ言語の異なるバージョンであってはなりません(Python 2とPython 3など)。
  • それらは同じ言語の異なる方言であってはなりません(例:PascalとDelphi)。
  • 1つの言語は、他の言語のサブセットではない場合があります(例:CとC ++)。

4
「コードには文字列リテラルを含める必要があります」Brainfuckなどの文字列リテラルを持たない言語でもですか?
ピーターオルソン14

@PeterOlsonルールの目的は、ゴルフ特有の言語(これなど)の抜け穴を避けることです。ルールを削除したり弱めたりするとどうなるか予想できないので(絶対に必要でない限りルールを変更するのが好きではないので)申し訳ありませんが、BFの提出はこの目的には有効ではありませんチャレンジ。慰めである場合、BF提出はおそらく競争力がないでしょう。;)
マーティン・エンダー14

1
「彼は最初の人でもなかった」どこへのリンク?
エリックアウトゴルファー

2
Cは実際にはC ++のサブセットではありません。
MD XF

Brainf ** kとMOOなど、2つの異なるBrainf ** kベースの言語は同じ言語としてカウントされますか?
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#コンパイラとの指示をBJavaのための指示、私たちは、次のコードを使用することができます。

//\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
プログラミングパズルとコードゴルフコミュニティへようこそ!
エリックアウトゴルファー16

2
ほぼ2年が経ちましたが、58バイトのゴルフができます。オンラインJavaでお試しください。オンライン
ケビンクルーッセン

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は3番目のサブストリング(2 % -4 == 2)を実行し、Pythonは最後から2 番目のサブストリング()を実行し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で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 14

@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;

Christopher DurrのPerlクインから逐語的にコピー。

これはルールの乱用です。RubyとPerlは間違いなく同じ言語ではなく、PerlもRubyのサブセットではありません(たとえば、リンクされたPerlのほとんどはRubyでは機能しません)。しかし、Rubyは、必要に応じてPerlのように見えるように設計されており、これはゴルフでよく起こります。


これはPHPでも動作するようにできますか?ドキュメントを正しく読んでいる場合は、コマンドラインで実行でき-Rます。スクリプトタグは不要です。php.net/manual/en/features.commandline.options.php
hmatt1

私はそれをルール乱用とは呼びません。2つの言語の交差点で機能するクインを見つけることは、間違いなくこの質問にアプローチする有効な方法です。ただし、これはあなた自身の仕事ではないので、コミュニティWikiとしてマークしてください。
マーティンエンダー14

@chilemagic確かにそうです!
histocrat

@MartinBüttnerできました。
histocrat

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

Bash / Ruby、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
マーティン・エンダー

<<aRubyの@MartinBüttner はBashと同じように機能しますが、文字列を返します。以前にRubyプログラムを書いたことがありません。この機能を備えたランダムな言語を見つけました。
jimmy23013 14

bashでどのように機能するかわかりません:P
マーティンエンダー14

@MartinBüttnerこれはheredocと呼ばれます。<<wordは、単一のword
jimmy23013 14

5

reticular / befunge-98、28バイト[非競合]

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

網状にしよう! befunge 98をお試しください!

;befungeのsの間にあるものはすべて無視され、網状の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が継続している間、残りの行をRubyのコメントにします。

Mathematicaコードの最大の部分は、文字列リテラルを使用せずにRubyのフォーマット文字列処理をシミュレートすることです。FromCharacterCode@{37,112}であり%pFromCharacterCode@{37,112}です%%。前者は文字列自体に置き換えられ(InputForm引用符を追加する)、後者は単一のに置き換えられ%ます。結果がPrint編集されます。最後のキャッチは、それ#を前面でどのように処理するかです。これは、純粋(匿名)関数の最初の引数に対するMathematicaのシンボルです。それでは、私たちがやっていることは、私たちが作る付加することにより、その純粋な機能のすべてを&引数とし、すぐに機能呼び出し11関数呼び出しの前にa を付けると、結果が「乗算」されます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にとって、プログラムは複数行の文字列リテラルで始まります。これはでエスケープされ`、標準のクインを使用してクインコードと末尾のコメントを出力します。

> <>に、最初"の文字列リテラルを開始して最初の行全体を調べ、すべての文字をスタックにプッシュします。その後、後続のスペース(入力が埋め込まれるために作成された)が削除され、スタックが反転されます。スタック内のすべての文字(つまり、最初の行全体)が出力された後、2番目の行に移動します。

2番目の行は基本的に同じことを行いますが、反対方向であるため、スタックを逆にする必要はありません。(末尾のスペースを削除する必要があるため、とにかく行います。)

最後に、3行目に移動します。唯一の大きな違いは、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

CでのコンパイルにはGCCコンパイラフラグが必要なため、+ 10バイト-Dfunction=

仕組み(PHPの場合):

  • PHPインタープリターは<?php、HTMLの前のすべてを単純に印刷します。//はHTMLのコメントではないため、単に印刷されます。
  • mainは、変数を持つ関数として宣言されますa
  • printf//標準のC / PHPのquiningメソッドを使用して、キャリッジリターン(既に印刷されたをオーバーライドするため)とソースコードを印刷します。
  • #if 0 PHPでは無視されます。
  • main($a)空の変数を初期化しますa。(以前はerror_reporting(0)を呼び出したことによるエラーを無視するために使用されていましたmain()
  • #endif PHPでも無視されます。

仕組み(C):

  • //<?php は1行のコメントなので、無視されます。
  • functionキーワードは、コマンドラインコンパイラの引数による無視されます-Dfunction=
  • GCCとClangは、変数がで始まるか含まれるかを気にしません$。(これにより日が節約されました。)
  • printf 標準のC / PHPのquiningメソッドを使用して、キャリッジリターン(この場合は役に立たない)を出力し、次にソースコードを出力します。
  • #if 0はまでをすべて無視するendifので、PHPはを呼び出せますmain
  • #endif 「無視」ブロックを終了します。

2

Wumpus / > <> / Befunge-98 28バイト

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

Wumpusでお試しください!> <>試してみてください!Befunge-98試してみてください!

使い方:

Wumpus Code:

  " 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つの言語の異なる方言と見なしていたでしょう。
マーティンエンダー

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をオンラインでお試しください!

説明

馬データは$_両方の言語で保存されてからevaledになります。これはPerlの標準的な手順です。それは持っているように私はTIOにSpiderMonkeyのを選んだprint機能を、これは簡単に+ 20バイトのために、ブラウザに移植することができた(追加eval("print=alert");の先頭に$_定義の)。

Perlはに格納されたデータを見ている$_と、evalいつものようにそれをね。以来、+[]Perlでtruthyある、'に格納されている$qの文字列的-XORを介してh、およびO。最後のトリックはへの呼び出しであるprintJavaScriptの使用のための最初の部分どこ+Perlでの数値など、すべてのアイテムを扱い、まで追加し、0し、我々が使用する||私たちが実際に欲しいものを返すようにオペレータを(q($_),"=$q$_$q;",q(eval($_)))に相当します"\$_=$q$_$q;eval(\$_)"

JavaScriptでは、を+[]返す0のでunescape("%27")、store 'in を呼び出します$q(残念ながら、atobSpirderMonkeyには存在しません...)。通話中のprintため、+JavaScriptで連結演算子は、最初のブロックは、所望の出力を構築した後、第2の部分は||無視されます。

おかげパトリック・ロバーツのコメントのための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はに格納されたデータを見ている$_と、evalいつものようにそれをね。eval$_で実行し、パースに失敗しますが、それはだからさeval、エラーません。printf単一引用符で囲まれた文字列と、呼び出されるq()と、`delimterとして、ちょうど使用するなど`の最初の使用のために、次に、シェル内で実行されるコマンドをもたらす$qので、+[]Perlでtruthyである、'に格納されている$qの文字列的-XORを介しhO

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でのみ動作し、$sin %1$sが補間されるためPHPでも動作するのは難しいですが、おそらく2つのアプローチを組み合わせて使用​​すると、多くのバイトを節約できます...


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($_);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.