W protokole Bitcoin 2016 to bardzo szczególna liczba. „Trudność” znalezienia skrótu w celu utworzenia nowego bloku jest dostosowywana co 2016 bloków w celu przybliżonej zmiany raz na dwa tygodnie.
Ta liczba została wybrana, ponieważ trudność dostosowuje się tak, że znalezienie każdego bloku zajmuje około 10 minut, a za dwa tygodnie są 2 × 7 × 24 × 6 = 2016 dziesięciominutowych okresów.
Aby upamiętnić ten numeryczny zbieg okoliczności, tegoroczny problem noworoczny dotyczy Bitcoinów - w szczególności algorytmu haszującego używanego do podpisywania bloków, SHA-256.
Twoim zadaniem jest stworzenie programu, który pobierze dane bajtowe (co najmniej ASCII) i wyświetli wartość nonce w bajtach (w wybranym przez Ciebie formacie), która po dodaniu do oryginału wygeneruje skrót SHA-256 zawierający 2016
w swojej reprezentacji base64 wprowadzanie bajtów.
Oto kilka przykładów prawidłowych rozwiązań, dzięki uprzejmości silników, które ludzie już wygenerowali, a także wygenerowanych przez nich skrótów:
> 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.)
Jedyną gotową biblioteką (inną niż standardowe funkcje wejścia i wyjścia), z której może korzystać Twój program, jest SHA256(bytes)
funkcja pobierająca dane bajtowe i zwracająca skrót SHA256 w dowolnym formacie, w tym base64.
Program do wykonania tego w najmniejszej liczbie bajtów kodu źródłowego wygrywa.
Odpowiedzi:
Perl 5.10+, 39 + 18 = 57 bajtów
Należy to uruchomić za pomocą
-nMDigest::SHA=/./
przełącznika wiersza polecenia, który jest uwzględniony w liczbie bajtów. Korzysta również z funkcji Perl 5.10+say
i dlatego musi być uruchamiany za pomocą przełącznika linii poleceń-M5.010
(lub-E
), który jest uważany za wolny. Dane wejściowe powinny być podawane na standardowym wejściu, bez końcowego nowego wiersza (chyba że chcesz, aby nowy wiersz był uważany za część wejścia).Przykłady:
źródło
Mathematica, 94
Ta funkcja wypróbuje dodatnie liczby całkowite jako kandydatów. Prawidłowa odpowiedź na moim laptopie zajmuje 4 minuty.
W
~5x
implementacji dłuższej, ale szybszej ( ) wykorzystywana jest równoległość:źródło
Rubin,
8786 bajtówNie jestem pewien, czy poprawnie zrozumiałem wyzwanie, ale znajdziesz je
196870
za kilka sekund, jeśli wpiszeszfoo
.źródło
PowerShell, 150
152153bajtyPrzykład
źródło
C #, 179 bajtów
Podobne do rozwiązania PowerShell, tylko dłużej.
źródło