Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 奎因?_Python_Quine - Fatal编程技术网

Python 奎因?

Python 奎因?,python,quine,Python,Quine,这是最短的python quine,还是可以做得更好?这一个似乎改善了上的所有条目 我不算那些微不足道的“空”程序,也不算Terry Reedy因为双引号而提交的sus(如果允许的话,“hello world”是奎因?还是“就这一点而言?”)我想说: _='_=%r;print _%%_';print _%_ 从技术上讲,最短的Python quine是空文件。除了这件小事之外: 由于Python的print自动添加了一个换行符,因此quine实际上是\u='\ ur;打印%%';打印?%\u

这是最短的python quine,还是可以做得更好?这一个似乎改善了上的所有条目

我不算那些微不足道的“空”程序,也不算Terry Reedy因为双引号而提交的sus(如果允许的话,“hello world”是奎因?还是“就这一点而言?”)

我想说:

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

从技术上讲,最短的Python quine是空文件。除了这件小事之外:

由于Python的print自动添加了一个换行符,因此quine实际上是
\u='\ ur;打印%%';打印?%\un
(其中,
\n
表示文件中的单个换行符)。

甚至更短:

并将该文件命名为
print(uuuuu文件\[:-3]).py
()

编辑:实际上

print(__file__[:-3])

命名的
print(\uuuu文件)
也有效。

我严格反对您的解决方案

格式化参数
%
显然是一个过于高级的高级语言函数。如果允许这样的构造,我会说,
import
也必须被允许。然后,我可以通过引入一些其他高级语言构造来构造一个较短的Quine(顺便说一句,它比
%
函数的功能要弱得多,所以它不太高级):

下面是一个Unix shell脚本,它创建了这样一个
quine.py
文件,并检查它是否真的有效:

print(__file__)
输出
0

是的,那是作弊,比如使用
%
。对不起。

两者都有

echo 'import x' > quine.py
echo "print 'import x'" > x.py
python quine.py | cmp - quine.py; echo $?
任何涉及导入的东西都不是有效的奎因,因为根据定义奎因不能接受任何输入。读取外部文件被视为接受输入,因此quine无法读取文件——包括其本身


作为记录,从技术上讲,python中最短的quine是一个空白文件,但这也有点欺骗。

在一种稍微非文字的方法中,将“shortest”理解为语句数量和字符计数方面的short,我有一个不包含任何分号的quine

print open(__file__).read()
在我看来,这是有争议的,因为它是一个函数,而其他函数是多个函数。有人有这样短的吗

编辑:用户做了以下改进(用
repr()
的反勾号替换
str()
并删除6个字符):


我只想把这个留在这里(另存为exceptionQuine.py):


下面是另一个类似的答案

Python 3.6:

    File "exceptionQuine.py", line 1
        File "exceptionQuine.py", line 1
        ^
IndentationError: unexpected indent
Python 2.7:

print((lambda s:s%s)('print((lambda s:s%%s)(%r))'))
Python 3.8

exec(s:='print(“exec(s:=%r)”%s)

从Python 3.8开始,我有了一个新的quine!我很自豪,因为直到现在我还没有创造出自己的。我从
”中得到灵感;打印(%%);打印(%41;
,但将其设置为单个函数(只需再添加两个字符)。它使用新的walrus操作符


print(((:='print((:=%r)%%))%.

这是最不神秘的,cor是a.format(a)

a=“a={1}{0}{1};打印(a.format(a,chr(34))”;顺便说一句,print(a.format(a,chr(34))

不能与Python 3.x一起使用。“它能做得更好吗?”虽然这个问题有一个明确的答案,但很难回答(除非答案是肯定的,并且你有一个反例)。在不测试所有可能的较短程序的情况下,一个人怎么知道呢?@Howard:在某种程度上,这些程序并没有那么多……作为记录,
\u=''\ u=%r;打印(%%);print(%\u)
在python3中工作。我更愿意将其写成
r='r=%r;打印r%%r';不过,打印r%r
(用于python2)。这并不符合问题的精神。@Nick ODell-只是说说而已!哦,如果你把反斜杠放在parens之前,你帖子中的链接就不会被破坏。这违反了quines的规则。quine是一个程序,它将自己的源代码作为输出写入,而不读取原始源文件。quine的规则在哪里?你能找到一套不包括这个规则的奎因规则吗?嗯,你是对的。或者,也许可以抑制新行,如
r='r=%r;打印r%%r';打印r%r,
这将长1个字符,在python3中不起作用。@wim:1个字符(在Linux上)。@wim:我的意思是文件中应该有一个实际的换行符,但stackoverflow不便于编写。我不认为“从技术上讲,最短的Python quine是空文件。”。因为:“.
%
只是一个语言函数,就像串联或多行字符串一样。使用外部资源(如quine中未包含的额外文件)显然是欺骗。您是否也禁止C quine中的%s?据我所知,quine的目的是编写一个程序,在没有外部输入的情况下输出自己的源代码。%不使用外部源。可以通过两种方式查看导入。要么考虑第二个文件是外部源(从而打破规则),要么考虑导入的代码作为源的一部分,在这种情况下,奎因不会打印出“完整源”。因此,%并没有违反奎因规则,而你的导入也违反了。@Tino你“取缔了”
import
statements@Tino我想我似乎无法理解你的意思。还有,为什么不允许呢?只是你们不能读取输入,不能有一个空的程序。很好地滥用了规则;)向上投票,这很好:)我忍不住觉得quine程序如果独立于文件名工作就更好了,尽管这个欺骗也适用于
gcc
(以下需要
bash
):
a=$'main(){write(1,uuu FILE_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu29)};echo-n“$a”>“$a.c”;gcc“$a.c”/a、 out | cmp-“$a.c”;echo$?
(注意,这不包含任何换行符)15字节+15字节的文件名=PPCG评分的30字节。不够好。你为什么要保存为例外Quine.py?不管文件名是什么,错误输出都是代码,否?否。假设我将文件保存为foo.py,输出将是:
文件“foo.py”,第1行文件“exceptionQuine.py”,第1行^
非常聪明。但是我不确定stderr是否算作
print(lambda x:x+`(x,)`)('print(lambda x:x+`(x,)`)',)
    File "exceptionQuine.py", line 1
        File "exceptionQuine.py", line 1
        ^
IndentationError: unexpected indent
print((lambda s:s%s)('print((lambda s:s%%s)(%r))'))
print(lambda s:s%s)('print(lambda s:s%%s)(%r)')