创建一个程序,以以下格式打印其源的MD5和:
MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
没有作弊-您不能只读取源文件并计算其总和。该程序不得读取任何外部信息。
当然,您可以使用适用于您的语言的MD5库。
创建一个程序,以以下格式打印其源的MD5和:
MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
没有作弊-您不能只读取源文件并计算其总和。该程序不得读取任何外部信息。
当然,您可以使用适用于您的语言的MD5库。
Answers:
r='r=%r;import md5;print "MD5 sum of my source is: "+md5.new(r%%r).hexdigest()';import md5;print "MD5 sum of my source is: "+md5.new(r%r).hexdigest()
MD5 sum of my source is: bb74dfc895c13ab991c4336e75865426
ideone上的验证
24ba0a79636297dab8803f571d4e3b44 md.py
在linux中使用md5sum
\n
在程序末尾添加换行符(),则会得到您发布的哈希值:24ba0a79636297dab8803f571d4e3b44
。我相当确定您还有多余的换行符。(我相信某些编辑器会自动执行此操作)
s="import md5;print'MD5 sum of my source is: '+md5.new('s=%r;exec s'%s).hexdigest()";exec s
使用不需要重复两次所有操作的Python quine变体。经ideone测试。
$_=q(use Digest::MD5 md5_hex;say"MD5 sum of my source is: ",md5_hex"\$_=q($_);eval");eval
没有TIO链接,因为在TIO上未安装Digest :: MD5。请注意,这要求将语言一致性级别设置为5.10或更高(-M5.010
;根据PPCG规则,这不会带来字节损失。
这是另一个“打印源代码的功能”挑战,这意味着可以通过通用quine构造函数轻松解决它。
$_=q(…"\$_=q($_);eval");eval
我们使用q()
字符串表示法(嵌套)来初始化$_
,这是Perl用于缺少参数的“默认”变量。然后,我们eval
使用一个缺少的参数,以便对内部的字符串q()
进行求值。
里面的字符串q()
描述了如何创建整个程序。我们从字面上指定程序的其余部分,然后使用未转义的内容$_
将整个字符串替换为内部。
因此,该技术创建的字符串的内容与整个程序的源相同;我们可以将其打印出来以制作一个奎纳。不过,我们还可以先做其他事情,制作一个通用的quine构造函数。
use Digest::MD5 md5_hex;say"MD5 sum of my source is: ",md5_hex
非常简单:导入一个内置的MD5,然后打印问题中指定的固定字符串(不值得对其进行压缩,我相信在Perl中,解压缩器将比仅字面说明该字符串占用更多的空间),并使用内置的MD5我们通过通用quine构造函数获得的字符串。
使用发布此挑战时存在的最新版本的Node.js。我已经跟踪了2012年11月9日有关Node.js加密模块的文档,它确实支持我在这里曾经使用的所有功能。
function x(s){return require("crypto").createHash("md5").update(s+";x(x)").digest("hex")};x(x)
如果您不想安装旧版本的Node.js只是为了测试此代码,请放心,它也可以在最新版本中使用。
这是使用ES6箭头功能的版本。
x=s=>require("crypto").createHash("md5").update(`x=${s};x(x)`).digest("hex");x(x)
编辑:感谢Anders Kaseorg指出我的Node.js 0.9.3版本中的一个错误,该错误修复了节省了两个字节的问题。
`${s};x(x)`
不支持。