使用Python2.7。
(顶部编辑,以防遗漏底部的内容:我一直在用exec()执行代码,这使它成为源代码的一部分。关于我使用这个的更多信息在这篇文章的底部)
最近,我对奎因感兴趣。到目前为止,我最接近奎因的尝试是:

_="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()而不需要一个丑陋的循环,并在正确的位置得到引号。
所以现在,这让我再次重复我自己:
有人知道我可以做什么修改吗?

最佳答案

奎因只需要输出自己的源代码,而不需要接收任何输入。它不要求还必须包含执行自身所需的代码。
在python中,只需在交互会话中输入一个quine并检查输出行是否与输入行完全匹配,就可以测试它:

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

这个例子通过使用format参数的repr来解决引用问题。

关于python - 尝试制作奎奴亚藜;不输出引号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22600310/

10-09 05:35
查看更多