ポリグロット片の印刷


22

通常、ポリグロットは、各言語が他の言語に存在するコードの一部を無視できるように、文字列リテラルでラップしたり、コメント構文などのトリックを使用して構築されます。

あなたの目標は、各言語の出力がその出力を生成するポリグロットからのコードであるポリグロットを書くことです。具体的には、出力は削除のみのポリグロットコードから構築する必要があり、指定された言語のクインでなければなりません。

ルール

  • 適切なクインだけが許可されます(ソースコードの読み取り、入力の取得、STDOUTへの出力、またはSTDOUTがオプションでない場合は最も近い代替が必要であり、プログラムは暗黙的に印刷されるリテラル以外のもので構成する必要があります)。
  • 言語ごとに異なるエンコーディングを使用できるため、ここで重要なのは未加工バイトです。たとえば、言語AがUTF-8を使用し、言語BがCP437を使用する場合、(16進数)コードC3 88 46 47ÈFG言語Aと├êFG言語Bになります。
  • すべての出力は個別でなければなりません(やはり、生のバイトを比較します)。これにより、マイナー言語バージョンを制限しようとする複雑さを回避できます。2つの言語がコードの同じ部分を使用して同じことを行う場合、両方を要求することはできません。
    • XY両方で有効な出力でYZあるがBでも有効な2つの言語AとB がある場合XY、A YZの出力とBの出力として選択できるため、スコアでそれらの両方を要求できます(XY上記の規則のため、両方の言語を請求することはできません)。
  • すべての出力はできるだけ短くする必要があります。たとえばprint('foo')#something、Python 3のコードが(出力が正しくないという事実を無視して)の場合、出力する必要があるコードはになりprint('foo')print('foo')#許可されません。正しい出力を生成する長さが等しい(最小の)文字列が複数ある場合は、いずれかを選択できます。
  • 提出物は、少なくとも2言語の多言語でなければなりません。
  • あなたのスコアはによって与えられ(number of programming languages with distinct outputs)**3/(total byte size of polyglot)ます。最高のスコアが勝ちます。2つの提出が同じスコアを達成した場合、最初にそのスコアに達した提出が勝ちます。

2
最後から2番目のルールは、他の可能な削除セットでは、結果のクインをさらにゴルフすることは不可能であることを証明する必要があるように思えます。それは意図的ですか?
マーティンエンダー


コマンドが8ビット長ではない言語の場合、「削除」をどのように定義しますか?ソースからコマンドを一度に削除しますか、それともバイトを一度に削除しますか?

@MartinEnder誠意があります。誰かがポリグロットから形成できる短いクインを見つけない限り、答えは有効であると信じられます。
MEGO

@ ais523すべてはバイトレベルで行われます。
MEGO

回答:


11

GolfScript + CJam + Fission 2 + Jelly、4言語、24バイト、スコア2.667

16進ダンプから始めましょう。

00000000:  3322 3024 700a 2721 2b4f 5222 0a3c 3024 700a 6523 7fff cccc

GolfScript、CJam、Fission 2の場合、ISO 8859-1のようなASCII互換のシングルバイトエンコーディングでこれを解釈します(言語はいずれにせよASCII文字の演算子のみを定義するため、正確なエンコーディングは重要ではありません):

3"0$p
'!+OR"
<0$p
e#<DEL>ÿÌÌ

<DEL>制御文字はどこですか0x7f

Jellyでは、これはJelly自身のコードページにあると想定され、代わりに次のようになります。

3"0$p½'!+OR"½<0$p½e#¶”ṘṘ

GolfScript

e最後の行に不明の変数とある#行の残りアウトコメントので、このプリント

"0$p"
0$p

末尾の改行。これは、標準のクインのGolfScript / CJamポリグロットバージョンです。

".p"
.p

ポリグロットを試してください。| 馬を試してください。

CJam

ここでe#は、最後の行をコメントアウトしているので、ほぼ同じように、これは印刷します

"0$p"
0$p

末尾の改行なし

ポリグロットを試す | 馬を試してください。

核分裂

核分裂は、2行目のみ見ている、それは印刷して、標準の核分裂QUINEを

'!+OR"

