Bitcoins में 2016 के लिए मेरा! PCG.SE नए साल की पहेली 2016


17

बिटकॉइन प्रोटोकॉल में, 2016 एक बहुत ही विशेष संख्या है। एक नया ब्लॉक बनाने के लिए हैश खोजने की "कठिनाई" हर दो सप्ताह में एक बार बदलने के लिए हर 2,016 ब्लॉक को समायोजित किया जाता है।

यह संख्या इसलिए चुनी गई क्योंकि कठिनाई खुद को समायोजित करती है ताकि प्रत्येक ब्लॉक को ढूंढने में लगभग 10 मिनट लगें, और दो सप्ताह में, 2 × 7 × 24 × 6 = 2,016 दस मिनट की अवधि होती है।


इस संख्यात्मक संयोग की प्रशंसा करने के लिए, इस साल के नए साल की समस्या बिटकॉइन के बारे में है - विशेष रूप से, हैशिंग एल्गोरिथ्म इसका उपयोग ब्लॉक, SHA-256 पर हस्ताक्षर करने के लिए करता है।

आपका कार्य एक प्रोग्राम बनाना है जो बाइट इनपुट लेगा (कम से कम ASCII में) और बाइट्स (आपकी पसंद के प्रारूप में) में एक नॉन उत्पादन करेगा जो मूल से जुड़े होने पर 2016अपने बेस 64 प्रतिनिधित्व में SHA-256 हैश का उत्पादन करेगा। बाइट इनपुट

यहां वैध समाधानों के कुछ उदाहरण दिए गए हैं, इंजन के सौजन्य से लोग पहले ही उत्पन्न कर चुके हैं, साथ ही उनके द्वारा उत्पादित हैश:

> 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)फ़ंक्शन है जो बाइट इनपुट लेता है और बेस 64 सहित किसी भी प्रारूप में SHA256 हैश लौटाता है।

स्रोत कोड जीत के सबसे कम बाइट्स में ऐसा करने का कार्यक्रम।


1
मुझे पागल कहो, लेकिन क्या यह बिटकॉइन खनन किसी अन्य नाम से नहीं है?
कोडफुन64

1
इसके अलावा, एक "पूर्व-निर्मित पुस्तकालय" को परिभाषित करें। मेरी भाषा का SHA-256 फ़ंक्शन हैश का उत्पादन करता है, लेकिन Base64 हैश का नहीं। इसलिए, मुझे बाइट्स में रूपांतरण, फिर वर्णों में रूपांतरण, फिर बेस 64 में रूपांतरण की आवश्यकता होगी।
लीजनमोनमाल 978

@ LegionMammal978 एक "पूर्व-निर्मित पुस्तकालय" इस चुनौती के लिए मायने रखने वाले कोड के बाहर किसी भी प्रकार का कार्य होगा। तो आप इस समस्या में उपयोग करने के लिए, अपने SHA-256 फ़ंक्शन के लिए एक बेस 64 आवरण फ़ंक्शन बना सकते हैं।
जो जे।

@ Codefun64 यह एक कोड समस्या है जो बिटकॉइन खनन में उपयोग की जाने वाली प्रक्रिया को अनुकरण करती है , लेकिन खुद बिटकॉइन के लिए मेरा नहीं है।
जो

जवाबों:


7

पर्ल 5.10+, 39 + 18 = 57 बाइट्स

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

इसे -nMDigest::SHA=/./कमांड लाइन स्विच के साथ चलाने की आवश्यकता है , जो बाइट काउंट में शामिल है। यह पर्ल 5.10+ sayफीचर का भी उपयोग करता है , और इसलिए इसे -M5.010(या -E) कमांड लाइन स्विच के साथ चलाने की आवश्यकता है , जिसे मुफ्त माना जाता है। इनपुट को स्टडिन पर प्रदान किया जाना चाहिए, एक अनुगामी न्यूलाइन के बिना (जब तक आप चाहते हैं कि न्यूलाइन इनपुट का हिस्सा नहीं माना जाए)।

उदाहरण:

$ 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
हमें वुल्फ्राम लैंग्वेज का एक गोल्फिंग वर्जन तैयार करना चाहिए, जिसमें हर कमांड को एक या दो अक्षरों से बदल दिया जाए। दरअसल, आज्ञाओं की संख्या को देखते हुए, हमें कुछ कम आम लोगों के लिए तीन वर्णों का उपयोग करने की आवश्यकता हो सकती है।
माइकल स्टर्न

@MichaelStern मैं और अधिक सहमत नहीं हो सकता।
njpipeorgan


@ LegionMammal978 शानदार! Btw, "WOLF" जैसे बेहतर नाम पर विचार क्यों नहीं किया गया?
njpipeorgan

5

रूबी, 87 86 बाइट्स

मुझे यकीन नहीं है कि अगर मैंने चुनौती को सही ढंग से समझा, लेकिन 196870अगर आप इनपुट करते हैं तो यह कुछ ही सेकंड में पता चलता है foo

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

5

पॉवरशेल, 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

सी #, 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;}

पॉवरशेल समाधान के समान, बस लंबे समय तक।


यह बहुत सारे कीवर्ड हैं।
जो जे।

1
@JoeZ। आपके लिए वह C # है।
लीजनमोनमल 978
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.