Biraz bool büyüsü


20

Meydan okuma

Aşağıdaki C # yöntemi verildiğinde:

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

Değerleri sağlayın ave bböylece truegeri dönün.

Kazanma koşulu

Verilen yöntemi değerlendirmek için doğru argümanları sağlayabilen ilk giriş truekazanır.


4
PPCG'ye Hoşgeldiniz! Buradaki tüm zorlukların, birden fazla başvuru olması halinde bir kazananın seçilebilmesi için objektif bir kazanma ölçütüne ihtiyacı vardır. Görünüşe göre burada sadece tek bir çözüm olabilir, bu nedenle bu zorluk PPCG için uygun olmayabilir. Gelecekteki zorluklar için, meydan okuma başlamadan önce geri bildirim alabileceğiniz korumalı alanı öneriyorum .
Martin Ender

2
Meta tartışması, ek kazanma kriterleri olmayan programlama bulmacalarının konuyla ilgili olup olmadığı konusunda çelişkilidir ve çelişkili cevaplar kaldırılmıştır. Sorunun çözülmediği zaman soruları açık tutmayı tercih ederim, bu yüzden tekrar açmak için oy veriyorum. Görüşleriniz varsa, lütfen tartışmaya katkıda bulunun.
xnor

2
@DenkerAffe Dört belirgin parametre kombinasyonundan hiçbirinin işe yaramadığını düşünmüyorum.
Martin Ender

3
geçerli bir cevap olduğu varsayılarak, konu hakkında normalde düşündüğümüze uyup uymadığına bakılmaksızın, bu mükemmel bir sorudur. Sanırım normalde konuyla ilgili bu tür soruları dikkate almamamızın nedenlerinden biri, bunun gibi gördüğüm diğer tüm soruların bir acemi olması ve cevabın körü körüne açık olması.
Level River St

5
@Widi Bu yüzden "ilk geçerli çözüm" en iyi fikir olmayabilir. Yansıtma yoluyla bazı içsellerle uğraşan ilginç ama çalışan bir çözüm elde edebilirsiniz ve o zaman kimsenin yansıma olmadan daha ilginç bir çözüm aramaya gitmesi için bir teşvik yoktur.
Martin Ender

Yanıtlar:


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));
}

Bu Truebenim için Visual Studio 2015 ile birlikte gelen C # uygulaması ile yazdırır . Aslında herhangi bir C # bilmiyorum, ama bazı C kodu yazmak ve çalışıp çalışmadığını görmek düşündüm. Derleyicinin True'nun her zaman 1 olarak temsil edildiğini ve bit şeklinde VE kullanacağını umuyordum. Hata Ayıklama modunda, bu durum böyledir (Release ile de çalıştı). İlk koşul için bitsel VE kullanır ve ikincisi için sıfıra iki karşılaştırma:

            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  

İnanılmaz! Tamamen yapılamayacağından
emindim

Aynı şeyi denedim ama Linux altında Mono'da çalışmıyor gibi görünüyor.
jimmy23013 28:16

Bu C # derleyicisine (şu anda MS'den Roslyn) değil, JIT derleyicisine (şu anda MS'den RyuJIT) bağlı olacaktır. C # derleyicisinin ürettiği IL, JIT'in yaptıklarını da etkileyebilir.
Bob
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.