Если вы используете инструмент логической визуализации, такой как Karnaugh Maps, вы увидите, что это проблема, когда вы не можете избежать полноценного логического термина, если хотите записать его в одну строку if (...). Лопина это уже показала, проще не написать. Вы можете выделить немного, но это будет трудно читать для вас и для машины.
Подсчет решений не плох, и они показывают, что вы действительно после. Эффективность подсчета зависит от вашего языка программирования. Решения для массива с Python или LinQ приятно смотреть, но будьте осторожны, это МЕДЛЕННО. Wolf's (a + b + x + y) == 3 будет работать хорошо и быстро, но только если ваш язык приравнивает «true» к 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 - false, а все остальное - true, это может не сработать. Затем используйте логическое XOR, или ((bool) x! = (Bool) y), или напишите «if (x) return (y == false) else return (y == true);», что немного больше работать за компьютером.
Если в вашем языке программирования есть оператор ternary? :, вы можете сократить его до
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 месяца :)