Jeśli używasz narzędzia do wizualizacji logiki, takiego jak Mapy Karnaugha, zobaczysz, że jest to problem, w którym nie możesz uniknąć pełnego wyrażenia logicznego, jeśli chcesz go zapisać w jednym wierszu if (...). Lopina już to pokazała, prościej się nie da napisać. Możesz trochę pomyśleć, ale będzie to trudne do odczytania dla Ciebie ORAZ dla maszyny.
Rozwiązania liczenia nie są złe i pokazują, czego naprawdę szukasz. Skuteczne liczenie zależy od języka programowania. Rozwiązania tablicowe w Pythonie lub LinQ są przyjemne dla oka, ale uwaga, to jest WOLNE. Wolf's (a + b + x + y) == 3 będzie działać dobrze i szybko, ale tylko wtedy, gdy twój język zrównuje „prawda” z 1. Jeśli „prawda” jest reprezentowana przez -1, będziesz musiał przetestować na -3: )
Jeśli twój język używa prawdziwych wartości logicznych, możesz spróbować zaprogramować go jawnie (ja używam! = Jako testu XOR):
if (a)
{
if (b)
return (x != y); // a,b=true, so either x or y must be true
else
return (x && y); // a=true, b=false, so x AND y must be true
}
else
{
if (b)
return (x && y); // a=false, b=true, so x and y must be true
else
return false; // a,b false, can't get 3 of 4
}
„x! = y” działa tylko wtedy, gdy x, y są typu boolowskiego. Jeśli są innego typu, w których 0 jest fałszywe, a wszystko inne jest prawdą, może się to nie powieść. Następnie użyj logicznego XOR, lub ((bool) x! = (Bool) y), lub napisz „if (x) return (y == false) else return (y == true);”, co jest trochę więcej pracować na komputerze.
Jeśli Twój język programowania udostępnia operator trójskładnikowy?:, Możesz go skrócić do
if (a)
return b ? (x != y) : (x && y);
else
return b ? (x && y) : false;
który zachowuje trochę czytelności, lub agresywnie skraca
return a ? (b ? (x != y) : (x && y)) : (b ? (x && y) : false);
Ten kod wykonuje dokładnie trzy testy logiczne (stan a, stan b, porównanie x i y) i powinien być szybszy niż większość innych odpowiedzi tutaj. Ale musisz to skomentować, inaczej nie zrozumiesz po 3 miesiącach :)