ビットコインで2016年の鉱山!PCG.SE新年のパズル2016


17

ビットコインプロトコルでは、2016年は非常に特別な数字です。ハッシュを見つけて新しいブロックを作成する「難易度」は、2,016ブロックごとに調整され、2週間に1回の変化を概算します。

この数値が選択された理由は、難易度が調整されて、すべてのブロックが見つかるまで約10分かかり、2週間で2×7×24×6 = 2,016の10分の期間があるためです。


この数値の偶然の一致を記念して、今年の新年の問題はビットコイン、具体的にはブロックに署名するために使用するハッシュアルゴリズムSHA-256についてです。

あなたの仕事は含んでSHA-256ハッシュを生成すること(お好みの形式で)Aナンスのバイトバイト(少なくともASCII)で入力と出力を取るプログラムを作成することで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)base64を含む任意の形式でバイト入力を受け取り、SHA256ハッシュを返す関数です。

ソースコードの最小バイトでこれを行うプログラムが勝ちます。


1
私をクレイジーと呼んでください。しかし、このビットコインは別の名前でマイニングしているのではありませんか?
Codefun64

1
また、「事前に構築されたライブラリ」を定義します。私の言語のSHA-256関数はハッシュを生成しますが、Base64ハッシュは生成しません。したがって、バイトへの変換、文字への変換、Base64への変換も使用する必要があります。
LegionMammal978

@ LegionMammal978「事前に構築されたライブラリ」は、このチャレンジの対象となるコードの外部で定義された関数です。この問題で使用するために、SHA-256関数のbase64ラッパー関数を作成できます。
ジョーZ.

@ Codefun64これは、ビットコインマイニングで使用される手順をシミュレートするコードの問題ですが、ビットコインのマイニングは行いません。
ジョーZ.

回答:


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言語のゴルフバージョンを作成し、すべてのコマンドを1つか2つのキャラクターに置き換えます。実際、コマンドの数を考えると、あまり一般的でないもののいくつかに3文字を使用する必要があるかもしれません。
マイケルスターン

@MichaelStern私はこれ以上同意できません。
-njpipeorgan


おはようございます!ところで、「WOLF」のようなより良い名前を考えてみませんか?
-njpipeorgan

5

ルビー、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ソリューションと同様に、さらに長くなります。


それはたくさんのキーワードです。
ジョーZ.

1
@JoeZ。それはあなたのためのC#です。
LegionMammal978
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.