写一个半喹


10

假设您有2种语言,A并且B。如果满足以下条件,则字符串s为准字符串:AB

  1. s是语言的奎因A
  2. s在一个多语种AB
  3. s作为B程序运行的输出是一个不同的字符串s',它是B

这项挑战的目标是用两种不同的语言编写一个半喹啉。这是,因此最短的代码获胜,最早的答案用作决胜局。

规则

仅接受真正的奎因。也就是说,您需要将整个源代码原样输出到STDOUT,而无需

  • 直接或间接阅读您的源代码。
  • 依靠REPL环境,该环境仅评估并打印您提供给它的每个表达式。
  • 依靠在某些情况下仅能打印出源代码的语言功能。
  • 使用错误消息或STDERR编写全部或部分的藜。(您可以将内容写到STDERR或生成警告/非致命错误,只要STDOUT是有效的Quine,并且错误消息不属于其中即可。)

此外,您的源代码不能仅由文字(无论是字符串文字,数字文字等)和/或NOP组成。例如,`12在Jelly和Pyth中是polyglot,但在Jelly中则是NOP和数字文字,因此无效。

为了有效,可以在输出中忽略任何不可抑制的输出(例如版权声明,启动/关闭消息或尾随换行符)。

多义规则

所使用的两种语言必须明显不同。特别是:

  • 它们不能是同一语言的不同版本(例如,Python 2与Python 3)。
  • 它们不能是同一语言的不同方言(例如Pascal与Delphi)。
  • 一种语言可能不是另一种语言的子集(例如C vs. C ++ 1)。
  • 一种语言可能不是另一种语言的琐碎派生词(例如Matlab与Octave 2,brainfuck与boolfuck,TinyBF,ShadyAsFuck与所有其他琐碎的Brainfuck派生词)。

杂项规则

  • 您可能不接受来自STDIN(或任何其他来源)的输入。如果您选择的语言必须接受输入,则输入必须为空(空字符串,通过/dev/null等管道传输),或者程序的输出不得依赖于输入。
  • 对于这个挑战,您必须编写一个完整的程序。不允许要求其他代码来运行解决方案(例如,分配和调用解决方案中定义的lambda函数)。

1:是的,我知道C并不是C ++的真正子集。但是,它足够接近以至于可以用于多重标记的目的,因此我将其归为这一挑战。

2:就像上面的第1点一样,尽管从技术上来说Octave与Matlab并非100%兼容,但它的设计是兼容的,并且足够接近以允许使用Matlab / Octave多重音色可以简化挑战。


ESMin的复制块是否被允许?
lirtosiast

@ThomasKwa我对ESMin不熟悉,所以能否给我一个简短的总结?
Mego 2016年

有一个命令可以启动复制块,该复制块将获取复制后所有内容的源代码。我认为其他JS高尔夫语言也可能有一种。
lirtosiast

@ThomasKwa在quine规则的第一条规则下是不允许的(禁止直接或间接读取源代码)。
Mego 2016年

1
@Downgoat只要它绝对不违反任何其他规则。滥用怪癖是该网站的目标:)
Mego 2016年

Answers:


6

GolfScript + 裂变19 18字节

{".~
'!+OR"
2<}.~

尾随换行是必需的。

这是GolfScript中的一个亮点。在线尝试!

在裂变中打印

'!+OR"

是裂变中的真正亮点在线尝试!

说明

在GolfScript中,任何形式的

{...}.~

只要在堆栈上...留下一个字符串,".~"它就是一个quine 。该.复制块,这样有这么被在最后打印一份,并~执行它,所以我们可以使用它的内容打印.~本身。在这种情况下,块将字符串推入

".~
'!+OR"

然后将其截断为前两个字符2<

Fission程序的工作原理与quine完全相同,因为该程序完全忽略了第一行和第三行。


6

Ruby +(JavaScript Python 3),76个字节

这是使用我最喜欢的新语言(几乎是Ruby,JavaScript和Python 3的子集)可以解决的另一个挑战。鉴于我们还没有使用外来语言的答案,而且很多人喜欢看非高尔夫语言的解决方案,所以我认为我会提供一个解决方案。更好的是,相同的答案可以同时以多种方式解决挑战。

这里是s

s="'";d='"';n='print("s="+d+s+d+";d="+s+d+s+";n="+s+n+s+";eval(n)")';eval(n)

这是Ruby中的奎因。它不是JavaScript或Python 3中的工具。如果以任何一种语言运行它,则其输出s'都有尾随换行符,因此会有所不同:

s =“'”; d ='“'; n ='print(” s =“ + d + s + d +”; d =“ + s + d + s +”; n =“ + s + n + s +” ; eval(n)“)'; eval(n)

但是,s'在JavaScript和Python 3中是多语种!(对我来说,我通常使用Rhino的JavaScript实现,这是为了方便起见(因为它是从命令行运行而不是需要浏览器),并且因为它有一个怪异的标准库,可以在其中print写入标准输出。)两种语言s'都是通过运行这两种程序产生的。

另外,该程序还可以解决反向问题。如果您决定s'在Ruby中运行,它将s再次打印原始程序。因此,s'是该问题的有效答案(但稍长一些,为77个字节)。

在这一点上,我几乎开始考虑“输出是否以换行符结尾足以将两个程序视为不同的结束点之间的差异”应该被视为标准漏洞,因为这似乎是第二种语言(除了著名的GolfScript / CJam之外),还可以实现技巧。


2

Vitsy(安全模式)和Y,9字节,无竞争。

' Ugrd3*Z

在Vitsy中,这是一个藜。在Y中,打印Ugrd3*Z';运行时,将打印Ugrd3*Z',这是Y中的一个quine。但是,Y推迟了该问题。

Vitsy看到的是:

 ' Ugrd3*Z
 '         Heyyyy a string! Let's do this!
  ........ Capturing a string! Oh, not done? Hm, let's go back to the start.
 '         There we go.
           (space) ...
   U       (no op)
    g      use count, disabled in safe mode
     r     reverse stack
      d3*  push a '
         Z print it all!

Y看到的是:

' Ugrd3*Z
'         Push a space.
  U       Wrap around and capture.
   g      Print that. (Nothing else is printed.)

1
请注意,这仅在安全模式下有效,或者,在非安全模式下有一些意外的副作用。
Addison Crump

1

CJam + GolfScript,9个字节

"0$p"
0$p

这是CJam中的奎因。在GolfScript中,它以尾随换行符输出,这在GolfScript中是一个亮点。

我不确定CJam是否应被视为GolfScript的琐碎衍生物。但是我认为它们是完全不同的,至少不是无关紧要的。

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.