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\$
1
  • \$\begingroup\$ there is "Show Solution" button that shows 3 solutions on the page you linked \$\endgroup\$
    – Nikita U.
    Jan 9, 2014 at 13:54

2 Answers 2

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\$
6
  • \$\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\$ Jan 4, 2014 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, 2014 at 13:45
  • 6
    \$\begingroup\$ Trust me, I'm a monkey, and I know monkeyTrouble() ;-) \$\endgroup\$
    – rolfl
    Jan 4, 2014 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\$ Jan 4, 2014 at 15:54
  • 1
    \$\begingroup\$ @retailcoder : big difference between false == false and false && false.... ;-) \$\endgroup\$
    – rolfl
    Jan 4, 2014 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
  • 4
    \$\begingroup\$ The negation of XOR is also known as XNOR. \$\endgroup\$ Jan 4, 2014 at 17:32
  • 2
    \$\begingroup\$ Wrong precedence there. \$\endgroup\$ Jan 5, 2014 at 1:11
  • \$\begingroup\$ Shouldn't this be: !(aSmile ^ bSmile)? \$\endgroup\$ Jan 5, 2014 at 12:16
  • \$\begingroup\$ @WayneConrad, you are right, Its corrected! It also works the other way, but this is the correct one, thanks. \$\endgroup\$ Jan 5, 2014 at 14:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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