Dans le protocole Bitcoin, 2016 est un numéro très spécial. La «difficulté» de trouver un hachage pour créer un nouveau bloc est ajustée tous les 2 016 blocs pour changer approximativement une fois toutes les deux semaines.
Ce nombre a été choisi parce que la difficulté s'ajuste pour que chaque bloc prenne environ 10 minutes à trouver, et en deux semaines, il y a 2 × 7 × 24 × 6 = 2 016 périodes de dix minutes.
Pour commémorer cette coïncidence numérique, le problème du Nouvel An de cette année concerne le Bitcoin - en particulier, l'algorithme de hachage qu'il utilise pour signer les blocs, SHA-256.
Votre tâche consiste à créer un programme qui prendra des octets en entrée (au moins en ASCII) et produira un nonce en octets (au format de votre choix) qui produira un hachage SHA-256 contenant 2016
dans sa représentation base64 lorsqu'il sera ajouté à l'original entrée octet.
Voici quelques exemples de solutions valables, gracieuseté des moteurs que les gens ont déjà générés, ainsi que des hachages qu'ils ont produits:
> 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.)
La seule bibliothèque prédéfinie (autre que les fonctions d'entrée et de sortie standard) que votre programme peut utiliser est une SHA256(bytes)
fonction qui accepte des octets et renvoie un hachage SHA256, dans n'importe quel format, y compris base64.
Le programme pour ce faire dans le moins d'octets de code source gagne.
Réponses:
Perl 5.10+, 39 + 18 = 57 octets
Cela doit être exécuté avec le
-nMDigest::SHA=/./
commutateur de ligne de commande, qui est inclus dans le nombre d'octets. Il utilise également la fonctionnalité Perl 5.10+say
, et doit donc être exécuté avec le commutateur de ligne de commande-M5.010
(ou-E
), qui est considéré comme gratuit. L'entrée doit être fournie sur stdin, sans retour à la ligne (sauf si vous voulez que le retour à la ligne soit considéré comme faisant partie de l'entrée).Exemples:
la source
Mathematica, 94
Cette fonction essaiera des entiers positifs comme candidats. Cela prend plus de 4 minutes sur mon ordinateur portable pour obtenir la bonne réponse.
Une
~5x
implémentation plus longue mais plus rapide ( ) utilise la parallélisation:la source
Rubis,
8786 octetsJe ne sais pas si j'ai bien compris le défi, mais il trouve
196870
en quelques secondes si vous entrezfoo
.la source
PowerShell, 150
152153octetsExemple
la source
C #, 179 octets
Semblable à la solution PowerShell, juste plus longtemps.
la source