¿Cuál es la forma más sencilla de hacer un O exclusivo de tres vías?XOR de tres valores
En otras palabras, tengo tres valores, y quiero una declaración que evalúe como verdadero IFF solo uno de los tres valores es verdadero.
Hasta ahora, esto es lo que he llegado con:
(! (A^b) & & (a^c) & & (b & & c)) || ((b^a) & & (b^c) & &! (a & & c)) || ((C^a) & & (c^b) & &! (Un & & b))
¿Hay algo más sencillo que hacer la misma cosa?
Aquí está la prueba de que el anterior logra la tarea:
a = true; b = true; c = true
((a^b) && (a^c) && !(b && c)) || ((b^a) && (b^c) && !(a && c)) || ((c^a) && (c^b) && !(a && b))
=> false
a = true; b = true; c = false
((a^b) && (a^c) && !(b && c)) || ((b^a) && (b^c) && !(a && c)) || ((c^a) && (c^b) && !(a && b))
=> false
a = true; b = false; c = true
((a^b) && (a^c) && !(b && c)) || ((b^a) && (b^c) && !(a && c)) || ((c^a) && (c^b) && !(a && b))
=> false
a = true; b = false; c = false
((a^b) && (a^c) && !(b && c)) || ((b^a) && (b^c) && !(a && c)) || ((c^a) && (c^b) && !(a && b))
=> true
a = false; b = true; c = true
((a^b) && (a^c) && !(b && c)) || ((b^a) && (b^c) && !(a && c)) || ((c^a) && (c^b) && !(a && b))
=> false
a = false; b = true; c = false
((a^b) && (a^c) && !(b && c)) || ((b^a) && (b^c) && !(a && c)) || ((c^a) && (c^b) && !(a && b))
=> true
a = false; b = false; c = true
((a^b) && (a^c) && !(b && c)) || ((b^a) && (b^c) && !(a && c)) || ((c^a) && (c^b) && !(a && b))
=> true
a = false; b = false; c = false
((a^b) && (a^c) && !(b && c)) || ((b^a) && (b^c) && !(a && c)) || ((c^a) && (c^b) && !(a && b))
=> false
Grande, pero la solución general no hace corto circuito. – Ani
'a? 1: 0' se puede simplificar a '!! a' – kaspersky
@ gg.kaspersky, solo en JavaScript, C, e idiomas que tienen pruebas de verdad/falsy mediante el operador'! '. Por ejemplo, esto no funcionaría en Java o C#. –