メタポリグロット馬


18

PPCGに取り組んでいた頃、私は、クインの問題とポリグロットの問題が非常に一般的であることに気付きました。また、問題のメタソリューション、つまり問題の解決策であるプログラムを生成するスクリプトは、コミュニティから多くの肯定的なフィードバックを得る傾向があります。したがって、これらの3つのアイデアを実装するこの課題を作成しました。

読者であり愛好家であるあなたの仕事は、2つの言語AとBで実行できるスクリプトをできるだけ短く作成して、AとBのクインを生成することです。プログラムを言語Aで実行すると、言語Bのクインであるが、言語Aのクインではないプログラム。言語AとBは、生成されたクインがいずれかのバージョンでのみ機能することを念頭に置いて、同じ言語の異なるバージョンにすることができます。 標準の抜け穴は閉じていると見なされるべきであり、適切なクインのみが許可されること

に留意してください。 幸運なことに、最少のキャラクターが勝ちます!


1
クインは、基本的にはメタメタメタメタメタメタメタなどです。とにかくプログラム:)
エソランジングフルーツ

2つの言語が異なる文字エンコーディングを使用している場合、バイトをカウントする方法は?おそらくバイトではなく文字でスコアを付ける必要があります
ルイスメンドー

1
言語Aでクインを実行して言語Bのクインを生成する場合、それをAで実行できるようにする必要がありますか?
corvus_192

2
@LuisMendo異なるエンコーディングの言語のポリグロットを作成する場合、両方が同じバイトストリームを受信すると想定します(同じ文字の異なるエンコーディングではありません)。
マーティンエンダー

1
@Pavel実際に同様の課題をここに書いたが、それは複製として閉じられた。
オリバーNi

回答:


5

CJam 0.6.6 dev / GolfScript、15 14 12バイト

"0$p"0$~a:n;

2バイトのゴルフをしてくれた@ jimmy23013に感謝します!

残りは更新されます。

検証

提出にはかなりの空白が含まれるため、hexdumpを比較するのが最善です。

$ xxd -g 1 mpquine
0000000: 22 60 30 24 7e 22 30 24 7e 4e 4d 3a 6e 3b        "`0$~"0$~NM:n;
$
$ cjam mpquine | tee quine.gs | xxd -g 1
0000000: 22 60 30 24 7e 22 60 30 24 7e 0a                 "`0$~"`0$~.
$ golfscript quine.gs | xxd -g 1
0000000: 22 60 30 24 7e 22 60 30 24 7e 0a                 "`0$~"`0$~.
$ cjam quine.gs | xxd -g 1
0000000: 22 60 30 24 7e 22 60 30 24 7e                    "`0$~"`0$~
$
$ golfscript mpquine | tee quine.cjam | xxd -g 1
0000000: 22 60 30 24 7e 22 60 30 24 7e                    "`0$~"`0$~
$ cjam quine.cjam | xxd -g 1
0000000: 22 60 30 24 7e 22 60 30 24 7e                    "`0$~"`0$~
$ golfscript quine.cjam | xxd -g 1
0000000: 22 60 30 24 7e 22 60 30 24 7e 0a                 "`0$~"`0$~.

CJam

CJam印刷"`0$~"0$~と末尾の改行。オンラインでお試しください!

生成されたプログラム"`0$~"0$~は、GolfScriptの末尾の改行(オンラインで試してみてください!)で印刷されますが、CJamの改行なし(オンラインで試してみてください!)。

メタキンの仕組み

"`0$~"         e# Push that string on the stack.
      0$~      e# Push a copy and evaluate it:
               e#   `     Inspect the string, pushing "\"`0$~\"".
               e#    0$   Push a copy.
               e#      ~  Evaluate, pushing "`0$~".
               e# Both "\"`0$~\"" and "`0$~" are now on the stack.
         NM    e# Push "\n" and "".
           :n; e# Map print over the elements of "" (none) and pop the result.
               e# "\"`0$~\"", "`0$~", and "\n" are now on the stack, and the
               e# characters they represent will be printed implicitly.

