Bitcoins'te 2016 Madeni! PCG.SE Yılbaşı Bulmaca 2016


17

Bitcoin protokolünde, 2016 çok özel bir sayıdır. Yeni bir blok oluşturmak için bir karma bulmanın "zorluğu", her 2.016 blokta bir yaklaşık iki haftada bir yaklaşık olarak değişecek şekilde ayarlanır.

Bu sayı seçildi, çünkü zorluk her bloğun bulunması yaklaşık 10 dakika sürecek ve iki hafta içinde 2 × 7 × 24 × 6 = 2.016 on dakikalık periyot olacak şekilde ayarlanıyor.


Bu sayısal tesadüfü anmak için, bu yılki Yeni Yıl sorunu Bitcoin ile ilgilidir - özellikle, blokları imzalamak için kullandığı karma algoritma, SHA-256.

Göreviniz bir (en ASCII adresinde) bayt girdi alacak program ve içeren SHA-256 karma üretecek (seçtiğiniz biçiminde) çıkışı bir Nonce içinde bayt yaratmaktır 2016onun içinde base64 orijinaline eklenen zaman temsil bayt girdisi.

Geçerli çözümlerin, insanların zaten oluşturdukları motorların izniyle ve ürettikleri karmaların bazı örnekleri:

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

Programınızın kullanabileceği önceden oluşturulmuş tek kitaplık (standart giriş ve çıkış işlevleri dışında), SHA256(bytes)bayt girdisini alan ve base64 dahil olmak üzere herhangi bir biçimde bir SHA256 karma döndüren bir işlevdir.

Bunu kaynak kodun en az baytında yapacak program kazanır.


1
Bana deli de, ama bu bitcoin madenciliği başka bir isimle değil mi?
Codefun64

1
Ayrıca, "önceden oluşturulmuş kitaplık" tanımlayın. Dilimin SHA-256 işlevi karmayı üretir, ancak Base64 karmasını oluşturmaz. Bu nedenle, baytlara dönüştürme, sonra karakterlere dönüştürme, sonra Base64'e dönüştürme kullanmam gerekir.
LegionMammal978

@ LegionMammal978 "Önceden oluşturulmuş kitaplık", bu meydan okuma için geçerli olan kodun dışında tanımlanan herhangi bir işlev olabilir. Böylece bu problemde kullanmak için SHA-256 işleviniz için base64 sarmalayıcı işlevi oluşturabilirsiniz.
Joe Z.

@ Codefun64 Bu, Bitcoin madenciliğinde kullanılan prosedürü simüle eden , ancak bitcoinlerin kendisinde olmayan bir kod sorunudur .
Joe Z.

Yanıtlar:


7

Perl 5.10+, 39 + 18 = 57 bayt

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

Bunun -nMDigest::SHA=/./bayt sayısına dahil edilen komut satırı anahtarıyla çalıştırılması gerekir . Ayrıca Perl 5.10+ sayözelliğini kullanır ve bu nedenle ücretsiz olarak kabul edilen -M5.010(veya -E) komut satırı anahtarıyla çalıştırılması gerekir . Girdi, izleyen bir satırsonu olmadan stdin'de sağlanmalıdır (satırsonunun girdinin bir parçası olarak değerlendirilmesini istemiyorsanız).

Örnekler:

$ 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

Mathematica, 94

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

Bu işlev aday olarak pozitif tamsayıları dener. Doğru cevabı almak dizüstü bilgisayarımda 4 dakikadan fazla sürüyor.

%["foo"]
(* 196870 *)

Ancak daha hızlı ( ~5x) uygulama paralelleştirmeyi kullanır:

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
Her komutun bir veya iki karakterle değiştirildiği bir Wolfram Dili golf versiyonu oluşturmalıyız. Aslında, komutların sayısı düşünüldüğünde, daha az yaygın olanlardan bazıları için üç karakter kullanmamız gerekebilir.
Michael Stern

@MichaelStern Daha fazla katılıyorum.
njpipeorgan


@ LegionMammal978 Harika! Btw, neden "WOLF" gibi daha iyi bir isim düşünmüyorsun?
njpipeorgan

5

Yakut, 87 86 bayt

Sorunu doğru anladığımdan emin değilim, ancak 196870girerseniz birkaç saniye içinde bulur foo.

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

5

PowerShell, 150 152 153 bayt

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

Misal

PS > .\BitCoin.ps1 foo
196870

PS > .\BitCoin.ps1 bar
48230

PS > .\BitCoin.ps1 happynewyear
1740131

PS > .\BitCoin.ps1 2016
494069

2

C #, 179 bayt

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 çözümüne benzer şekilde, sadece daha uzun.


Bu çok fazla anahtar kelime.
Joe Z.

1
@JoeZ. Bu sizin için C #.
LegionMammal978
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.