Якщо ви використовуєте такий інструмент візуалізації логіки, як Karnaugh Maps, ви бачите, що це проблема, коли ви не можете уникнути повноцінного логічного терміна, якщо хочете записати його в одному рядку, якщо (...). Лопіна показала це вже, простіше написати це не можливо. Ви можете трохи визначити, але читати для вас І для машини буде важко.
Підрахунок рішень не є поганим, і вони показують, що ви насправді хочете. Наскільки ефективно робити підрахунок залежить від мови програмування. Рішення масивів з Python oder LinQ приємно переглядати, але будьте обережні, це ПОСЛІДНО. Wolf's (a + b + x + y) == 3 буде добре і швидко працювати, але лише якщо ваша мова порівнює "справжнє" з 1. Якщо "true" представлено -1, вам доведеться перевірити на -3: )
Якщо ваша мова використовує справжні булеви, ви можете спробувати запрограмувати це явно (я використовую! = Як тест 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" працює лише в тому випадку, якщо x, y булевого типу. Якщо вони є якимось іншим типом, де 0 - помилково, а все інше - правда, це може не вдатися. Потім використовуйте булевий XOR або ((bool) x! = (Bool) y) або напишіть "if (x) return (y == false) else return (y == true);", що трохи більше робота за комп’ютером.
Якщо у вашій мові програмування передбачений оператор?:, Ви можете скоротити його
if (a)
return b ? (x != y) : (x && y);
else
return b ? (x && y) : false;
який зберігає трохи читабельності, або скорочує його агресивно
return a ? (b ? (x != y) : (x && y)) : (b ? (x && y) : false);
Цей код робить саме три логічні тести (стан a, стан b, порівняння x і y) і повинен бути швидшим, ніж більшість інших відповідей тут. Але це потрібно коментувати, інакше ви не зрозумієте це через 3 місяці :)