Шахта за 2016 рік у біткойнах! PCG.SE Новорічна головоломка 2016 року


17

У протоколі Bitcoin, 2016 рік - це дуже особливе число. "Складність" пошуку хешу для створення нового блоку коригується кожні 2016 блоків, щоб приблизно змінюватись раз на два тижні.

Це число було обрано тому, що складність підлаштовується так, що для кожного блоку потрібно близько 10 хвилин, і за два тижні виникають 2 × 7 × 24 × 6 = 2,016 десятихвилинні періоди.


Щоб відзначити цей чисельний збіг, новорічна проблема цього року стосується Bitcoin - конкретно алгоритму хешування, який він використовує для підписання блоків, 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=/./допомогою перемикача командного рядка, який включений у кількість байтів. Він також використовує функцію Perl 5.10+ sayі тому її потрібно запустити за допомогою перемикача командного рядка -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}]

2
Ми повинні створити гольф-версію мови Wolfram Language, причому кожна команда замінюється одним або двома символами. Насправді, враховуючи кількість команд, нам може знадобитися використовувати три символи для деяких менш поширених.
Майкл Стерн

@MichaelStern Я більше не можу погодитися.
njpipeorgan


@ LegionMammal978 Фантастичний! Btw, чому б не вважати кращою назвою на кшталт "WOLF"?
njpipeorgan

5

Рубі, 87 86 байт

Я не впевнений, чи правильно я зрозумів виклик, але він знайде 196870через кілька секунд, якщо ви введете свій внесок foo.

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

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

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, просто довше.


Це дуже багато ключових слів.
Джо З.

1
@JoeZ. Це для вас C #.
LegionMammal978
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.