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
    
there is "Show Solution" button that shows 3 solutions on the page you linked –  Ushakov Nik Jan 9 at 13:54

2 Answers 2

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 Jan 4 at 13:38
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 Jan 4 at 13:45
6  
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
1  
@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
share|improve this answer
4  
The negation of XOR is also known as XNOR. –  200_success Jan 4 at 17:32
2  
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

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.