No protocolo Bitcoin, 2016 é um número muito especial. A "dificuldade" de encontrar um hash para criar um novo bloco é ajustada a cada 2.016 blocos para aproximar a alteração uma vez a cada duas semanas.
Esse número foi escolhido porque a dificuldade se ajusta de modo que cada bloco leva cerca de 10 minutos para ser encontrado e, em duas semanas, existem 2 × 7 × 24 × 6 = 2.016 períodos de dez minutos.
Para comemorar essa coincidência numérica, o problema do ano novo é sobre Bitcoin - especificamente, o algoritmo de hash usado para assinar blocos, SHA-256.
Sua tarefa é criar um programa que receba entrada de bytes (pelo menos ASCII) e produza um nonce em bytes (no formato de sua escolha) que produzirá um hash SHA-256 contendo 2016
em sua representação base64 quando anexado ao original entrada de bytes.
Aqui estão alguns exemplos de soluções válidas, cortesia dos motores que as pessoas já geraram, bem como os hashes que eles produziram:
> 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.)
A única biblioteca pré-criada (além das funções de entrada e saída padrão) que seu programa pode usar é uma SHA256(bytes)
função que recebe entrada de bytes e retorna um hash SHA256, em qualquer formato, incluindo base64.
O programa para fazer isso no menor número de bytes de código-fonte vence.
Respostas:
Perl 5.10+, 39 + 18 = 57 bytes
Isso precisa ser executado com a
-nMDigest::SHA=/./
opção de linha de comando, incluída na contagem de bytes. Ele também usa osay
recurso Perl 5.10+ e, portanto, precisa ser executado com a opção de linha de comando-M5.010
(ou-E
), que é considerada livre. A entrada deve ser fornecida no stdin, sem uma nova linha à direita (a menos que você queira que a nova linha seja considerada parte da entrada).Exemplos:
fonte
Mathematica, 94
Esta função tentará números inteiros positivos como candidatos. Demora mais de 4 minutos no meu laptop para obter a resposta correta.
Uma
~5x
implementação mais longa, porém mais rápida ( ), faz uso da paralelização:fonte
Ruby,
8786 bytesNão tenho certeza se entendi o desafio corretamente, mas ele encontra
196870
em alguns segundos se você inserirfoo
.fonte
PowerShell, 150
152153bytesExemplo
fonte
C #, 179 bytes
Semelhante à solução PowerShell, apenas por mais tempo.
fonte