Take the 2-minute tour ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

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; 

}
share|improve this question
add comment

2 Answers

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
share|improve this answer
 
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 yesterday
4  
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 yesterday
5  
Trust me, I'm a monkey, and I know monkeyTrouble() ;-) –  rolfl yesterday
 
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. –  retailcoder yesterday
1  
@retailcoder : big difference between false == false and false && false.... ;-) –  rolfl yesterday
show 1 more comment

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
share|improve this answer
4  
The negation of XOR is also known as XNOR. –  200_success yesterday
2  
Wrong precedence there. –  user2357112 yesterday
 
Shouldn't this be: !(aSmile ^ bSmile)? –  Wayne Conrad 15 hours ago
 
@WayneConrad, you are right, Its corrected! It also works the other way, but this is the correct one, thanks. –  Toni Almeida 13 hours ago
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.