Milik saya untuk 2016 dalam Bitcoin! Puzzle Tahun Baru PCG.SE 2016

17

Dalam protokol Bitcoin, 2016 adalah angka yang sangat istimewa. "Kesulitan" menemukan hash untuk membuat blok baru disesuaikan setiap 2.016 blok untuk perkiraan perubahan setiap dua minggu.

Jumlah ini dipilih karena kesulitan menyesuaikan diri sehingga setiap blok membutuhkan waktu sekitar 10 menit, dan dalam dua minggu, ada 2 × 7 × 24 × 6 = 2.016 periode sepuluh menit.


Untuk memperingati angka kebetulan ini, masalah Tahun Baru tahun ini adalah tentang Bitcoin - khususnya, algoritma hashing yang digunakan untuk menandatangani blok, SHA-256.

Tugas Anda adalah untuk menciptakan sebuah program yang akan mengambil input byte (setidaknya ASCII) dan output Nonce dalam bytes (dalam format pilihan Anda) yang akan menghasilkan SHA-256 hash yang mengandung 2016di-nya base64 representasi ketika ditambahkan dengan aslinya input byte.

Berikut adalah beberapa contoh solusi yang valid, milik mesin yang telah dihasilkan orang, serta hash yang mereka hasilkan:

> 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.)

Satu-satunya perpustakaan yang dibangun sebelumnya (selain fungsi input dan output standar) yang dapat digunakan oleh program Anda adalah SHA256(bytes)fungsi yang mengambil input byte dan mengembalikan hash SHA256, dalam format apa pun termasuk base64.

Program untuk melakukan ini dalam bytes kode sumber paling sedikit menang.

Joe Z.
sumber
1
Sebut saya gila, tetapi bukankah ini penambangan bitcoin dengan nama lain?
Codefun64
1
Juga, tentukan "perpustakaan yang dibangun sebelumnya". Fungsi SHA-256 bahasa saya menghasilkan hash, tetapi tidak hash Base64. Oleh karena itu, saya juga perlu menggunakan konversi ke byte, lalu konversi ke karakter, lalu konversi ke Base64.
LegionMammal978
@ LegionMammal978 "Perpustakaan yang dibangun sebelumnya" adalah setiap fungsi yang didefinisikan di luar kode yang diperhitungkan untuk tantangan ini. Jadi Anda bisa membuat fungsi wrapper base64 untuk fungsi SHA-256 Anda, untuk menggunakannya dalam masalah ini.
Joe Z.
@ Codefun64 Ini adalah masalah kode yang mensimulasikan prosedur yang digunakan dalam penambangan Bitcoin, tetapi tidak dengan sendirinya menambang untuk bitcoin.
Joe Z.

Jawaban:

7

Perl 5.10+, 39 + 18 = 57 byte

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

Ini perlu dijalankan dengan -nMDigest::SHA=/./saklar baris perintah, yang termasuk dalam jumlah byte. Ini juga menggunakan fitur Perl 5.10+ say, dan karena itu perlu dijalankan dengan -M5.010(atau -E) saklar baris perintah, yang dianggap gratis. Input harus diberikan pada stdin, tanpa baris baru tambahan (kecuali jika Anda ingin baris baru dianggap bagian dari input).

Contoh:

$ 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
Ilmari Karonen
sumber
8

Mathematica, 94

(For[i=0,IntegerDigits[4Hash[#<>ToString@++i,"SHA256"],64]~SequenceCount~{54,52,53,58}<1,];i)&

Fungsi ini akan mencoba bilangan bulat positif sebagai kandidat. Dibutuhkan lebih dari 4 menit di laptop saya untuk mendapatkan jawaban yang benar.

%["foo"]
(* 196870 *)

~5xImplementasi yang lebih lama namun lebih cepat ( ) memanfaatkan paralelisasi:

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
sumber
2
Kita harus membuat versi golf Bahasa Wolfram, dengan setiap perintah diganti dengan satu atau dua karakter. Sebenarnya, mengingat jumlah perintah, kita mungkin perlu menggunakan tiga karakter untuk beberapa yang kurang umum.
Michael Stern
@MichaelStern Saya sangat setuju.
njpipeorgan
@MichaelStern Melakukan itu.
LegionMammal978
@ LegionMammal978 Fantastis! Btw, mengapa tidak mempertimbangkan nama yang lebih baik seperti "SERIGALA"?
njpipeorgan
5

Ruby, 87 86 byte

Saya tidak yakin apakah saya memahami tantangan dengan benar, tetapi ia menemukan 196870dalam beberapa detik jika Anda memberi masukan foo.

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

PowerShell, 150 152 153 byte

while([Convert]::ToBase64String([Security.Cryptography.SHA256]::Create().ComputeHash([Text.Encoding]::UTF8.GetBytes("$args$i")))-notmatch2016){$i++}$i

Contoh

PS > .\BitCoin.ps1 foo
196870

PS > .\BitCoin.ps1 bar
48230

PS > .\BitCoin.ps1 happynewyear
1740131

PS > .\BitCoin.ps1 2016
494069
beatcracker
sumber
2

C #, 179 byte

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;}

Mirip dengan solusi PowerShell, lebih lama.

LegionMammal978
sumber
Itu kata kunci yang banyak.
Joe Z.
1
@ Joz. Itu C # untukmu.
LegionMammal978