작은 부울 매직


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에 오신 것을 환영합니다! 여기에 모든 도전 과제는 객관적인 우승 기준이 필요합니다. 여기에는 단일 솔루션 만있을 수 있으므로이 과제는 PPCG에 적합하지 않을 수 있습니다. 향후 과제에 대해서는 도전이 시작되기 전에 피드백을받을 수 있는 샌드 박스를 추천하겠습니다 .
Martin Ender

2
메타 토론은 추가적인 승리 기준이없는 프로그래밍 퍼즐이 주제 에 관한 것인지 , 상충되는 답변이 찬성 되는지에 따라 분리됩니다 . 문제가 해결되지 않은 경우 질문을 계속 열어 두어야합니다. 의견이 있으시면 토론에 기여하십시오.
xnor

2
@DenkerAffe 나는 네 가지 명백한 매개 변수 조합 중 어느 것도 효과가 없다고 생각합니다.
Martin Ender

3
타당한 대답이 있다고 가정 할 때, 그것이 우리가 일반적으로 생각하는 주제에 맞는지 여부에 관계없이 훌륭한 질문입니다. 나는 우리가 일반적으로 주제에 대해 이와 같은 질문을 고려하지 않는 이유 중 하나는 내가 본 것처럼 다른 모든 질문이 초보자에 의한 것이며 그 대답은 맹목적으로 명백했기 때문이라고 생각합니다.
Level River St

5
@Widi "첫 번째 유효한 솔루션"이 최선의 아이디어가 아닌 이유를 참조하십시오. 리플렉션을 통해 일부 내부 요소를 엉망으로 만드는 무관심하지만 작동하는 솔루션을 얻을 수 있으며 리플렉션없이 더 흥미로운 솔루션을 찾는 사람들에게는 인센티브가 없습니다.
Martin Ender

답변:


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

이것은 TrueVisual Studio 2015와 함께 제공되는 C # 구현으로 나를 위해 인쇄 합니다. 실제로 C #을 모르지만 C 코드를 작성하여 작동하는지 확인하려고합니다. 컴파일러가 True가 항상 1로 표시되고 비트 AND를 사용한다고 가정하고 싶습니다. 디버그 모드에서는 실제로이 경우입니다 (릴리스에서도 작동). 첫 번째 조건에는 비트 AND를 사용하고 두 번째 조건에는 두 개의 비교를 0으로 사용합니다.

            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

나는 같은 것을 시도했지만 Linux에서는 Mono에서 작동하지 않는 것 같습니다.
jimmy23013

이것은 C # 컴파일러 (현재 MS에서 Roslyn)가 아니라 JIT 컴파일러 (현재 RyuJIT에서 MS)에 의존합니다. C # 컴파일러가 생성하는 IL도 JIT의 기능에 영향을 줄 수 있습니다.
Bob
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.