12
\$\begingroup\$

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; 

}
\$\endgroup\$
  • \$\begingroup\$ there is "Show Solution" button that shows 3 solutions on the page you linked \$\endgroup\$ – Nikita U. Jan 9 '14 at 13:54
26
\$\begingroup\$

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
\$\endgroup\$
  • \$\begingroup\$ 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? \$\endgroup\$ – Warren van Rooyen Jan 4 '14 at 13:38
  • 4
    \$\begingroup\$ 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. \$\endgroup\$ – rolfl Jan 4 '14 at 13:45
  • 6
    \$\begingroup\$ Trust me, I'm a monkey, and I know monkeyTrouble() ;-) \$\endgroup\$ – rolfl Jan 4 '14 at 13:51
  • \$\begingroup\$ 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. \$\endgroup\$ – Mathieu Guindon Jan 4 '14 at 15:54
  • 1
    \$\begingroup\$ @retailcoder : big difference between false == false and false && false.... ;-) \$\endgroup\$ – rolfl Jan 4 '14 at 16:56
11
\$\begingroup\$

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
\$\endgroup\$
  • 4
    \$\begingroup\$ The negation of XOR is also known as XNOR. \$\endgroup\$ – 200_success Jan 4 '14 at 17:32
  • 2
    \$\begingroup\$ Wrong precedence there. \$\endgroup\$ – user2357112 Jan 5 '14 at 1:11
  • \$\begingroup\$ Shouldn't this be: !(aSmile ^ bSmile)? \$\endgroup\$ – Wayne Conrad Jan 5 '14 at 12:16
  • \$\begingroup\$ @WayneConrad, you are right, Its corrected! It also works the other way, but this is the correct one, thanks. \$\endgroup\$ – António Almeida Jan 5 '14 at 14:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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