【问题标题】:shortest python quine?最短的蟒蛇?
【发布时间】:2011-06-03 05:23:05
【问题描述】:
_='_=%r;print _%%_';print _%_

这是最短的python quine,还是可以做得更好?这似乎改进了The Quine Page 上的所有条目。

我不计算琐碎的“空”程序,也不计算 Terry Reedy 的提交,因为双引号是 sus(如果允许,“hello world”是 quine 吗?或“'”有关系吗?)

【问题讨论】:

  • 顺便说一句,它不适用于 Python 3.x。
  • "还能做得更好吗?"虽然这个问题有明确的答案,但很难回答(除非答案是肯定的并且你有反例)。如果不测试所有可能的较短程序,人们怎么知道?
  • @Howard:在某些时候,没有那么多...
  • 作为记录,_='_=%r;print(_%%_)';print(_%_) 在 python3 中工作。
  • 不过,我更愿意将其写为 r='r=%r;print r%%r';print r%r(对于 python2)。

标签: python python-2.7 quine


【解决方案1】:

我将把它留在这里(另存为 exceptionQuine.py):

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

【讨论】:

  • 为什么一定要保存为exceptionQuine.py?无论文件名如何,错误输出都是代码,不是吗?
  • 没有。假设我将文件保存为 foo.py,输出将是:File "foo.py", line 1 File "exceptionQuine.py", line 1 ^
  • 非常聪明。但是我不确定 stderr 是否算作输出 :-) 另外,您对 Quinn 关于文件名的回复是不是有点开玩笑?
  • 我不在乎别人怎么说,这个答案是最好的。
  • 这怎么比提问者提供的例子短?
【解决方案2】:

从技术上讲,最短的 Python quine 是空文件。除了这个琐碎的案例:

由于 Python 的 print 会自动附加一个换行符,所以 quine 实际上是 _='_=%r;print _%%_';print _%_\n(其中 \n 表示文件中的单个换行符)。

【讨论】:

【解决方案3】:

两个

print open(__file__).read()

任何涉及导入的东西都不是有效的 quines,因为根据定义,quine 不能接受任何输入。读取外部文件被认为是接受输入,因此 quine 无法读取文件——包括它自己。

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

【讨论】:

  • “为了记录,从技术上讲,python 中最短的 quine 是一个空白文件,但这也是一种作弊。”更正:它是作弊。
【解决方案4】:

在一种略带字面意义的方法中,将“最短”表示就语句数量以及字符数而言较短,我有一个不包含任何分号的here。

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,)`)',)

【讨论】:

  • This comment 解释了 OP 对小尺寸(以字节为单位)的兴趣。
  • 这个是我最喜欢的!
  • 请注意,反引号是repr,而不是str。
  • 感谢@CalculatorFeline。我对其进行了编辑以纳入该花絮。
  • 不错!这是带有 f 字符串的 Python 3.6:print((lambda x:f"{x}{x,})")('print((lambda x:f"{x}{x,})")',))
【解决方案5】:

更短:

print(__file__[:-3])

并将文件命名为print(__file__[:-3]).py (Source)

编辑:实际上,

print(__file__)

命名为 print(__file__) 也可以。

【讨论】:

  • 很好地滥用了规则;)
  • 赞成,这很好 :) 我不禁觉得 quine 程序如果独立于文件名工作会更好
  • 此作弊也适用于gcc(以下需要bash):a=$'main(){write(1,__FILE__,29);}'; echo -n "$a" > "$a.c"; gcc "$a.c"; ./a.out | cmp - "$a.c"; echo $?(注意,这不包含任何换行符)
  • 15 字节 + 15 字节文件名 = 30 字节由 PPCG 评分。不够好。
【解决方案6】:

这是另一个类似于postylem 的答案。

Python 3.6:

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

Python 2.7:

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

【讨论】:

  • 啊,是的,也许比我的好一点。
【解决方案7】:

Python 3.8

exec(s:='print("exec(s:=%r)"%s)')

【讨论】:

【解决方案8】:

我会说:

print open(__file__).read()

Source

【讨论】:

  • 这不符合问题的精神。
  • @Nick ODell - 只是提一下!
  • 哦,如果你在括号前加上反斜杠,你帖子中的链接就不会被破坏。
  • 这违反了 quines 的规则。 quine 是一个将自己的源代码写入输出的程序而不读取原始源文件。
  • quines的规则在哪里?你能找到一组不包含该规则的 quines 规则吗?
【解决方案9】:

从 Python 3.8 开始,我有了一个新的 quine!我为此感到非常自豪,因为直到现在我还没有创造出自己的作品。我从_='_=%r;print(_%%_)';print(_%_) 中汲取了灵感,但把它变成了一个函数(只有两个字符)。它使用新的 walrus 运算符。

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

【讨论】:

    【解决方案10】:

    这个最不神秘,cor是a.format(a) a="a={1}{0}{1};print(a.format(a,chr(34)))";print(a.format(a,chr(34)))

    【讨论】:

      【解决方案11】:

      我强烈反对你的解决方案。

      格式化参数% 绝对是一个太高级的高级语言函数。如果允许这样的构造,我想说,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

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

      【讨论】:

      • % 只是一个语言函数,如连接或多行字符串。使用外部资源(例如 quine 中未包含的额外文件)是纯作弊。
      • 你在 C quines 中也禁止 %s 吗?
      • 据我所知,quine 的目的是编写一个程序,在没有外部输入的情况下输出它自己的源。 % 不使用外部源。可以通过两种方式查看导入。您要么将第二个文件视为外部源(从而违反规则),要么将导入的代码视为源的一部分,在这种情况下,您的 quine 不会打印出“完整源”。因此 % 不违反 quine 规则,而您的导入确实如此。
      • @Tino 你“非法”import 声明here
      • @Tino 我猜我好像听不懂你。还有,为什么不允许呢?只是不能读取输入,不能有空程序。
      猜你喜欢
      • 2010-10-27
      • 2010-10-21
      • 2016-05-28
      • 2014-08-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多