Мой на 2016 год в биткойнах! PCG.SE Новогодняя головоломка 2016

17

В протоколе Биткойн 2016 - это особенное число. «Сложность» нахождения хеша для создания нового блока корректируется каждые 2 016 блоков, чтобы приблизительное изменение каждые две недели.

Это число было выбрано потому, что сложность подстраивается так, что каждый блок занимает около 10 минут, а через две недели 2 × 7 × 24 × 6 = 2,016 десятиминутных периодов.


Чтобы отметить это числовое совпадение, новогодняя проблема этого года касается биткойнов - в частности, алгоритма хеширования, который он использует для подписи блоков, SHA-256.

Ваша задача - создать программу, которая будет принимать байтовый ввод (по крайней мере в ASCII) и выводить одноразовый номер в байтах (в выбранном вами формате), который будет генерировать хеш SHA-256, содержащий 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)функция, которая принимает байтовый ввод и возвращает хэш SHA256 в любом формате, включая base64.

Программа для этого в наименьшем количестве байтов исходного кода выигрывает.

Джо З.
источник
1
Называй меня сумасшедшим, но разве эта биткойн-добыча не носит другое имя?
Codefun64
1
Также определите «готовую библиотеку». Функция SHA-256 моего языка создает хэш, но не Base64. Поэтому мне также необходимо использовать преобразование в байты, затем преобразование в символы, затем преобразование в Base64.
LegionMammal978
@ LegionMammal978 «Предварительно созданная библиотека» - это любая функция, определенная вне кода, который учитывается для этой задачи. Таким образом, вы можете создать функцию-обертку base64 для вашей функции SHA-256, чтобы использовать ее в этой задаче.
Джо З.
@ Codefun64 Это проблема кода, которая имитирует процедуру, используемую при майнинге биткойнов, но сама по себе не майнит для биткойнов.
Джо З.

Ответы:

7

Perl 5.10+, 39 + 18 = 57 байт

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

Это должно быть выполнено с параметром -nMDigest::SHA=/./командной строки, который включен в число байтов. Он также использует sayфункцию Perl 5.10+ и поэтому должен запускаться с переключателем командной строки -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

Математика, 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}]
njpipeorgan
источник
2
Мы должны создать гольф-версию Wolfram Language, в которой каждая команда заменяется одним или двумя символами. На самом деле, учитывая количество команд, нам может понадобиться использовать три символа для некоторых из менее распространенных.
Майкл Стерн
@MichaelStern Я не могу согласиться больше.
njpipeorgan
@MichaelStern сделал это.
LegionMammal978
@ LegionMammal978 Фантастика! Кстати, почему бы не рассмотреть лучшее имя, как "WOLF"?
njpipeorgan
5

Рубин, 87 86 байт

Я не уверен, правильно ли я понял задачу, но она находит 196870через несколько секунд, если вы введете foo.

require"digest"
gets.chop!
$.+=1until/2016/=~Digest::SHA256.base64digest("#$_#$.")
p$.
daniero
источник
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
beatcracker
источник
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, только дольше.

LegionMammal978
источник
Это много ключевых слов.
Джо З.
1
@JoeZ. Это C # для вас.
LegionMammal978