跳转至
2020 | 中国科学技术大学第七届信息安全大赛 | General

自复读的复读机

题目

能够复读其他程序输出的程序只是普通的复读机。

顶尖的复读机还应该能复读出自己的源代码。

什么是国际复读机啊(战术后仰)

你现在需要编写两个只有一行 Python 代码的顶尖复读机:

  • 其中一个要输出代码本身的逆序(即所有字符从后向前依次输出)
  • 另一个是输出代码本身的 sha256 哈希值,十六进制小写

Quine

自产生程序,指的是无输入且输出结果为程序自身源码的程序

原理

  • 程序包含两个部分:用于执行输出的代码 A 和表示代码文本的数据 B
  • 代码 A 打印输出数据 B,数据 B 中也包含代码 A

Quine in Python

  • repr():返回描述对象的字符串。在格式化字符串中,转换说明符%r代表repr()
    >>> s = 'Hello'
    >>> repr(s)
    "'Hello'"
    >>> l = [1, 2, 'a']
    >>> repr(l)
    "[1, 2, 'a']"
    
  • 最短的 Python 自产生程序(未考虑回车)
    s = 's=%r;print(s%%s)';print(s%s)
    

参考资料

输出代码本身的逆序

注意要考虑回车

s="s=%r;print((s%%s)[::-1],end='')";print((s%s)[::-1],end='')

输出代码本身的 SHA256 哈希值

字符串s的内容参考执行输出的代码

s="s=%r;import hashlib;print(hashlib.sha256((s%%s).encode()).hexdigest(),end='')";import hashlib;print(hashlib.sha256((s%s).encode()).hexdigest(),end='')


最后更新: 2020年11月8日 23:02:53
Contributors: YanhuiJessica

评论