En el protocolo Bitcoin, 2016 es un número muy especial. La "dificultad" de encontrar un hash para crear un nuevo bloque se ajusta cada 2,016 bloques para cambiar aproximadamente una vez cada dos semanas.
Se eligió este número porque la dificultad se ajusta a sí misma para que cada bloque demore unos 10 minutos en encontrarse, y en dos semanas, hay 2 × 7 × 24 × 6 = 2,016 períodos de diez minutos.
Para conmemorar esta coincidencia numérica, el problema de Año Nuevo de este año es sobre Bitcoin, específicamente, el algoritmo de hash que usa para firmar bloques, SHA-256.
Su tarea es crear un programa que tomará la entrada de bytes (al menos en ASCII) y generará un nonce en bytes (en el formato que elija) que producirá un hash SHA-256 que contenga 2016
en su representación base64 cuando se agregue al original entrada de byte.
Aquí hay algunos ejemplos de soluciones válidas, cortesía de los motores que la gente ya ha generado, así como los hash que produjeron:
> 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 única biblioteca precompilada (que no sean las funciones de entrada y salida estándar) que su programa puede usar es una SHA256(bytes)
función que toma la entrada de bytes y devuelve un hash SHA256, en cualquier formato, incluido base64.
El programa para hacer esto en la menor cantidad de bytes de código fuente gana.