इस पहेली का उद्देश्य 52 कार्ड का डेक लेना है और इसे फेरबदल करना है ताकि प्रत्येक कार्ड यादृच्छिक स्थिति में हो।
दिया हुआ:
deck52 अलग-अलग पूर्णांकों का एक सरणी, कार्डों का प्रतिनिधित्व करता है। जब आप शुरू करते हैं, तोdeckकुछ अज्ञात क्रम में प्रत्येक कार्ड में से एक होता है।- एक फ़ंक्शन,
int rand(min, max)जो कि intsminऔरmaxसमावेशी के बीच एक यादृच्छिक पूर्णांक देता है । आप मान सकते हैं कि यह फ़ंक्शन वास्तव में यादृच्छिक है। - एक फ़ंक्शन,
void swap(x, y)जो डेक में दो कार्ड स्वैप करता है। यदि आप कॉल करते हैंswap(x, y), तो पदों पर कार्डxऔरyस्थानों को स्विच करेंगे।
कब:
- कार्यक्रम कॉल करता है
shuffle()(याshuffle(deck)याdeck.shuffle()फिर भी आपका कार्यान्वयन चलाना पसंद करता है),
फिर:
deckपूरी तरह से यादृच्छिक क्रम में प्रत्येक कार्ड में से एक होना चाहिए।
कैच:
आप किसी भी चर की घोषणा नहीं कर सकते। कॉल करें swapऔर randजितना चाहें, लेकिन आप अपने स्वयं के किसी भी चर को घोषित नहीं कर सकते। इसमें शामिल हैं forएक में की तरह भी अंतर्निहित लोगों - पाश काउंटर foreach।
स्पष्टीकरण:
- आप अपनी चुनी हुई भाषा के अनुरूप मामूली विवरण बदल सकते हैं। उदाहरण के लिए, आप
swapसंदर्भ द्वारा दो पूर्णांक स्विच करने के लिए लिख सकते हैं । परिवर्तन अपनी भाषा के साथ इस काम को करने के लिए होना चाहिए, न कि पहेली को आसान बनाने के लिए। deckएक वैश्विक चर हो सकता है, या आप इसे एक पैरामीटर के रूप में ले सकते हैं।- आप अपनी इच्छित सामग्री के लिए कुछ भी कर सकते हैं
deck, लेकिन आप इसकी लंबाई नहीं बदल सकते। - आपके कार्ड की संख्या 0-51, 1-52 या आपकी पसंद की हो सकती है।
- आप इसे किसी भी भाषा में लिख सकते हैं, लेकिन आपकी भाषा के अंतर्निहित
shuffleफ़ंक्शन के साथ कोई धोखा नहीं है । - हां, आप एक ही पंक्ति को 52 बार लिख सकते हैं। कोई प्रभावित नहीं होगा।
- निष्पादन समय कोई फर्क नहीं पड़ता, लेकिन सच्ची यादृच्छिकता है।
- यह वास्तव में कोड गोल्फ नहीं है, लेकिन अपने कोड को कम से कम / बाधित करने के लिए स्वतंत्र महसूस करें।
संपादित करें: बॉयलरप्लेट कोड और विज़ुअलाइज़र
यदि आपने .NET या JavaScript का उपयोग किया है, तो यहां कुछ परीक्षण कोड उपयोगी हो सकते हैं:
जावास्क्रिप्ट:
- क्विक-एंड-डर्टी जावास्क्रिप्ट विज़ुअलाइज़र, कॉफ़ीस्क्रिप्ट स्रोत के साथ: https://gist.github.com/JustinMorgan/3989752bdfd579291cca
- चलने योग्य संस्करण (बस अपने
shuffle()फ़ंक्शन में पेस्ट करें ): http://jsfiddle.net/4zxjmy42/
सी#:
- ASP.NET विजुअलाइज़र C # कोडबिहाइंड के साथ: https://gist.github.com/JustinMorgan/4b630446a43f28eb5559
- स्टब सिर्फ
swapऔरrandउपयोगिता विधियों के साथ: https://gist.github.com/JustinMorgan/3bb4e6b058d70cc07d41
यह कोड सॉर्ट करता है और डेक को कई हजार बार फेरबदल करता है और कुछ बुनियादी पवित्रता परीक्षण करता है: प्रत्येक फेरबदल के लिए, यह पुष्टि करता है कि डेक में बिना किसी दोहराव के ठीक 52 कार्ड हैं। तब विज़ुअलाइज़र प्रत्येक कार्ड की आवृत्ति को डेक के प्रत्येक स्थान पर समाप्त करता है, जो एक ग्रेस्केल हीट मैप प्रदर्शित करता है।
विज़ुअलाइज़र का उत्पादन बिना किसी स्पष्ट पैटर्न के बर्फ जैसा दिखना चाहिए। जाहिर है यह सच यादृच्छिकता साबित नहीं कर सकता है, लेकिन यह स्पॉट-चेक करने का एक त्वरित और आसान तरीका है। मैं इसे या इसके जैसे कुछ का उपयोग करने की सलाह देता हूं, क्योंकि फेरबदल एल्गोरिथ्म में कुछ गलतियां आउटपुट में बहुत पहचानने योग्य पैटर्न का कारण बनती हैं। यहां दो कार्यान्वयन से आउटपुट का एक उदाहरण है, एक सामान्य दोष के साथ:

त्रुटिपूर्ण संस्करण आंशिक रूप से डेक को फेरबदल करता है, इसलिए यदि आप हाथ से सरणी की जांच करते हैं तो यह ठीक लग सकता है। विज़ुअलाइज़र एक पैटर्न को नोटिस करना आसान बनाता है।
deckअपने अलावा किसी भी पैरामीटर के बिना किया जा सकता है ।
swapअपने मूल उद्देश्य को पूरा करते हैं, तब तक आप जो चाहें लागू कर सकते हैं । मेरे swapदिए जाने का एक कारण यह था कि लोग इसे 'जादू' मान सकते थे और मुख्य समस्या पर ध्यान केंद्रित किए बिना अपनी पसंद की भाषा में काम करने की चिंता कर सकते थे। आप या तो ऐसा कर सकते हैं या अपना लिख सकते हैं swap, यह आपके ऊपर है।