यह हाल की चुनौती का एक संस्करण है क्या यह संख्या -2 की पूर्णांक शक्ति है? समस्या की दिलचस्प प्रकृति को उजागर करने और चुनौती को और अधिक कठिन बनाने के लिए डिज़ाइन किए गए मानदंडों के एक अलग सेट के साथ। मैंने इसमें कुछ विचार रखा है ।
टोबी द्वारा अद्भुत रूप से लिंक किए गए प्रश्न में बताई गई चुनौती है:
यह निर्धारित करने के चतुर तरीके हैं कि क्या पूर्णांक 2 की एक सटीक शक्ति है। यह अब एक दिलचस्प समस्या नहीं है, इसलिए यह निर्धारित करें कि क्या दिया गया पूर्णांक -2 की सटीक शक्ति है । उदाहरण के लिए:
-2 => yes: (-2)¹ -1 => no 0 => no 1 => yes: (-2)⁰ 2 => no 3 => no 4 => yes: (-2)²
नियम:
- एक पूर्णांक 64 बिट्स, हस्ताक्षरित, दो का पूरक है। यह एकमात्र डेटा प्रकार है जिसके साथ आप काम कर सकते हैं।
- आप केवल निम्न कार्यों का उपयोग कर सकते हैं। इनमें से प्रत्येक एक ऑपरेशन के रूप में गिना जाता है।
n << k
,n >> k
: वाम / सही पारीn
सेk
बिट्स। साइन बिट को राइट शिफ्ट में बढ़ाया गया है।n >>> k
: राइट शिफ्ट लेकिन साइन बिट का विस्तार न करें। 0 के शिफ्ट में हैं।a & b
,a | b
,a ^ b
: बिटवाइस और, या, XOR।a + b
,a - b
,a * b
: जोड़ें, घटाना, गुणा।~b
: बिटवेट इनवर्ट।-b
: दो का पूरक निषेध।a / b
,a % b
फूट डालो (पूर्णांक भागफल, 0 की ओर दौर), और सापेक्ष।- ऋणात्मक संख्याओं का मोडुलो C99 में निर्दिष्ट नियमों का उपयोग करता है :
(a/b) * b + a%b
बराबर होगाa
। तो5 % -3
है2
, और-5 % 3
है-2
: 5 / 3
है1
, के रूप5 % 3
में2
, 1 * 3 + 2 = 5।-5 / 3
है-1
,-5 % 3
है-2
, के रूप में -1 * 3 + -2 = -5।5 / -3
है-1
,5 % -3
है2
, के रूप में -1 * -3 + 2 = 5।-5 / -3
है1
,-5 % -3
है-2
, 1 * -3 + -2 = -5 के रूप में।- ध्यान दें कि पायथन के
//
फ्लोर डिवीजन ऑपरेटर यहां विभाजन की संपत्ति के "गोल की ओर 0" को संतुष्ट नहीं करता है, और पायथन के%
ऑपरेटर आवश्यकताओं को पूरा नहीं करता है, या तो।
- ऋणात्मक संख्याओं का मोडुलो C99 में निर्दिष्ट नियमों का उपयोग करता है :
- असाइनमेंट को ऑपरेशन के रूप में नहीं गिना जाता है। सी के रूप में, असाइनमेंट के बाद असाइनमेंट लेफ्ट-हैंड साइड के मूल्य का मूल्यांकन
a = (b = a + 5)
करताb
है : सेट करता हैa + 5
, फिर एक ऑपरेशन के रूप में सेटa
होता हैb
, और गिनता है। - यौगिक असाइनमेंट का उपयोग किया जा सकता
a += b
हैa = a + b
और एक ऑपरेशन के रूप में गिना जा सकता है ।
- आप पूर्णांक स्थिरांक का उपयोग कर सकते हैं, वे कुछ भी नहीं गिनते हैं।
- संचालन के क्रम को निर्दिष्ट करने के लिए कोष्ठक स्वीकार्य हैं।
- आप कार्यों की घोषणा कर सकते हैं। फ़ंक्शन की घोषणा किसी भी शैली में हो सकती है जो आपके लिए सुविधाजनक है लेकिन ध्यान दें कि 64 बिट पूर्णांक केवल मान्य डेटा प्रकार हैं। फ़ंक्शन की घोषणाओं को संचालन के रूप में नहीं गिना जाता है, लेकिन एक फ़ंक्शन कॉल को एक के रूप में गिना जाता है। इसके अलावा, स्पष्ट होने के लिए: फ़ंक्शंस में कई
return
कथन हो सकते हैं औरreturn
किसी भी बिंदु से अनुमति दी जाती है।return
अपने आप में एक ऑपरेशन के रूप में नहीं गिना जाता। - आप बिना किसी लागत के चर घोषित कर सकते हैं।
- आप
while
लूप का उपयोग कर सकते हैं , लेकिन आप उपयोग नहीं कर सकते हैंif
याfor
।while
कंडिशन में इस्तेमाल किए गए ऑपरेटर्स आपके स्कोर की ओर गिनते हैं।while
लूप तब तक निष्पादित होते हैं जब तक कि उनकी स्थिति एक शून्य-शून्य मान का मूल्यांकन करती है (भाषाओं में "सत्य" 0 जो इस अवधारणा का एक वैध परिणाम नहीं है)। जल्दी वापसी की अनुमति दी है के बाद से, आप का उपयोग करने की अनुमति हैbreak
और साथ ही - ओवरफ्लो / अंडरफ्लो की अनुमति है और कोई मूल्य क्लैम्पिंग नहीं किया जाएगा। यह माना जाता है कि ऑपरेशन वास्तव में सही ढंग से हुआ था और फिर 64 बिट्स में काट दिया गया था।
स्कोरिंग / जीतना मानदंड:
आपके कोड को एक मान उत्पन्न करना चाहिए जो गैर-शून्य है यदि इनपुट -2 की शक्ति है, और अन्यथा शून्य।
यह परमाणु-कोड-गोल्फ है । आपका स्कोर संचालन की कुल संख्या अपने कोड में पेश (जैसा कि ऊपर बताया गया है), है नहीं कार्य है कि रन-टाइम में क्रियान्वित कर रहे हैं की कुल संख्या। निम्नलिखित कोड:
function example (a, b) {
return a + ~b;
}
function ispowerofnegtwo (input) {
y = example(input, 9);
y = example(y, 42);
y = example(y, 98);
return y;
}
5 ऑपरेशन शामिल हैं: फ़ंक्शन में दो, और तीन फ़ंक्शन कॉल।
इससे कोई फर्क नहीं पड़ता है कि आप अपना परिणाम कैसे प्रस्तुत करते हैं, जो भी आपकी भाषा में सुविधाजनक है उसका उपयोग करें, अंततः परिणाम को एक चर में संग्रहीत करें, इसे एक फ़ंक्शन से लौटाएं, या जो भी हो।
विजेता वह पद है जो डेमन्स्ट्रैबली करेक्ट होता है (यदि आवश्यक हो तो एक आकस्मिक या औपचारिक प्रमाण की आपूर्ति करें) और ऊपर वर्णित के रूप में सबसे कम स्कोर है।
बोनस बहुत मुश्किल मोड चुनौती!
पार्टियों में लोगों को प्रभावित करने की संभावित क्षमता को छोड़कर कुछ भी नहीं जीतने के मौके के लिए, while
लूप का उपयोग किए बिना एक उत्तर प्रस्तुत करें ! यदि इनमें से पर्याप्त जमा किया जाता है, तो मैं विजेता समूहों को दो श्रेणियों में विभाजित करने पर विचार कर सकता हूं (साथ और बिना छोरों के)।
नोट: यदि आप किसी ऐसी भाषा में समाधान प्रदान करना चाहते हैं जो केवल 32-बिट पूर्णांकों का समर्थन करती है, तो आप ऐसा कर सकते हैं, बशर्ते कि आप पर्याप्त रूप से उचित ठहराएं कि यह स्पष्टीकरण में 64-बिट पूर्णांकों के लिए अभी भी सही होगा।
इसके अलावा: कुछ भाषा-विशिष्ट सुविधाओं को बिना किसी लागत के अनुमति दी जा सकती है यदि वे नियमों से नहीं बचते हैं, लेकिन उपरोक्त नियमों के अनुसार व्यवहार करने में आपकी भाषा के साथ ज़बरदस्ती करना आवश्यक है । उदाहरण के लिए (contrived), मैं एक मुफ्त की अनुमति देता हूँ 0while
छोरों की तुलना न के बराबर होती है , जब पूरी तरह से शर्त पर लागू होती है, एक ऐसी भाषा के लिए एक वर्कअराउंड के रूप में, जिसमें "सच्चाई" 0 है। इस प्रकार की चीजों का लाभ उठाने के स्पष्ट प्रयासों की अनुमति नहीं है - उदाहरण के लिए "सत्य" 0 या "अपरिभाषित" मूल्यों की अवधारणा उपरोक्त नियमों में मौजूद नहीं है, और इसलिए वे पर निर्भर नहीं हो सकते हैं।
m ^= s
यह अभी भी प्रभावशाली है, और मुझे लगता है कि इसे और भी बेहतर बनाने के लिए प्रतिस्थापन बनाने के लिए पूरी तरह से ठीक होगा।
while
और break
नहीं है if
? if (x) { ... }
के बराबर है while (x) { ... break; }
।
break
और शुरुआती रिटर्न अफसोसजनक हिस्सा है) और भविष्य की चुनौतियों के लिए नियमों में सीखी गई एक लंबी कहानी और सबक है। हमेशा "बोनस" संस्करण होता है! :)
if
और for
कैसे अस्वीकृत हैं? int x=condition; while (x) { ... x=0; }
नि: शुल्क है, बस अधिक कोड। सी-स्टाइल के साथ एक ही बात for
।