163 votes

Logique pour tester que 3 des 4 sont vrais

Je veux revenir True si et seulement si 3 des 4 valeurs booléennes sont vraies.

Le plus proche que j'ai obtenu est (x ^ y) ^ (a ^ b) :

Que dois-je faire ?

247voto

Sam Hocevar Points 7554

Je suggère d'écrire le code d'une manière qui indique ce que vous voulez dire. Si vous voulez que 3 valeurs soient vraies, il me semble naturel que la valeur 3 apparaisse quelque part.

Par exemple, dans C++ :

if ((int)a + (int)b + (int)c + (int)d == 3)
    ...

Ceci est bien défini dans C++ : le standard (§4.7/4) indique que la conversion bool a int donne les valeurs attendues 0 ou 1.

En Java et C#, vous pouvez utiliser la construction suivante :

if ((a?1:0) + (b?1:0) + (c?1:0) + (d?1:0) == 3)
    ...

89voto

NameSpace Points 2626

1 : Utilisation d'un embranchement ? : 3 ou 4 opérations

A ^ B ? C & D : ( C ^ D ) & A

2 Non-Branching, 7 opérations

(A ^ B ^ C ^ D) & ((A & B) | (C & D))

A l'époque où j'avais l'habitude de tout profiler, j'ai trouvé sans ramification étaient beaucoup plus rapides, opération par opération, car l'unité centrale pouvait mieux prévoir le chemin du code et exécuter plus d'opérations en tandem. Il y a cependant environ 50 % de travail en moins dans l'instruction de branchement.

68voto

thefourtheye Points 56958

Si cela avait été Python, j'aurais écrit

if [a, b, c, d].count(True) == 3:

Ou

if [a, b, c, d].count(False) == 1:

Ou

if [a, b, c, d].count(False) == True:
# In Python True == 1 and False == 0

Ou

print [a, b, c, d].count(0) == 1

Ou

print [a, b, c, d].count(1) == 3

Ou

if a + b + c + d == 3:

Ou

if sum([a, b, c, d]) == 3:

Tout cela fonctionne, puisque les booléens sont des sous-classes des entiers en Python.

if len(filter(bool, [a, b, c, d])) == 3:

Ou, inspiré par ceci bon truc ,

data = iter([a, b, c, d])
if not all(data) and all(data):

52voto

Gastón Bengolea Points 810

Longue mais très simple, forme normale (disjonctive) :

 (~a & b & c & d) | (a & ~b & c & d) | (a & b & ~c & d) | (a & b & c & ~d)

Elle peut être simplifiée mais cela demande plus de réflexion :P

33voto

Karl Kieninger Points 3432

Pas sûr que ce soit plus simple, mais peut-être.

((x xor y) and (a and b)) or ((x and y) and (a xor b))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X