2016年以比特币开采!PCG.SE新年拼图2016


17

在比特币协议中,2016是一个非常特殊的数字。每2,016个块调整一次查找哈希值以创建新块的“难度”,大约每两周更改一次。

选择该数字是因为难度会自行调整,因此发现每个区块大约需要10分钟,并且在两周内有2×7×24×6 = 2,016十分钟的时间段。


为了纪念这种数字上的巧合,今年新年的问题是关于比特币的-特别是,它用于签署块SHA-256的哈希算法。

您的任务是创建一个程序,该程序将接受字节输入(至少为ASCII)并输出字节(以您选择的格式)的随机数,该随机数将产生SHA-256哈希,其中包含 2016在它的base64表示时附加到原来的字节输入。

以下是一些有效解决方案的示例,这些示例由人们已经产生的引擎以及产生的哈希表提供:

> foo
Nonce: 196870
SHA256 hash: OCUdDDtQ42wUlKz2016x+NROo8P2lbJf8F4yCKedTLE=

> bar
Nonce: 48230
SHA256 hash: CNcaOCQgT7bnlQzQPXNwuBu8/LYEdk2016khRaROyZk=

> happynewyear
Nonce: 1740131
SHA256 hash: XsKke6z2016BzB+wRNCm53LKJ6TW6ir66GwuC8oz1nQ=

> 2016
Nonce: 494069
SHA256 hash: rWAHW2YFhHCr22016zw+Sog6aW76eImgO5Lh72u6o5s=

(note: the nonces don't actually have to be ASCII numbers; you can do
 any byte input you find convenient.)

您的程序唯一可以使用的预构建库(标准输入和输出函数除外)是一个SHA256(bytes)接受字节输入并返回SHA256散列的函数,采用任何格式,包括base64。

该程序以最少的源代码字节为准。


1
叫我疯了,但是这个比特币挖矿难道不是另一个名字吗?
Codefun64 '16

1
另外,定义一个“预构建库”。我的语言的SHA-256函数生成哈希,但不会生成Base64哈希。因此,我还需要使用转换为字节,然后转换为字符,然后转换为Base64。
LegionMammal978 '16

@ LegionMammal978“预构建库”可以是在代码之外定义的,对此挑战至关重要的任何函数。因此,您可以为SHA-256函数创建base64包装函数,以便在此问题中使用它。
Joe Z.

@ Codefun64这是一个代码问题,可模拟比特币挖掘中使用的过程,但本身不会挖掘比特币。
Joe Z.

Answers:


7

Perl 5.10 +,39 + 18 = 57字节

sha256_base64($_.++$i)!~2016?redo:say$i

这需要使用-nMDigest::SHA=/./命令行开关运行,该开关包含在字节数中。它还使用Perl 5.10+ say功能,因此需要使用-M5.010(或-E)命令行开关(被认为是免费的)运行。 输入应在stdin上提供,且不包含尾随换行符(除非您希望将换行符视为输入的一部分)。

例子:

$ echo -n foo | perl -nMDigest::SHA=/./ -E 'sha256_base64($_.++$i)!~2016?redo:say$i'
196870
$ echo -n bar | perl -nMDigest::SHA=/./ -E 'sha256_base64($_.++$i)!~2016?redo:say$i'
48230
$ echo -n happynewyear | perl -nMDigest::SHA=/./ -E 'sha256_base64($_.++$i)!~2016?redo:say$i'
1740131
$ echo -n 2016 | perl -nMDigest::SHA=/./ -E 'sha256_base64($_.++$i)!~2016?redo:say$i'
494069

8

Mathematica,94岁

(For[i=0,IntegerDigits[4Hash[#<>ToString@++i,"SHA256"],64]~SequenceCount~{54,52,53,58}<1,];i)&

此函数将尝试使用正整数作为候选对象。我的笔记本电脑需要4分钟以上的时间才能得到正确的答案。

%["foo"]
(* 196870 *)

更长但更快的~5x实现使用并行化:

f[k_]:=
    Do[If[Length@#>0,Return[i+#[[1,1]]]]&@
        Position[ParallelMap[IntegerDigits[4Hash[k<>ToString@#,"SHA256"],64]
            ~SequenceCount~{54,52,53,58}&,i+Range@1*^4],1]
        ,{i,0,∞,1*^4}]

2
我们应该创建Wolfram语言的高尔夫版本,每个命令都替换为一个或两个字符。实际上,在给定命令数量的情况下,对于一些不太常见的命令,我们可能需要使用三个字符。
Michael Stern

@MichaelStern我不能同意。
njpipeorgan


@ LegionMammal978太棒了!顺便说一句,为什么不考虑一个更好的名字,如“ WOLF”?
njpipeorgan

5

Ruby,87 86个字节

我不确定我是否正确理解了挑战,但是196870如果您输入,它会在几秒钟后发现foo

require"digest"
gets.chop!
$.+=1until/2016/=~Digest::SHA256.base64digest("#$_#$.")
p$.

5

PowerShell中,150个152 153字节

while([Convert]::ToBase64String([Security.Cryptography.SHA256]::Create().ComputeHash([Text.Encoding]::UTF8.GetBytes("$args$i")))-notmatch2016){$i++}$i

PS > .\BitCoin.ps1 foo
196870

PS > .\BitCoin.ps1 bar
48230

PS > .\BitCoin.ps1 happynewyear
1740131

PS > .\BitCoin.ps1 2016
494069

2

C#,179个字节

s=>{int i=0;while(!System.Convert.ToBase64String(System.Security.Cryptography.SHA256.Create().ComputeHash(System.Text.Encoding.UTF8.GetBytes(s+i))).Contains("2016"))i++;return i;}

与PowerShell解决方案类似,只是更长。


有很多关键字。
Joe Z.

1
@JoeZ。那就是您的C#。
LegionMammal978 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.