写一个三阶奎因


17

这项挑战是“ 高尔夫互惠 ” 的延伸。

使用您选择的三种语言,创建一个三阶Ouroboros程序。

也就是说,用语言A编写程序pA,该程序以语言B输出程序pB。程序pB应该以语言C输出程序pC,该程序又以语言A输出原始程序pA。

A,B和C中的两种语言都不能相同,也不能互为子集或超集。pA,pB或pC可能都不相同。

例如,Haskell程序输出一个Perl程序,该Perl程序输出一个Java程序,该Java程序输出原始的Haskell程序将是有效的。

另一方面,输出C#3程序和C#2程序的C#4程序无效。如果说Perl程序和Ruby程序相同,那么即使是Perl-> Ruby-> Bash组合也将无效。

这是代码高尔夫,所以最短的程序pA获胜。


Answers:


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个字符

我想使某种语言链有意义,所以我想写一个PHP脚本来生成包含JavaScript的HTML页面。对于第三种语言,我选择Perl是因为我喜欢Perl。:)

有人可能会考虑这四种语言,但是在这里,我并没有真正将HTML与JavaScript分开-它是一种标记语言,而不是编程语言。无论如何,这是三个版本:

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>

(Ps。是的,我知道我可以使PHP一步几乎完成,例如仅在Perl中生成HTML + JS代码并将其追加<?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):^)


(请注意:此处有两条尾随的换行符),它们会再次生成原始的Underload程序:

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

这里的主要目的是找到可嵌套字符串的语言(即,您可以通过将字符串括在定界符中而不用对其进行转义来引用它)。欠载有(),Perl有q(),并且sed中的字符串持续到空格(如果程序中没有空格,则该字符串可以隐式嵌套)。可能有一种esolang或golf语言,上面有“打印当前行的其余部分,而不是换行符”的说明,这在这里很理想,但是我并没有花太多时间去寻找它。在这种情况下,您可以节省8个字节减去指令长度。(Jelly 几乎可以使用,但其说明没有引用自己。此外,它还晚于挑战。)

您可以减少到 22个字节,如下所示:

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

(使用一个尾随的换行符,例如常规文本文件,而不是通常在高尔夫球中得到的零)。但是,这需要可以将换行符视为无操作的Underload解释器。可以在线尝试它的功能,但是我认为它的发布要晚于挑战。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.