TIOはファイルをUTF-8としてFissionに送信しますが、Fissionはソースをバイト単位で読み込むため、最後の行が長くなりすぎるため、ここでポリグロットのオンラインリンクを提供することはできません。ただし、これが機能することを確認するために、ISO 8859-1でエンコードされたファイル(最後の行の長さが2行目と同じ)を使用してローカルでテストしました。

馬を試してください。

ゼリー

pilcrowはJellyの改行のエイリアスであるため、ソースは次と同等です。

3"0$p½'!+OR"½<0$p½e#
”ṘṘ

Jellyプログラムの最後の行以外はすべて「ヘルパーリンク」(つまり関数)であり、構文的に有効であれば、呼び出されない限り無視できます。これが実際に3CJamおよびGolfScriptプログラムで最初に登場する理由"です。そうでなければ、Jellyで解析できないからです。

それ以外の場合、関数は呼び出されないため、プログラムは2行目と同等になります。これは標準のJelly quineです。

ポリグロットを試してください。| 馬を試してください。


9

> <> + Python、2言語、51 46バイト、score〜= 0.16 0.17

まだ答えがないので、簡単なものから始めます

#.09;!?lo}*2+2f"
_='_=%r;print _%%_';print _%_

> <>およびPythonで試してください

> <>の場合、最初の行はクインです(#が反映され、 "は行全体をスタックに配置し、34(charcode for")を押してすべてを出力します)、実行はそこから移動しないため、残りのコード。

Pythonの場合、最初の行はコメントで、2番目の行はキインです(Pythonの標準的なアプローチ、両方の引数として同じ文字列で文字列置換を使用)。


1
> <>答えを少し適応させると、バイト数を節約できます。-# "〜r10gol?!; 60. |!
ティールペリカン

@Tealpelicanの使用を思い出させてくれてありがとう.!私は、私は(これはバイトを節約するため)逆に文字列を維持し、使用を避けることを好むものの、このアプローチを使用して、私のQUINEを適応g(それは「ソースコードを読む」と解釈される可能性があるため)
レオ

これは、gを使用しないことでかなり公平なポイントです。見て、少し考えて、スタックの#(ascii 35)を使用して「like;#.09;!?lo} -1」を取得することで、さらに減らすことができます
ティールペリカン

7

JavaScript + Python 2 + Japt、3言語、132バイト、スコア〜= 0.205

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S";"""
console.log(S,uneval(S))//""";print S%S

これは印刷します

S="S=%s;console.log(S,uneval(S))";console.log(S,uneval(S))

JavaScript(Firefoxのみ)、

S='S=%r;print S%%S';print S%S

Python 2、および

`i96d)p2`i96d)p2

Japtで。(オンラインでテストしてください!

JavaScript

これはJavaScriptが見るものです:

A="`i96d)p2`i96d)p2";1
S="S=%s;console.log(S,uneval(S))";A
console.log(S,uneval(S))

最初の行はA何も使用されていないため、何もしません。2行目Sは文字列S=%s;console.log(S,uneval(S))に設定され、3行目%sunevaled表現SS引用符で囲まれている)に置き換えた後、それを出力します。その結果、JavaScriptが完成しました。

Python

これは基本的にPythonが見るものです:

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S"
print S%S

最初の行はほとんど無操作です。唯一の重要な部分はA=1最後にあります。これは、2行目のA整数除算A//2でエラーが発生しないように数値に変わります。

2行目はS、string に設定することを除いて、ほとんど同じ方法S=%r;print S%%Sです。3番目の行は、を生の表現(単一引用符で囲まれたもの)Sに置き換えた後に出力されます。結果は、Python 2のクインです。%rSS

ジャプト

これは、Japtインタープリターが見るJavaScriptコードです。

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S";"","\nconsole.log(S,uneval(S))//","";.p("r".i("n".t(),S%S))

ご覧のとおり、JavaScriptの回答とほぼ同じですが、1つの主な例外があります。最後の2行が結合されています。結果として、これはインタープリターが実際に見るものです:

A="`i96d)p2`i96d)p2";1
S="S=%s;console.log(S,uneval(S))";A

