打印多语种碎片


22

通常,以多种语言构造多语言,通过将它们包装在字符串文字中,使用注释语法或其他类似的技巧,每种语言可以忽略其他语言存在的代码部分。

您的目标是编写一个多语言版本,其中每种语言的输出是来自产生该输出的多语言版本的代码。具体来说,输出必须由仅删除的多语言代码构造而成,并且必须是给定语言的Quine。

规则

  • 只要 允许适当的Quins(禁止读取源代码,禁止接受输入,如果没有STDOUT选项,则输出必须为STDOUT或最接近的替代方案,并且程序必须不仅包含隐式打印的文字,而且还应包含其他内容)。
  • 由于不同的语言可以使用不同的编码,因此原始字节在这里很重要。例如,如果语言A使用UTF-8,语言B使用CP437,则(十六进制)代码C3 88 46 47ÈFG用于语言A和├êFG语言B。
  • 所有输出必须是不同的(再次比较原始字节)。这避免了尝试限制次要语言版本时的麻烦-如果两种语言使用代码的同一部分来执行相同的操作,则不能同时声明它们两者。
    • 如果您有两种语言A和B,它们XY在这两种语言中都是有效的输出,但YZ在B中也是有效的,那么您可以选择XY作为A YZ的输出和B的输出,因此可以在分数中同时使用它们(但XY由于上述规则,您无法同时使用两种语言。
  • 所有输出必须尽可能短。例如,如果您的代码是print('foo')#something,对于Python 3(忽略输出不正确的事实),您需要输出的代码将是print('foo'),并且print('foo')#将不允许使用。如果有多个长度相等(最小)的字符串产生正确的输出,则可以选择其中任何一个。
  • 提交内容必须是至少两种语言的多语种。
  • 您的分数将由给出(number of programming languages with distinct outputs)**3/(total byte size of polyglot)。最高分获胜。如果两个提交者得分相同,则首先达到该得分的提交者将获胜。

2
倒数第二条规则听起来像是我们需要证明不可能通过其他任何可能的删除操作来进一步打高尔夫球。那是故意的吗?
马丁·恩德


对于命令长度不超过8位的语言,您如何定义“删除”?您是一次从源中删除命令还是一次删除一个字节?

@MartinEnder可以假设为诚信。除非有人发现可以从多语种形成的较短的奎纳,否则答案是有效的。
Mego

@ ais523一切都在字节级别完成。
Mego

Answers:


11

GolfScript + CJam + Fission 2 + 果冻,4种语言,24字节,得分2.667

让我们从十六进制转储开始:

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

对于GolfScript,CJam和Fission 2,我们使用与ASCII兼容的单字节编码(例如ISO 8859-1)来解释这一点(确切的编码并不重要,因为这些语言始终只定义ASCII字符的运算符):

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

<DEL>控制字符在哪里0x7f

在Jelly中,假定它位于Jelly自己的代码页中,如下所示:

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

高尔夫脚本

e最后一行是一个未知变量,并#评论了该行的其余部分,因此这个打印

"0$p"
0$p

一个尾随换行。这是标准quine的GolfScript / CJam多语言版本:

".p"
.p

尝试使用多种语言。| 试试奎纳。

贾姆

在这里,e#注释掉最后一行,因此几乎一样

"0$p"
0$p

没有尾随换行符。

尝试多语 | 尝试奎因。

裂变

Fission仅看到第二行,它标准的Fission quine,因此它打印

'!+OR"

我无法在此处提供多语言的在线链接,因为TIO将文件以UTF-8格式发送给Fission,但是Fission逐字节读取源,这使得最后一行太长。但是,我已经使用ISO 8859-1编码文件在本地进行了测试(最后一行的长度与第二行的长度相同),以确认此方法有效。

尝试奎因。

果冻

pilcrow是Jelly中换行符的别名,因此源等效于:

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

Jelly程序的除最后一行外的所有内容都是“帮助程序链接”(即函数),除非它们在语法上有效,否则除非被调用,否则可以忽略。这实际上3是在CJam和GolfScript程序中排在第一位的原因,否则"无法在Jelly中进行解析。

否则,由于未调用该函数,因此该程序仅等效于其第二行,即标准Jelly quine。

尝试使用多种语言。| 试试奎纳。


9

> <> + Python,2种语言,51 46字节,分数〜= 0.16 0.17

既然还没有答案,我将从一个简单的答案开始

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

尝试> <>Python

对于> <>,​​第一行是一个quine(#反映为,“将整个行放在堆栈上,然后我们压入34(字符为“)并打印所有内容),执行从不移开,因此它有效地忽略了其余部分代码。

对于Python,第一行是注释,而第二行是quine(python中的标准方法,使用字符串替换和两个参数相同的字符串)。


1
对> <>答案的略微调整可以为您节省一些字节:-#“〜r10gol?!; 60. |!
鹈鹕

@Tealpelican感谢您提醒我使用.!我使用这种方法修改了quine,尽管我更喜欢保持字符串反向(因为这样可以节省字节),并且避免使用g(因为它可以被解释为“读取源代码”)
Leo

这是不使用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未以任何方式使用。第二行组S的字符串S=%s;console.log(S,uneval(S)),和所述第三打印它替换之后%s与所述uneval的ED表示S(只是S引号引起来)。结果是JavaScript中的一个quine。

蟒蛇

这基本上就是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最后。这将A变成一个数字,以便A//2第二行的整数除法不会引发错误。

第二行与第2行基本相同,只是它设置S为string S=%r;print S%%S。第三行在S将替换%rS(只是S用单引号引起来)。结果是Python 2中的一个quine。

杰普特

这是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答案基本相同,但有一个主要例外:最后两行合并。结果,这就是解释器实际看到的:

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

第一行设置A为Japt quine,第二行设置S为JS quine的一部分。但是,在Japt中,仅最后一个表达式发送到输出。这是A,所以输出是`i96d)p2`i96d)p2


什么uneval啊 我不工作
Cyoce


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输出恰好是第二行,Python 2输出就是这个quine。> <>输出是第一行。

说明

该程序基于经典的Python 2 quine:

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

首先,为了使其与Python 2和Python 3兼容,我将该print语句更改为一个函数调用,并添加了一个额外的空间,该空间稍后将派上用场:

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

接下来,我需要一种将Python 2与Python 3区分开的方法。最简单的方法之一就是利用/Python 2中的整数除法,而在Python 3中的浮点除法的优势。因此,以下代码True在Python中求值2,但False在Python 3中:

1/1is 1

为了使两种语言之间的输出区分开来,我需要有选择地删除print调用中的第一个和最后一个括号(这就是为什么我需要更早的空格-没有空格,这print在Python 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:-1在Python 3。因此,b"(_%(_,b))"在Python 3,但在Python 2中的第一和最后一个字符将被丢弃,剩下_%(_,b)。并进行了修改,该多语言版可有效应对这一挑战。

正如Teal pelican所建议的那样#o<}-1:",由于#在Python 中开始了单行注释,因此可以很容易地添加> <> quine 。只需在它前面加上换行符即可添加另一种语言,并将分数提高近十倍。


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`
#\`#

蟒蛇视网膜

蟒蛇:

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.

这是对标准> <> quine的略微修改,以在开头使用三引号引起来的字符串。这样,Python的结尾三引号可以在另一行。

在线尝试!

派克看到:

"34.Cp\D\Es"DEp00/

我以前没有在Pyke中制作过一个奎因,所以不得不考虑一个。我使用传统的奎因技术来创建字符串,然后将其自身作为输入进行评估。请注意,为使此功能在不产生视觉冲击的情况下工作,必须禁用警告。在生成步骤中将错误除以0错误。

在这里尝试!或者只是奎纳部分。

Python看到:

这一切 Python使用所有代码来生成其代码。我决定将quine部分嵌入到文档字符串中(尽管最终它可以节省要删除的字节,但我认为这很酷)。这是对标准奎宁技术的修改。

在线尝试!

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.