थोड़ा बूल मैजिक


20

चुनौती

निम्नलिखित C # विधि को देखते हुए:

private static bool Test(bool a, bool b)
{
    if (a && b) return false;
    if (a) if (b) return true;
    return false;
}

मूल्यों की आपूर्ति करें aऔर bइसलिए कि trueवापस लौटा दिया जाए।

जीतने की स्थिति

पहली प्रविष्टि जो दिए गए तरीके को trueजीतने के लिए मूल्यांकन करने के लिए सही तर्कों की आपूर्ति कर सकती है ।


4
PPCG में आपका स्वागत है! यहां सभी चुनौतियों के लिए एक वस्तुनिष्ठ जीत की कसौटी की जरूरत होती है, ताकि कई सबमिशन होने पर एक विजेता को चुना जा सके। ऐसा लगता है कि यहां केवल एक ही समाधान हो सकता है, इसलिए यह चुनौती पीपीसीजी के लिए एक अच्छी फिट नहीं हो सकती है। भविष्य की चुनौतियों के लिए मुझे सैंडबॉक्स की सिफारिश करने दें जहां आप चुनौती के लाइव होने से पहले प्रतिक्रिया प्राप्त कर सकते हैं।
मार्टिन एंडर

2
मेटा की चर्चा इस बात पर विभाजित है कि क्या अतिरिक्त जीत मानदंड के बिना प्रोग्रामिंग पहेलियाँ विषय पर हैं , जिसमें परस्पर विरोधी उत्तर सामने आ रहे हैं । जब यह अनसुलझी होती है, तो मैं सवालों को खुला रखना चाहता हूं, इसलिए मैं फिर से मतदान कर रहा हूं। यदि आपकी राय है, तो कृपया चर्चा में उनका योगदान करें।
xnor

2
@DenkerAffe मुझे नहीं लगता कि चार स्पष्ट पैरामीटर संयोजनों में से कोई भी काम करता है।
मार्टिन एंडर

3
यह मानते हुए कि एक मान्य उत्तर है, यह एक उत्कृष्ट प्रश्न है, चाहे वह सामान्य रूप से विषय पर हम जो भी विचार करते हैं, वह फिट बैठता है। + 1। मुझे लगता है कि एक कारण है कि हम सामान्य रूप से इस विषय पर प्रश्नों पर विचार नहीं करते हैं, यह है कि मैंने इस तरह देखा गया हर दूसरा प्रश्न एक शुरुआत से किया है, और उत्तर स्पष्ट रूप से स्पष्ट किया गया है।
लेवल रिवर सेंट

5
@Widi देखें यही कारण है कि "पहला वैध समाधान" शायद सबसे अच्छा विचार नहीं है। आपको एक निर्बाध लेकिन काम करने वाला समाधान मिल सकता है जो सिर्फ प्रतिबिंब के माध्यम से कुछ आंतरिक के साथ खिलवाड़ करता है और फिर प्रतिबिंब के बिना किसी और दिलचस्प समाधान की तलाश में जाने के लिए किसी के लिए कोई प्रोत्साहन नहीं है।
मार्टिन एंडर

जवाबों:


20
static void Main(string[] args)
{
    bool a, b;
    unsafe
    {
        int* pa = (int*)&a;
        int* pb = (int*)&b;
        *pa = 1;
        *pb = 2;
    }

        Console.Write(Test(a, b));
}

यह Trueमेरे लिए C # कार्यान्वयन के साथ प्रिंट करता है जो विज़ुअल स्टूडियो 2015 के साथ आता है। मुझे वास्तव में कोई C # नहीं पता है, लेकिन मुझे लगा कि मैं कुछ C कोड लिखने और यह काम करने की कोशिश करूँगा। मैं उम्मीद कर रहा था कि कंपाइलर यह मान लेगा कि ट्रू को हमेशा 1 के रूप में दर्शाया जाता है और एक बिटवाइज़ और का उपयोग करते हैं। डिबग मोड में, यह वास्तव में मामला है (यह रिलीज के साथ भी काम करता है)। यह पहली स्थिति के लिए एक बिटवाइज़ और दूसरी के लिए शून्य की तुलना में दो का उपयोग करता है:

            if (a && b) return false;
002C2E92  movzx       eax,byte ptr [ebp-3Ch]  
002C2E96  movzx       edx,byte ptr [ebp-40h]  
002C2E9A  and         eax,edx  
002C2E9C  and         eax,0FFh  
002C2EA1  mov         dword ptr [ebp-44h],eax  
002C2EA4  cmp         dword ptr [ebp-44h],0  
002C2EA8  je          002C2EB2  
002C2EAA  xor         edx,edx  
002C2EAC  mov         dword ptr [ebp-48h],edx  
002C2EAF  nop  
002C2EB0  jmp         002C2EE4  
            if (a) if (b) return true;
002C2EB2  movzx       eax,byte ptr [ebp-3Ch]  
002C2EB6  mov         dword ptr [ebp-4Ch],eax  
002C2EB9  cmp         dword ptr [ebp-4Ch],0  
002C2EBD  je          002C2EDC  
002C2EBF  movzx       eax,byte ptr [ebp-40h]  
002C2EC3  mov         dword ptr [ebp-50h],eax  
002C2EC6  cmp         dword ptr [ebp-50h],0  
002C2ECA  je          002C2EDC  
002C2ECC  mov         eax,1  
002C2ED1  and         eax,0FFh  
002C2ED6  mov         dword ptr [ebp-48h],eax  
002C2ED9  nop  
002C2EDA  jmp         002C2EE4  
            return false;
002C2EDC  xor         edx,edx  
002C2EDE  mov         dword ptr [ebp-48h],edx  
002C2EE1  nop  
002C2EE2  jmp         002C2EE4  
        }
002C2EE4  mov         eax,dword ptr [ebp-48h]  
002C2EE7  lea         esp,[ebp-0Ch]  
002C2EEA  pop         ebx  
002C2EEB  pop         esi  
002C2EEC  pop         edi  
002C2EED  pop         ebp  
002C2EEE  ret  

गजब का! मुझे पूरा यकीन था कि यह नहीं किया जा सकता था
edc65

मैंने एक ही कोशिश की है, लेकिन यह लिनक्स के तहत मोनो में काम नहीं करता है।
jimmy23013

यह सी # कंपाइलर (वर्तमान में एमएस से रोजलिन) पर निर्भर करेगा, बल्कि जेआईटी कंपाइलर (वर्तमान में एमएस से रयुजित) पर निर्भर करेगा। हालांकि आईएल द सी # कंपाइलर का उत्पादन भी प्रभावित कर सकता है जो जेआईटी करता है।
बॉब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.