_='_=%r;print _%%_';print _%_
这是最短的python quine,还是可以做得更好?这个似乎对The Quine Page上的所有条目都有改进。
我不计算琐碎的“空”程序,也不计算 Terry Reedy 的提交,因为双引号是 sus(如果允许的话,“hello world”是 quine 吗?还是“'”? )
_='_=%r;print _%%_';print _%_
这是最短的python quine,还是可以做得更好?这个似乎对The Quine Page上的所有条目都有改进。
我不计算琐碎的“空”程序,也不计算 Terry Reedy 的提交,因为双引号是 sus(如果允许的话,“hello world”是 quine 吗?还是“'”? )
我将把它留在这里(另存为 exceptionQuine.py):
File "exceptionQuine.py", line 1
File "exceptionQuine.py", line 1
^
IndentationError: unexpected indent
从技术上讲,最短的 Python quine 是空文件。除了这个琐碎的案例:
由于 Python 的 print 会自动附加一个换行符,因此 quine 实际上是_='_=%r;print _%%_';print _%_\n
(其中\n
表示文件中的单个换行符)。
两个都
print open(__file__).read()
并且任何涉及导入的东西都不是有效的 quines,因为根据定义,quine 不能接受任何输入。读取外部文件被认为是接受输入,因此 quine 无法读取文件——包括它自己。
为了记录,从技术上讲,python 中最短的 quine 是一个空白文件,但这也有点作弊。
在一种稍微非字面意义上的方法中,就语句数量以及字符数而言,将“最短”表示为短,我这里有一个不包含任何分号的方法。
print(lambda x:x+str((x,)))('print(lambda x:x+str((x,)))',)
在我看来,这是有争议的,因为它都是一个功能,而其他功能则是多个。有人有这样短的吗?
编辑:用户flornquake进行了以下改进(用于repr()
替换str()
和刮掉 6 个字符的反引号):
print(lambda x:x+`(x,)`)('print(lambda x:x+`(x,)`)',)
更短:
print(__file__[:-3])
并命名文件print(__file__[:-3]).py
(Source)
编辑:实际上,
print(__file__)
命名print(__file__)
作品也。
蟒蛇 3.8
exec(s:='print("exec(s:=%r)"%s)')
这是另一个类似于postylem的答案。
蟒蛇 3.6:
print((lambda s:s%s)('print((lambda s:s%%s)(%r))'))
蟒蛇 2.7:
print(lambda s:s%s)('print(lambda s:s%%s)(%r)')
从 Python 3.8 开始,我有了一个新的 quine!我为此感到非常自豪,因为直到现在我还没有创造出自己的作品。我从 中汲取灵感_='_=%r;print(_%%_)';print(_%_)
,但把它做成了一个函数(只有 2 个字符)。它使用新的海象运算符。
print((_:='print((_:=%r)%%_)')%_)
这个最不神秘,cor 是 a.format(a) a="a={1}{0}{1};print(a.format(a,chr(34)))";print(a.format (a,chr(34)))
我严格反对你的解决方案。
格式化参数绝对%
是一种过于高级的高级语言功能。如果允许这样的构造,我会说,那也import
必须被允许。然后我可以通过引入一些其他高级语言构造来构造一个更短的 Quine(顺便说一句,它的功能远没有%
函数强大,所以它不那么先进):
这是一个 Unix shell 脚本创建这样一个quine.py
文件并检查它是否真的有效:
echo 'import x' > quine.py
echo "print 'import x'" > x.py
python quine.py | cmp - quine.py; echo $?
输出0
是的,那是作弊,就像使用%
. 对不起。