Meins für 2016 in Bitcoins! PCG.SE Neujahrspuzzle 2016

17

Im Bitcoin-Protokoll ist 2016 eine ganz besondere Nummer. Die "Schwierigkeit", einen Hash zu finden, um einen neuen Block zu erstellen, wird alle 2.016 Blöcke so angepasst, dass sie sich ungefähr alle zwei Wochen ändert.

Diese Zahl wurde gewählt, weil sich der Schwierigkeitsgrad so anpasst, dass es ungefähr 10 Minuten dauert, bis jeder Block gefunden ist, und in zwei Wochen gibt es 2 × 7 × 24 × 6 = 2.016 Zehn-Minuten-Perioden.


Zum Gedenken an diesen numerischen Zufall geht es beim diesjährigen Neujahrsproblem um Bitcoin - insbesondere um den Hashing-Algorithmus zum Signieren von Blöcken, SHA-256.

Ihre Aufgabe ist es, ein Programm zu erstellen, das Byte-Eingaben (in mindestens ASCII) und eine Nonce in Byte (im Format Ihrer Wahl) ausgibt, die einen SHA-256-Hash erzeugt, der 2016in seiner base64- Darstellung enthalten ist, wenn er an das Original angehängt wird Byte-Eingabe.

Hier sind einige Beispiele für gültige Lösungen, die mit freundlicher Genehmigung der Motoren erstellt wurden, sowie die von ihnen erstellten Hashes:

> 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.)

Die einzige vorgefertigte Bibliothek (außer den Standard-Eingabe- und Ausgabefunktionen), die Ihr Programm verwenden kann, ist eine SHA256(bytes)Funktion, die Byteeingaben akzeptiert und einen SHA256-Hash in einem beliebigen Format einschließlich base64 zurückgibt.

Das Programm, das dies in den wenigsten Bytes des Quellcodes ausführt, gewinnt.

Joe Z.
quelle
1
Nennen Sie mich verrückt, aber trägt dieser Bitcoin-Bergbau nicht einen anderen Namen?
Codefun64
1
Definieren Sie auch eine "vorgefertigte Bibliothek". Die SHA-256-Funktion meiner Sprache erzeugt den Hash, aber nicht den Base64-Hash. Daher müsste ich auch die Konvertierung in Bytes, dann die Konvertierung in Zeichen und dann die Konvertierung in Base64 verwenden.
LegionMammal978
@ LegionMammal978 Eine "vorgefertigte Bibliothek" wäre jede außerhalb des Codes definierte Funktion, die für diese Herausforderung zählt. Sie können also eine Base64-Wrapper-Funktion für Ihre SHA-256-Funktion erstellen, um sie bei diesem Problem zu verwenden.
Joe Z.
@ Codefun64 Dies ist ein Code-Problem, das die Prozedur simuliert , die beim Bitcoin-Mining verwendet wird, aber selbst nicht für Bitcoins verwendet wird.
Joe Z.

Antworten:

7

Perl 5.10+, 39 + 18 = 57 Bytes

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

Dies muss mit der -nMDigest::SHA=/./Befehlszeilenoption ausgeführt werden, die in der Byteanzahl enthalten ist. Es verwendet auch die Perl 5.10+ say-Funktion und muss daher mit dem -M5.010(oder -E) Befehlszeilenschalter ausgeführt werden, der als kostenlos gilt. Die Eingabe sollte in stdin ohne nachfolgende Zeilenumbrüche erfolgen (es sei denn, Sie möchten, dass die Zeilenumbrüche als Teil der Eingabe betrachtet werden).

Beispiele:

$ 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
Ilmari Karonen
quelle
8

Mathematica, 94

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

Diese Funktion probiert positive ganze Zahlen als Kandidaten aus. Auf meinem Laptop dauert es über 4 Minuten, um die richtige Antwort zu erhalten.

%["foo"]
(* 196870 *)

Eine längere, jedoch schnellere ( ~5x) Implementierung nutzt die Parallelisierung:

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}]
njpipeorgan
quelle
2
Wir sollten eine Golfversion von Wolfram Language erstellen, bei der jeder Befehl durch ein oder zwei Zeichen ersetzt wird. In Anbetracht der Anzahl der Befehle müssen wir möglicherweise drei Zeichen für einige der weniger gebräuchlichen verwenden.
Michael Stern
@MichaelStern Ich kann nicht mehr zustimmen.
njpipeorgan
@MichaelStern Hab das gemacht.
LegionMammal978
@ LegionMammal978 Fantastisch! Übrigens, warum nicht einen besseren Namen wie "WOLF" in Betracht ziehen?
Njpipeorgan
5

Ruby, 87-86 Bytes

Ich bin nicht sicher, ob ich die Herausforderung richtig verstanden habe, aber sie wird 196870in wenigen Sekunden gefunden, wenn Sie Eingaben machen foo.

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

PowerShell, 150 152 153 Byte

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

Beispiel

PS > .\BitCoin.ps1 foo
196870

PS > .\BitCoin.ps1 bar
48230

PS > .\BitCoin.ps1 happynewyear
1740131

PS > .\BitCoin.ps1 2016
494069
Beatcracker
quelle
2

C # 179 Bytes

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;}

Ähnlich wie bei der PowerShell-Lösung, nur länger.

LegionMammal978
quelle
Das sind viele Schlüsselwörter.
Joe Z.
1
@JoeZ. Das ist C # für dich.
LegionMammal978