FatalError के शानदार उत्तर को जोड़ते हुए, लाइन return f(b)^f(a-1);को बेहतर तरीके से समझाया जा सकता है। संक्षेप में, यह इसलिए है क्योंकि XOR में ये अद्भुत गुण हैं:
- यह साहचर्य है - जहाँ भी आप चाहते हैं, कोष्ठक रखें
- यह सराहनीय है - इसका मतलब है कि आप ऑपरेटरों को इधर से उधर कर सकते हैं (वे "कम्यूट" कर सकते हैं)
यहाँ दोनों कार्रवाई में है:
(a ^ b ^ c) ^ (d ^ e ^ f) = (f ^ e) ^ (d ^ a ^ b) ^ c
ऐशे ही:
a ^ b = c
c ^ a = b
जोड़ें और गुणा करें अन्य सहयोगी / कम्यूटेटिव ऑपरेटरों के दो उदाहरण हैं, लेकिन वे खुद को उल्टा नहीं करते हैं। ठीक है, तो, ये गुण क्यों महत्वपूर्ण हैं? खैर, एक सरल मार्ग यह है कि वास्तव में यह क्या है, और फिर आप इन गुणों को काम पर देख सकते हैं।
सबसे पहले, हम परिभाषित करते हैं कि हम क्या चाहते हैं और इसे n कहते हैं:
n = (a ^ a+1 ^ a+2 .. ^ b)
यदि यह मदद करता है, तो XOR (^) के बारे में सोचें जैसे कि यह एक ऐड था।
चलिए फ़ंक्शन को भी परिभाषित करते हैं:
f(b) = 0 ^ 1 ^ 2 ^ 3 ^ 4 .. ^ b
bसे अधिक है a, इसलिए केवल कुछ अतिरिक्त कोष्ठक में सुरक्षित रूप से छोड़ने के द्वारा (जो हम कर सकते हैं क्योंकि यह साहचर्य है), हम यह भी कह सकते हैं:
f(b) = ( 0 ^ 1 ^ 2 ^ 3 ^ 4 .. ^ (a-1) ) ^ (a ^ a+1 ^ a+2 .. ^ b)
जो सरल करता है:
f(b) = f(a-1) ^ (a ^ a+1 ^ a+2 .. ^ b)
f(b) = f(a-1) ^ n
अगला, हम उस उलटी संपत्ति का उपयोग करते हैं और हमें जादुई रेखा देने के लिए कम्यूटिविटी:
n = f(b) ^ f(a-1)
यदि आप एक ऐड की तरह XOR के बारे में सोच रहे हैं, तो आप वहां एक घटाव में गिर गए होंगे। XOR को XOR में जोड़ना है जो घटाना है!
मैं खुद कैसे इस के साथ आऊं?
तार्किक ऑपरेटरों के गुणों को याद रखें। उनके साथ लगभग एक ऐड की तरह काम करें या अगर यह मदद करता है तो गुणा करें। यह असामान्य लगता है कि (और), xor (^) और (()) साहचर्य हैं, लेकिन वे हैं!
पहले के माध्यम से अनुभवहीन कार्यान्वयन को चलाएं, आउटपुट में पैटर्न की तलाश करें, फिर उन नियमों को ढूंढना शुरू करें जो पैटर्न के सत्य होने की पुष्टि करते हैं। आगे भी अपने कार्यान्वयन को सरल बनाएं और दोहराएं। यह संभवतः वह मार्ग है जिसे मूल निर्माता ने लिया था, इस तथ्य पर प्रकाश डाला कि यह पूरी तरह से इष्टतम नहीं है (यानी एक सरणी के बजाय एक स्विच स्टेटमेंट का उपयोग करें)।