# Simpler boolean truth table?

I'm doing a CodingBat exercise and would like to learn to write code in the most efficient way. On this exercise, I was just wondering if there's a shorter way to write this code.

monkeyTrouble(true, true) → true
monkeyTrouble(false, false) → true
monkeyTrouble(true, false) → false

public boolean monkeyTrouble(boolean aSmile, boolean bSmile) {

if (aSmile && bSmile) {
return true;
}

if (!aSmile && !bSmile) {
return true;
}

return false;

}

-
there is "Show Solution" button that shows 3 solutions on the page you linked –  Ushakov Nik Jan 9 at 13:54

Sometimes it is easy to forget that the simplest logical constructs like boolean are comparable with the == operator, and that, in Java, (false == false) is true.

With this in mind, your code could become:

public boolean monkeyTrouble(boolean aSmile, boolean bSmile) {
return aSmile == bSmile;
}


It may be easier to see how to get there if you first transform your original code into

public boolean monkeyTrouble(boolean aSmile, boolean bSmile) {
if ((aSmile && bSmile) || (!aSmile && !bSmile)) {
return true;
} else {
return false;
}
}


… which could become

public boolean monkeyTrouble(boolean aSmile, boolean bSmile) {
return (aSmile && bSmile) || (!aSmile && !bSmile);
}


From there, you may come to the realization that "both true or both false" is equivalent to "both the same".

Here is a verification of the output:

public static boolean monkeyTrouble(boolean aSmile, boolean bSmile) {
return aSmile == bSmile;
}

private static void testTruth(boolean a, boolean b) {
System.out.printf("monkeyTrouble(%s, %s) = %s\n", a, b, monkeyTrouble(a, b));
}

public static void main(String[] args) {
testTruth(true, true);
testTruth(true, false);
testTruth(false, true);
testTruth(false, false);
}


This produces:

monkeyTrouble(true, true) = true
monkeyTrouble(true, false) = false
monkeyTrouble(false, true) = false
monkeyTrouble(false, false) = true

-
But there are two conditions there. The one states that if both monkeys are smiling or if neither of them are smiling, return 'true'. So wouldn't simply making aSmile == bSmile ignore those two conditions? –  Warren van Rooyen Jan 4 at 13:38
if both are smiling then aSmile == bSmile is true == true, and that is true. If neither are smiling then aSmile == bSmile is false == false, and that resolves to true. If only one is smiling, then aSmile == bSmile is false == true, and that resolves to false. –  rolfl Jan 4 at 13:45
Trust me, I'm a monkey, and I know monkeyTrouble() ;-) –  rolfl Jan 4 at 13:51
truth of false and false is true - doesn't that sound like monkey business? (false && false) == false returns true, no? Then false and false is... false. –  Mat's Mug Jan 4 at 15:54
@retailcoder : big difference between false == false and false && false.... ;-) –  rolfl Jan 4 at 16:56

This is the exclusive-or (or XOR) condition negated.

You can simply do this:

public boolean monkeyTrouble(boolean aSmile, boolean bSmile) {
return !(aSmile ^ bSmile);
}


or, as it is so simply, you can use it in your code without the function.

Explanation of XOR operator ^:

a   ^    b     =   c

1        0         1
0        1         1
0        0         0
1        1         0

-
The negation of XOR is also known as XNOR. –  200_success Jan 4 at 17:32
Wrong precedence there. –  user2357112 Jan 5 at 1:11
Shouldn't this be: !(aSmile ^ bSmile)? –  Wayne Conrad Jan 5 at 12:16
@WayneConrad, you are right, Its corrected! It also works the other way, but this is the correct one, thanks. –  Toni Almeida Jan 5 at 14:39