クインの仕組み

"`0$~"          # Push that string on the stack.
      0$~       # As in CJam.
         <LF>   # Does nothing.
                # "\"`0$~\"" and "`0$~" are now on the stack, and the characters
                # they represent will be printed implicitly, plus a linefeed.

GolfScriptとは異なり、CJamはデフォルトで末尾の改行を出力しないため、これはCJamのキインではありません。

GolfScript

GolfScriptは"`0$~"0$~、末尾の空白なしで印刷します。オンラインでお試しください!

生成されたプログラム"`0$~"0$~は、CJamの末尾の空白なしで印刷されます(オンラインで試してください!)が、GolfScriptは改行を追加しますオンラインで試してください!)。

メタキンの仕組み

"`0$~"0$~       # As in CJam.
         NM     # Unrecognized token. Does nothing.
           :n   # Store the top of the stack – "`0$~" – in the variable n. n holds
                # "\n" by default. When the program finishes, the interpreter
                # prints n implicitly, usually resulting in a trailing linefeed.
                # By redefining n, it will print "0$~" instead.
             ;  # Pop the string from the stack so it won't be printed twice.

クインの仕組み

"`0$~"0$~      e# Works as in GolfScript.

CJamとは異なり、GolfScriptはスタックのコンテンツに改行を追加するため、GolfScriptのキインではありません。


広義では、CJamとGolfScriptの違いは何ですか?また、コードが機能するのはなぜですか?
パベル

CJamはGolfScriptに大きな影響を受けており、ほとんどの場合後方互換性があります。大きな違いの1つは、GolfScriptはデフォルトでラインフィードを出力に追加するのに対し、CJamは追加しないことです。これはここで利用していることです。詳細な説明をできるだけ早く追加します。
デニス

1
"0$p"0$~a:n;
jimmy23013

@ jimmy23013いいね、ありがとう!私はをいじっていましたa:nが、使用pは私には起こりませんでした。
デニス

8

CJam / Fission、22バイト

"'!+OR'")5-"{'_'~}_~";

CJamで試してください。 Fissionで試してください。

CJamでは、これは標準のFission quineを出力します

'!+OR"

Fission quineを試してください。

Fissionでは、これ"は標準のCJamクインの-lessバリアントを出力します:

{'_'~}_~

CJamクインを試してください。

これは22バイトでも機能します(同じクインを印刷):

"& *NQ!":)R"{'_'~}_~";

説明

CJamの場合:

"'!+OR'"    e# Push this string.
)           e# Pull off the last character.
5-          e# Subtract 5, turning ' into ".
"{'_'~}_~"  e# Push this string.
;           e# And discard it again.

そのため、プログラムの最後に、スタックには文字列"'!+OR"と文字が含まれ"、どちらも暗黙的に出力されます。

Fissionでは、プログラムフローはR右向きのアトムから始まります。'"ただ、原子の質量を変更し)5そして-様々な理由のために無視されます。その後、原子がでプリントモードに入り"、版画{'_'~}_~;アトムを破壊し、プログラムを終了します。


4
顔文字の+1{'_'~}
betseg

5
は、それが起こったときに近くにい
たく

6

Clojure / Common Lisp、274バイト

(defmacro t []"((fn [s] (print (list s (list (quote quote) s)))) (quote (fn [s] (print (list s (list (quote quote) s))))))")(if '()(print(let[s clojure.string/replace](.toUpperCase(s(s(s(s(s(t)"fn""lambda")"[s]""(s)")"(quote ""'")"e)""e")")))))""))))"))))(eval '(princ(t))))

読みやすくするためにいくつかのスペースが追加されました

(defmacro t []"((fn [s] (print (list s (list (quote quote) s))))
     (quote (fn [s] (print (list s (list (quote quote) s))))))")
