三次のクインを書く


17

この課題は、「ゴルフ相互馬」の延長です。

選択した3つの言語を使用して、3次ウロボロスプログラムを作成します。

つまり、言語Aで、プログラムpBを言語Bで出力するプログラムpAを作成します。プログラムpBは、言語CでプログラムpCを出力し、次に言語Aで元のプログラムpAを出力します。

A、B、およびCの2つの言語が同じであったり、互いにサブセットまたはスーパーセットであったりすることはできません。pA、pB、pCのいずれも同一であってはなりません。

たとえば、Haskellプログラムは、元のHaskellプログラムを出力するjavaプログラムを出力するPerlプログラムを出力します。

一方、C#2プログラムを出力するC#3プログラムを出力するC#4プログラムは無効です。たとえば、PerlプログラムとRubyプログラムが同一であれば、Perl-> Ruby-> Bashの組み合わせでも無効になります。

これはコードゴルフなので、最短のプログラムpAが勝ちます。


回答:


21

Python-> Perl-> Ruby、48文字

私の以前の答えの適応。ランニング

s='print q<puts %%q{s=%r;print s%%s}>';print s%s

PythonでこのPerlスニペットを生成します

print q<puts %q{s='print q<puts %%q{s=%r;print s%%s}>';print s%s}>

次のRubyコードを生成します

puts %q{s='print q<puts %%q{s=%r;print s%%s}>';print s%s}

次に、元のPythonスニペットを出力します。

diff -s <(ruby <(perl <(python thirdorderquine.py))) thirdorderquine.py 
Files /dev/fd/63 and thirdorderquine.py are identical

13

Perl-> PHP-> HTML + JavaScript、105文字

言語のチェーンをなんとか意味のあるものにしたかったので、JavaScriptを含むHTMLページを生成するPHPスクリプトを書くことにしました。私はPerlが好きだからといって、第三言語としてPerlを選びました。:)

この4つの言語を検討するもいるかもしれませんが、ここでは実際にはHTMLをJavaScriptとは別のものとしてカウントしません。プログラミング言語ではなく、マークアップ言語です。とにかく、次の3つのバージョンがあります。

Perl(105文字):

printf+(q(<script>alert(unescape("<?=urlencode(<<<E%sprintf+(q(%s),$/)x2,$/%sE%s)?>"))</script>),$/)x2,$/

PHP(165文字):

<script>alert(unescape("<?=urlencode(<<<E
printf+(q(<script>alert(unescape("<?=urlencode(<<<E%sprintf+(q(%s),$/)x2,$/%sE%s)?>"))</script>),$/)x2,$/
E
)?>"))</script>

HTML + JavaScript(235文字):

<script>alert(unescape("printf%2B%28q%28%3Cscript%3Ealert%28unescape%28%22%3C%3F%3Durlencode%28%3C%3C%3CE%25sprintf%2B%28q%28%25s%29%2C%24%2F%29x2%2C%24%2F%25sE%25s%29%3F%3E%22%29%29%3C%2Fscript%3E%29%2C%24%2F%29x2%2C%24%2F"))</script>

(詩。はい、私は知っている私はPerlでHTML + JSコードを生成して付加するなど、PHPのステップにほとんど-NOOPを作っていたかもしれない<?phpことに、あまりにも多くの不正行為のようなものを感じました。このソリューションでは、コードが実際にありますそのままコピーされるのではなく、PHPで処理されます。)


3

アンダーロード→sed→Perl、23バイト

言語の選択を改善すれば、おそらくこれを低くすることができます。「sedプログラムは引数として空の行をとることができる」というルールがコンテストの期限を過ぎているため、ほぼ競合していません。

アンダーロードプログラム:

((iprint+q)Sa(:^)*aS):^

sedプログラムを生成します。

iprint+q(((iprint+q)Sa(:^)*aS):^)

Perlプログラムを生成します:

print + q(((print + q)Sa(:^)* aS):^)


(注:ここには2つの末尾の改行があります)、元のUnderloadプログラムを再度生成します。

((iprint+q)Sa(:^)*aS):^

ここでの主な目的は、文字列がネスト可能な言語を見つけることです(つまり、文字列をエスケープするのではなく、区切り文字で囲むことで文字列を引用できます)。Underload has ()、Perl has q()、およびsedでは、文字列は空白まで続きます(プログラムに空白がない場合は暗黙的にネスト可能です)。エソランやゴルフの言語にはおそらく「現在の行の残りの行を印刷し、その後に改行は続かない」という指示があります。その場合、8バイトから命令の長さを差し引いて保存できます。(ゼリーはほとんど動作しますが、その指示はそれ自体を引用していません。その上、それは挑戦を延期します。)

これを次のように22バイトに減らすことができます

((csay + q)Sa(:^)* aS):^

(通常のゴルフで得られるゼロではなく、通常のテキストファイルのような1つの末尾の改行で)。ただし、これには改行をノーオペレーションとして処理しても問題ないアンダーロードインタープリターが必要です。オンラインで試してみてください!

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