Si vous utilisez un outil de visualisation logique comme Karnaugh Maps, vous voyez que c'est un problème où vous ne pouvez pas éviter un terme logique complet si vous voulez l'écrire dans une ligne if (...). Lopina l'a déjà montré, il n'est pas possible de l'écrire plus simplement. Vous pouvez tenir compte un peu, mais cela restera difficile à lire pour vous ET pour la machine.
Les solutions de comptage ne sont pas mauvaises et elles montrent ce que vous recherchez vraiment. La manière dont vous comptez efficacement dépend de votre langage de programmation. Les solutions de tableaux avec Python ou LinQ sont agréables à regarder, mais attention, c'est LENT. Wolf's (a + b + x + y) == 3 fonctionnera bien et rapidement, mais seulement si votre langage équivaut à "vrai" avec 1. Si "vrai" est représenté par -1, vous devrez tester -3: )
Si votre langage utilise de vrais booléens, vous pouvez essayer de le programmer explicitement (j'utilise! = Comme test 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" ne fonctionne que si x, y sont de type booléen. S'ils sont d'un autre type où 0 est faux et tout le reste est vrai, cela peut échouer. Ensuite, utilisez un XOR booléen, ou ((bool) x! = (Bool) y), ou écrivez "if (x) return (y == false) else return (y == true);", ce qui est un peu plus travailler pour l'ordinateur.
Si votre langage de programmation fournit l'opérateur ternaire?:, Vous pouvez le raccourcir en
if (a)
return b ? (x != y) : (x && y);
else
return b ? (x && y) : false;
qui garde un peu de lisibilité, ou le coupe agressivement pour
return a ? (b ? (x != y) : (x && y)) : (b ? (x && y) : false);
Ce code effectue exactement trois tests logiques (état de a, état de b, comparaison de x et y) et devrait être plus rapide que la plupart des autres réponses ici. Mais vous devez le commenter, sinon vous ne le comprendrez pas après 3 mois :)