Wenn Sie ein Logikvisualisierungstool wie Karnaugh Maps verwenden, sehen Sie, dass dies ein Problem ist, bei dem Sie einen vollständigen Logikbegriff nicht vermeiden können, wenn Sie ihn in eine if (...) -Zeile schreiben möchten. Lopina hat es bereits gezeigt, es ist nicht möglich, es einfacher zu schreiben. Sie können ein wenig herausrechnen, aber es bleibt für Sie UND die Maschine schwer zu lesen.
Zähllösungen sind nicht schlecht und zeigen, wonach Sie wirklich suchen. Wie Sie effizient zählen, hängt von Ihrer Programmiersprache ab. Die Array-Lösungen mit Python oder LinQ sind schön anzusehen, aber Vorsicht, das ist LANGSAM. Wolfs (a + b + x + y) == 3 funktioniert gut und schnell, aber nur, wenn Ihre Sprache "wahr" mit 1 gleichsetzt. Wenn "wahr" durch -1 dargestellt wird, müssen Sie auf -3 testen: )
Wenn Ihre Sprache echte Boolesche Werte verwendet, können Sie versuchen, sie explizit zu programmieren (ich verwende! = Als XOR-Test):
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" funktioniert nur, wenn x, y vom booleschen Typ sind. Wenn es sich um einen anderen Typ handelt, bei dem 0 falsch und alles andere wahr ist, kann dies fehlschlagen. Verwenden Sie dann ein boolesches XOR oder ((bool) x! = (Bool) y) oder schreiben Sie "if (x) return (y == false) else return (y == true);", was etwas mehr ist Arbeit für den Computer.
Wenn Ihre Programmiersprache den Operator ternary ?: Bereitstellt, können Sie ihn auf kürzen
if (a)
return b ? (x != y) : (x && y);
else
return b ? (x && y) : false;
das hält ein bisschen Lesbarkeit, oder schneiden Sie es aggressiv auf
return a ? (b ? (x != y) : (x && y)) : (b ? (x && y) : false);
Dieser Code führt genau drei Logiktests durch (Zustand von a, Zustand von b, Vergleich von x und y) und sollte schneller sein als die meisten anderen Antworten hier. Aber du musst es kommentieren, sonst wirst du es nach 3 Monaten nicht verstehen :)