错误(或警告)信号线也是常规信号线[关闭]


9

(受到对一个老问题的评论的启发。)

背景

一个错误喹(也称为“Kimian喹”)是一种程序,该程序编译或运行时,使编译器/解释器/运行时进行打印,其具有相同的文本到程序本身,而不是其他的错误消息。出于此挑战的目的,我们在广义上定义“错误”,也包括警告。

任务

在这项挑战中,我们正在寻找 也是一个错误提示。执行时,程序必须正常打印自己的源代码(即,不作为错误/警告消息);这必须是适当的quine(即程序的某些部分必须对输出的不同部分进行编码)。此外,编译和执行程序必须使实现将程序的源代码(而不是其他任何内容)打印为错误或警告消息。(请注意,这意味着您将无法使用会阻止程序正常执行的语言使用编译时错误。)换句话说,该程序的源代码将被打印两次,每种方法一次。

澄清说明

  • 在大多数情况下,很明显什么是错误不是警告消息。我们在这里不区分两者。在模棱两可的情况下,将错误/警告消息定义为实现所输出的任何文本,或者:1.由于执行命令以外的其他原因(或与该语言最接近的等效内容);或2.这不是将其作为输出生成的命令的输入的一部分。
  • 信息框的错误/警告部分不必是适当的信息框(尽管在大多数情况下,这是偶然的,因为大多数错误和警告消息都包含大量固定文本)。
  • 程序输出多个错误/警告是可以接受的,这些错误/警告在串联在一起时构成程序的源。输出未出现在源代码中的错误/警告是不可接受的。
  • 与许多挑战不同,在此挑战中,赋予编译器的开关和程序文件名可能非常相关。鉴于可能无法通过其他方式解决挑战,因此我愿意在这里保持灵活性,尽管如果您以不寻常的方式运行实现,请记住PPCG规则为此收取了字节罚款(等于您需要以最短的“正常”方式在命令行上添加运行程序的权限),因此,您需要在帖子中指定罚款的大小。(例如,如果您使用的解释器从文件中读取程序,并且对文件名没有特别限制,则运行程序的最短的常规方法是从文件名中包含1个字符的文件;因此,
  • 您使用的编译器/解释器版本可能是相关的,因此,作为提交的一部分,请说明程序可在其上工作以及需要哪个版本的特定编译器或解释器。(例如,C提交的标题中可能显示“ C(gcc 6.2.0)”。)
  • 请注意,并非所有语言都可以完成此任务。在目前使用的语言中,最简单的方法可能是找到错误或警告消息,可以为其自定义文本的某些子集(通过更改消息中引用的内容的名称;文件名是常见的选择)在这里,但不是唯一的)。如果有人发现使用固定文本的错误和警告消息来做到这一点,我会特别感动(并感到惊讶)。

胜利条件

这是一个 挑战,因此,如果条目的字节数较小,则认为该条目更好。这样一来,一旦您的程序完全可以运行,您就希望对其进行优化以尽可能减少字节数。(但是,如果已经有一个较短的条目,尤其是使用另一种语言,请不要气;;我们真正要寻找的是尽可能地缩短程序背后的特定算法或想法,但要看到多个使用不同语言或依赖不同原理的解决方案总是值得的。)


2
正如我在聊天中所说,我认为第一个要点尚不清楚。在大多数情况下,很明显,什么是/不是错误/警告消息只是作为讨论和语言咨询的起点。
丹尼斯

@丹尼斯:我原则上同意情况不是很好,但是另一方面却没有想出具体的方法来改善它;删除显然是错误消息的异常可能会导致某些语言出现一些非常意外的情况,这很可能造成比其治愈更多的损害;如果您认为您可以改善问题,那么我不反对对其进行编辑(我也不认为PPCG上的问题应该具有“所有权”,尽管那是一个不同的问题)

就目前而言,我认为问题尚不清楚,缺乏客观的有效性标准。我同意我提议的更改可能会使情况变得更糟。一种可能的措施是搁置挑战,然后将其重新发布到沙箱中。
丹尼斯

1
我暂时搁置了挑战。我希望您重新考虑将其重新发布到沙箱中。这是一个非常有趣的想法,丢掉它是可耻的。
丹尼斯,

1
沙盒帖子在这里。(我正在考虑将其编辑为问题,但这会使帖子进入重新打开队列,这会适得其反,因为如果问题解决的时间和时间都将使其更难以重新打开。)

Answers:


9

JavaScript(Firefox 50),153个字节

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})

说明

这里的想法是从我发现的最容易修改的JS quine开始:

".replace(/.+/,x=>alert(uneval(x)+x))".replace(/.+/,x=>alert(uneval(x)+x))

throw关键字是一个简单的方法,使之抛出自己的代码,以及:

".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})

但是,有一个小问题:Firefox在抛出的消息前添加Error:。幸运的Error: mycode是实际上是有效的JavaScript!(要了解更多信息,请访问MDN。)

Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})

糟糕,这提醒了错误的事情:

".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: 

由于引号不再位于代码的开头,uneval(x)+x因此不会为我们提供正确的结果。解决此问题的最佳方法是在占位字符串的位置添加占位符:

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x})

嗯,现在Error:错误消息中还有其他内容。让我们通过切割字符串来解决此问题:

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})

最后,输出和错误消息都与代码相同!我会添加一个堆栈代码段,但是在任何浏览器中的代码段中似​​乎都无法使用。


5

Python 2,217 80 51字节

尾随换行是必需的。

s='s=%r;print s%%s;exit(s%%s)';print s%s;exit(s%s)

在线尝试

我从一个简单的方法开始:

s='s=%r;print s%%s';print s%s

然后我最后添加raise了一个IOError

s='s=%r;print s%%s;raise IOError(s%%s)';print s%s;raise IOError(s%s)

不幸的是,回溯导致了问题(我无法使其完全消失),并且IOError: <code here>即使删除了回溯,异常的名称也总是像一样打印在前面。

然后,我发现了这个有用的SO答案,并针对我的目的对其进行了修改。

然后,我发现我可以跳过创建自己的类并可以使用sys.exit,从而使我的代码更短。


1
我认为这不符合质询规范中错误的定义,因为它不是执行命令以外的结果,也不是将其生成为输出的命令输入的一部分。就是说,简单的exit工作在这里很好。不需要sys
丹尼斯

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.