3

使用python 2.7。

(在顶部进行编辑,以防您错过底部的某些内容:我一直在使用 exec() 执行代码,这使其成为源代码的一部分。有关我使用它的更多信息在这篇文章的底部)

最近,我对quines产生了兴趣。到目前为止,我最接近 quine 的尝试是:

_="print '_={0}'.format(_)"

不幸的是,这打印了这个

_=print '_={0}'.format(_)

而不是这个

_="print '_={0}'.format(_)"

这是一个主要问题,因为执行

_=print '_={0}'.format(_)

会报错,和原源代码不一样。

我一直在努力把那些引号放在那里。我尝试的一种方法是使用转义符来做到这一点:

_="print '_=\"{0}\"'.format(_)"

并打印:

_="print '_="{0}"'.format(_)"

该代码将再次打印

_=print '_={0}'.format(_)

这和错误是不一样的。有人对我可以进行的修改有任何想法吗?

而且,当我写这篇文章时,我意识到了另外一些事情。我一直在用 exec() 执行代码,而这个 quine 只能用 exec() 运行,这使得 exec() 成为代码的一部分,所以也需要添加。因此,现在添加了 exec() 的另一次尝试:

_=print '_={0}'.format(_); exec(_)

但这会产生一个可怕的循环并且仍然缺少引号

>>>> _="print '_={0}'.format(_); exec(_)"; exec(_)
_=print '_={0}'.format(_); exec(_)
_=print '_={0}'.format(_); exec(_)
_=print '_={0}'.format(_); exec(_)
_=print '_={0}'.format(_); exec(_)
_=print '_={0}'.format(_); exec(_)
_=print '_={0}'.format(_); exec(_)
[etc]

所以,现在我需要让 exec() 没有丑陋的循环,并在正确的位置获得引号。

所以现在,这让我再次重复自己:有没有人对我可以进行的修改有任何想法?

4

1 回答 1

3

quine 只需要输出它自己的源代码而不接收任何输入。它不要求它还必须包含执行自身所需的代码。

在 python 中,您可以通过简单地在交互式会话中输入它并检查输出行是否与输入行完全匹配来测试 quine:

>>> _ = '_ = {!r}; print(_.format(_))'; print(_.format(_))
_ = '_ = {!r}; print(_.format(_))'; print(_.format(_))

此示例通过使用 to 参数的 repr 来解决您的引用问题format

于 2014-03-24T04:39:57.210 回答