(if '()(print(let[s clojure.string/replace](.toUpperCase
    (s(s(s(s(s(t)"fn""lambda")"[s]""(s)")"(quote ""'")"e)""e")")))))""))))"))))
    (eval '(princ(t))))

基本的にClojureでクインを返すマクロを定義します。Clojureでは、ベクター([])として提供されるマクロ定義のパラメーターが必要ですが、Common Lispは(ありがたいことに)それを無視します。その後、Common LispとClojureの'()どちらに等しいかnil、したがって偽であるかを評価することにより、2つの言語を区別しtrueます。次に、Clojureを使用して文字列操作を行います。CommonLispは、別のifブランチに進むときに評価しようとさえしません。一方、Clojureは、実行する前に別のブランチが少なくとも正しいかどうかを確認しようとするためeval、Clojureで正しく、Common Lispで正しい文字列を出力するためにそこで使用する必要がありました。

注:単に2つの異なる文字列を返すだけの方が短いかもしれませんが、異なる言語で異なる文字列を出力することに関する多言語の課題と変わらないでしょう。¯\ _(ツ)_ /¯

Clojureオリジナルソースの実行:https : //ideone.com/SiQhPf

Common Lispのオリジナルソースの実行:https : //ideone.com/huLcty

Clojureの出力: ((LAMBDA (S) (PRINT (LIST S (LIST 'QUOTE S)))) '(LAMBDA (S) (PRINT (LIST S (LIST 'QUOTE S)))))

Common Lispの出力: ((fn [s] (print (list s (list (quote quote) s)))) (quote (fn [s] (print (list s (list (quote quote) s))))))

Common Lispで実行されるClojure出力:https : //ideone.com/T1DF7H

その逆:https : //ideone.com/Fezayq


4

Jelly / GolfScript、18 16バイト

0000000: 3a 6e 22 ff cc cc 22 7d 7f fe 22 3a 6e 60 ff 3b  :n"..."}..":n`.;

検証

関係するすべてのプログラムを正確なバイトストリームでテストするには、ローカルでのみ実行できます。

$ LANG=en_US # Latin-1. Jelly doesn't care about the exact encoding,
$            # as longs as it's not UTF-8.
$
$ xxd -g 1 mpquine
0000000: 3a 6e 22 ff cc cc 22 7d 7f fe 22 3a 6e 60 ff 3b  :n"..."}..":n`.;
$
$ jelly f mpquine | tee quine.gs | xxd -g 1
0000000: 22 3a 6e 60 22 3a 6e 60                          ":n`":n`
$ golfscript quine.gs | xxd -g 1
0000000: 22 3a 6e 60 22 3a 6e 60                          ":n`":n`
$ jelly f quine.gs 2> /dev/null | xxd -g 1
$
$ golfscript mpquine | tee quine.jelly | xxd -g 1
0000000: ff cc cc                                         ...
$ jelly f quine.jelly | xxd -g 1
0000000: ff cc cc                                         ...
$ golfscript quine.jelly | xxd -g 1
0000000: 0a

ゼリー

ゼリーのコードページ以下のように、プログラムが見えます。

:n"”ṘṘ"}
“":n`”;

これは印刷します(オンラインで試してみてください!

":n`":n`

これはGolfScriptのクイーン(オンラインで試してみてください!)ですが、Jellyのパーサーエラー(オンラインで試してみてください!)です。

GolfScript

Latin-1では、プログラムは次のようになり、印刷できないDEL文字が}との間にありþます。

:n"ÿÌÌ"} þ":n`ÿ;

これは印刷します(オンラインで試してみてください!

ÿÌÌ

または、Jellyのコードページで視覚化され、

”ṘṘ

これはゼリーでQUINE(あるオンラインそれを試してみてください!()、だけGolfScriptに改行を出力し、オンラインでそれを試してみてください!)。


1
古き良き”ṘṘØVそう、消えるべきですよね?
エリックアウトゴルファー

3

JavaScript / C 278バイト

驚異的な278バイト:

//\
console.log('int main(){char*A="int main(){char*A=%c%s%c;printf(A,34,A,34);}";printf(A,34,A,34);}');/*
int main(){puts("A='A=;B=String.fromCharCode(39);console.log(A.slice(0,2)+B+A+B+A.slice(2));';B=String.fromCharCode(39);console.log(A.slice(0,2)+B+A+B+A.slice(2));");}//*/

Cクイン:

int main(){char*A="int main(){char*A=%c%s%c;printf(A,34,A,34);}";printf(A,34,A,34);}

JavaScriptクイン:

A='A=;B=String.fromCharCode(39);console.log(A.slice(0,2)+B+A+B+A.slice(2));';B=String.fromCharCode(39);console.log(A.slice(0,2)+B+A+B+A.slice(2));


quinesの聖なる母...
MD XF


1

Python / Retina、70 65 64 66バイト

以前のPython / Retinaポリグロットで使用したのと同じ戦略を使用しました。

#
print"\nS`((.+))"*2+"\n\n"
#?
#_='_=%r;%_\n';_
#?;
#;print _%
#

Pythonで試す | Retinaでお試しください

#はPythonのコメントなので、単にRetina quineをPythonで出力します。Retinaでは#、入力に何も見つからないため、最初のステージ(2行)は何もしません。次の段階では、Pythonクインの基礎で何も置き換えません。3番目の段階では、各セミコロンを#print _%ピースに置き換えます。最後の段階では、すべてが削除されます#


網膜のクイン:


S`((.+))
S`((.+))


PythonのQuine:

_='_=%r;print _%%_\n';print _%_

使用されたクインは、このチャレンジで見られるかもしれません。RetinaクインはPythonのエラーであり、PythonクインにはRetinaの出力がありません。


メタキンの仕組みについての答えに説明を追加できますか?
パベル

@Pavelが追加しました。
mbomb007

1

Python 3 / Python 2、62バイト

_='_=%r;print(_%%_['+'~'*-~int(-1/2)+'int(-1/2):])';print(_%_)

Python 2Python 3で試してください。

こちらのPythonクインに基づいています。2つのバージョンを区別する要因は、それらが行うことですint(-1/2)。Python2では、/整数除算(切り捨て)で、結果は-1;になります。Python 3の/浮動小数点除算(-0.5)は、にint切り捨てられ0ます。

_3つの部分で文字列を作成します。'_=%r;print(_%%_['そして'int(-1/2):])'常に同じです。興味深い部分は'~'*-~int(-1/2)次のとおりです。

  • Python 2では、-~int(-1/2)0であり、チルダは文字列に追加されません。
  • Python 3では、-~int(-1/2)1であり、チルダは文字列に追加されます。

したがって、Python 2はPython 3クインを出力します

_='_=%r;print(_%%_[int(-1/2):])';print(_%_[int(-1/2):])

Python 3はPython 2のクインを出力します

_='_=%r;print(_%%_[~int(-1/2):])';print(_%_[~int(-1/2):])

各バージョンでは、内部の式はに[ :]評価されます0。これにより、スライスには文字列全体が含まれますが、間違った言語では-1、に評価されます。


1

Brain-Flakbrainfuck 4617 4009バイト

((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()()()())))()())[()()])))()()())[()()])))())[()])[()()()()])))))))))))))))))))))))))))))))))))))))))))()()())()())[()()()()])()()())[()()])()())[()()()()])()()()))()()())[()()])[()()()()])))))))))))))))))))()())))()()())[()()()()])()()()()())[()()]))()())[()()()])()())[()()])))()()())[()()])))())[()()])[()()()])))))))))))))))))))))))))))))))))))))))))))()()()())[()()()])()()()())[()()])[()()()]))()()()())[()()()])()()()())[()()])[()()()])()()()())[()()()])()()()())[()()])[()()()]))))))))))))))()()()())[()()()])()()()())[()()])[()()()]))()()()())[()()()])()()()())[()()])[()()()])))))))))))))))))))))))))))))()()()())[()()()])()()()())[()()])[()()()]))()()()())[()()()])()()()()()))))))[()()()])[()])()()))))()()){({}<>)<>}<>([]){({}[()]<(({}[()]<((((((()()()){}())){}{}){}())<>)>)<>){({}[()]<({}()())>){({}[()]<({}())>){({}[()]<({}((()()()){}()){})>){({}[()]<({}()())>){({}[()]<({}(((()()()){}()){}){}())>){(<{}({}()())>)}}}}}}{}([]<({}<{({}<>)<>}<>>)>){({}[()]<({}<>)<>>)}{}{({}[()]<(({}))>)}{}(((({})(((()()())){}{}){}())))<>>)}{}{<>({}<>)}{+++++++>>>+>>>+++++++>>>++++++++>>>+++>>>++++>>>++>>>+++>>>++++>>>++++++++>>>+++>>>++++>>>+>>>+++++>>>++++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+>>>+>>>+>>>+>>>+>>>+>>>+>>>+>>>++>>>+>>>++>>>+>>>++>>>+>>>++>>>+>>>++>>>++>>>+++++++>>>++++++++>>>++>>>+++++++>>>++++++++>>>++>>>+++++++>>>++++++++>>>++>>>+++>>>++++>>>++>>>++>>>+>>>++>>>++>>>++>>>++++>>>++>>>+++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+>>>++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+>>>+>>>+>>>+>>>++>>>+>>>++>>>+>>>++>>>++>>>++>>>+++++++>>>++++++++>>>+++++++>>>++++++++>>>++>>>+++++++>>>++++++++>>>+>>>++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+>>>++>>>+>>>++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+>>>+>>>+>>>+>>>++>>>+>>>++>>>+>>>++>>>++>>>+++++++>>>++++++++>>>+>>>++>>>++>>>+++++++>>>++++++++>>>++>>>+++++++>>>++++++++>>>+>>>++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+>>>++>>>+>>>++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+>>>+>>>+>>>+>>>++>>>+>>>++>>>+>>>++>>>+>>>++>>>+>>>++>>>++>>>++>>>+++++++>>>++++++++>>>+++++++>>>++++++++>>>++>>>+++++++>>>++++++++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++>>>+++++++>>>++++++++>>>+>>>+++++++>>>++++++++>>>+>>>++>>>+>>>++>>>++>>>++++>>>++>>>++++++++>>>++++++++>>>++++++++>>>++++++++>>>++++++++>>>++++++++>>>++++++++>>>+++++++>>>++++++++>>>+>>>+++++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++>>>++++>>>++>>>+++>>>++++>>>++++++++>>>+++>>>++++>>>++++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+++>>>++++>>>++>>>+++>>>++++>>>++++>>>++>>>++++++++>>>+++++++>>>++++++++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>++>>>+>>>++>>>++>>>++>>>++++>>>++>>>++++++++>>>+++++++>>>++++++++>>>+++>>>++++>>>++++>>>++>>>++++++++>>>+++++++>>>++++++++>>>+++>>>++++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++>>>++++>>>++>>>+++>>>++++>>>++++++++>>>+++>>>++++>>><<<[<<<]>>>[>++++++++++++++++++++++++++++++++++++++++.<[->.+.->+<<]>+.[-]>>]<[<<<]>>>[<++++++++++++++++++++++++++++++++++++++++>-[<+>-[<+++++++++++++++++++>-[<++>-[<+++++++++++++++++++++++++++++>-[<++>-[<++++++++++++++++++++++++++++++>-[<++>-]]]]]]]<.>>>>]}{}

オンラインでお試しください!

オンラインでお試しください!

説明は途中です私はまだこれをゴルフしています


これにより、brainfuckでbrainfuck quineが、Brain-FlakでBrain-Flak quineが生成されます。それはすべき brainfuckで実行したときに脳フラックと脳高射砲のQUINEに実行したときにbrainfuckのQUINEを生成します。
パベル

もう一度やります。私はちょうどようとBS、次のハードの時間を持って、申し訳ありません
小麦ウィザード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.