1行目AはJaptクインに設定し、2行目SはJS クインの一部に設定します。ただし、Japtでは、最後の式のみが出力に送信されます。これはAですので、出力は`i96d)p2`i96d)p2です。


なにuneval?私のために動作しません
チョイス

@Cyoce developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...それだけのにFirefoxで動作します。
ETHproductions

3

Jolf +> <>、スコア= 2 ** 3/15 = 0.533 ....

"r0:g>o<
"Q«Q«

これに別の言語を追加する作業。


2

> <>、Python 2および3、3言語、107バイト、スコア= 27/107〜= 0.252

#o<}-1:"
a=1/1is 1;b="(_%(_,b))"[a:-a|9];_='a=1/1is 1;b="(_%%(_,b))"[a:-a|9];_=%r;print %s';print (_%(_,b))

オンラインで試す:Python 2Python 3> <>

Python 3の出力は正確に2行目であり、Python 2の出力はこのquineです。> <>出力は最初の行です。

説明

このプログラムは、古典的なPython 2馬に基づいています。

_='_=%r;print _%%_';print _%_

最初に、Python 2とPython 3の両方と互換性を持たせるために、printステートメントを関数呼び出しに変更し、後で役立つ余分なスペースを追加しました。

_='_=%r;print (_%%_)';print (_%_)

次に、Python 2とPython 3を区別する方法が必要でした。最も簡単な方法の1つは、/Python 2では整数除算ですが、Python 3では浮動小数点除算であるという事実を利用することです。したがって、次のコードTrueはPythonで評価されます2、しかしFalsePython 3では:

1/1is 1

2つの言語間で出力を区別するために、print呼び出しの最初と最後の括弧を選択的に削除する必要がありました(そのため、スペースが以前に必要でした-スペースがないと、printPython 2では有効なステートメントではありません) 。したがって、次のようにクインハーネスを変更する必要がありました。

a=1/1is 1;b="(_%(_,b))"[a:-a|9];_='a=1/1is 1;b="(_%%(_,b))"[a:-a|9];_=%r;print %s';print (_%(_,b))

表現のそれa:-a|9に評価0:9のPython 2と1:-1Pythonの3のはこのように、bある"(_%(_,b))"のPython 3には、しかし、Pythonの2の最初と最後の文字は破棄され、去ります_%(_,b)。そして、その変更により、ポリグロットはこの課題に対して有効でした。

Tealペリカンが示唆#o<}-1:"しているように#、Pythonで単一行コメントを開始するという事実のおかげで、> <>クインをかなり簡単に追加できます。単に先頭に改行を追加すると、別の言語が追加され、スコアが約10倍になります。


1

Python 2 + Retina、2言語、55バイト、スコア= 2 ^ 3/55≈0.145

$n代わりに、有効なASCIIを両方とも使用しました。

S='S=%r;print S%%S';print S%S#|
#$n\(*S1`$n\(*S1`
#\`#

パイソン網膜

Python:

S='S=%r;print S%%S';print S%S

網膜:


\(*S1`
\(*S1`

0

> <> + Pyke + Python 2、81バイト、スコア= 3 ** 3/81〜0.333

"""r00gol?!;60.
a=%r;print a%%a"""#);"34.Cp\D\Es"DEp00/
a=__doc__[-15:]
print a%a

私はすべての言語で異なることをしようとしました。

> <>見る:

"""r00gol?!;60.

これは、最初に三重引用符付き文字列を使用するための標準の> <>クインのわずかな変更です。これにより、Pythonの終了の三重引用符を別の行にすることができます。

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

パイクは見ている:

"34.Cp\D\Es"DEp00/

以前、パイクで馬を作成したことがなかったので、馬を考えなければなりませんでした。文字列を作成し、それを入力としてそれを評価するために、私は伝統的なカニング技術を使用しました。これが視覚的な影響なしに機能するために注意してください、警告は無効にする必要があります。生成ステップで0による除算エラーでエラーが発生します。

ここで試してみてください!またはちょうど馬の部分。

Pythonは見ています:

それをすべて。Pythonはすべてのコードを使用してクインを生成します。docstringにクイン部分を埋め込むことにしました(最終的には削除するバイトを節約できますが、クールだと思います)。これは、標準的なクイニング手法の修正です。

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

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