ちょっとした魔法


20

チャレンジ

次のC#メソッドがある場合:

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

値を指定するab、それtrueが返されます。

勝利条件

正しい引数を指定して、指定されたメソッドをwinに評価できる最初のエントリtrue


4
PPCGへようこそ!ここでのすべての課題には、複数の提出物がある場合に勝者を選択できるように、客観的な勝利基準が必要です。ここには1つのソリューションしか存在しないように思われるため、この課題はPPCGに適合しない可能性があります。将来のチャレンジについては、チャレンジが公開される前にフィードバックを得ることができるサンドボックスをお勧めします。
マーティンエンダー

2
メタの議論は、追加の勝利基準のないプログラミングパズルがトピックにあるかどうかで分かれており、競合する回答が支持されています。私はむしろ、未解決の質問を開いたままにしておきたいので、再開することに投票しています。意見があれば、議論に貢献してください。
xnor

2
@DenkerAffe 4つの明らかなパラメーターの組み合わせのいずれも機能するとは思わない。
マーティンエンダー

3
有効な答えがあると仮定すると、これは、topic。+ 1で通常考えるものに適合するかどうかに関係なく、優れた質問です。トピックに関してこのような質問を通常は考慮しない理由の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は、Visual Studio 2015に付属のC#実装を使用して印刷されます。実際にはC#がわからないのですが、Cコードを記述して、動作するかどうかを確認しようと思いました。コンパイラーがTrueが常に1として表されると想定し、ビット単位のANDを使用することを望んでいました。デバッグモードでは、実際にこれが当てはまります(リリースでも機能しました)。最初の条件にビット単位のANDを使用し、2番目の条件にゼロとの2つの比較を使用します。

            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コンパイラ(現在はMSのRyuJIT)に依存しています。C#コンパイラが生成するILもJITの動作に影響を与える可能性があります。
ボブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.