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 &amp;&amp; bSmile) {
      return true;
  }

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

  return false; 

}
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 &amp;&amp; bSmile) || (!aSmile &amp;&amp; !bSmile)) {
        return true;
    } else {
        return false; 
    }
}


… which could become

public boolean monkeyTrouble(boolean aSmile, boolean bSmile) {
    return (aSmile &amp;&amp; bSmile) || (!aSmile &amp;&amp; !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