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; 
}
200_success
146k22 gold badges190 silver badges479 bronze badges
asked Jan 4, 2014 at 13:20
\$\endgroup\$
1
  • \$\begingroup\$ there is "Show Solution" button that shows 3 solutions on the page you linked \$\endgroup\$ Commented 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
200_success
146k22 gold badges190 silver badges479 bronze badges
answered Jan 4, 2014 at 13:25
\$\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\$ Commented 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\$ Commented Jan 4, 2014 at 13:45
  • 6
    \$\begingroup\$ Trust me, I'm a monkey, and I know monkeyTrouble() ;-) \$\endgroup\$ Commented 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\$ Commented Jan 4, 2014 at 15:54
  • 1
    \$\begingroup\$ @retailcoder : big difference between false == false and false && false.... ;-) \$\endgroup\$ Commented 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
answered Jan 4, 2014 at 14:02
\$\endgroup\$
4
  • 4
    \$\begingroup\$ The negation of XOR is also known as XNOR. \$\endgroup\$ Commented Jan 4, 2014 at 17:32
  • 2
    \$\begingroup\$ Wrong precedence there. \$\endgroup\$ Commented Jan 5, 2014 at 1:11
  • \$\begingroup\$ Shouldn't this be: !(aSmile ^ bSmile)? \$\endgroup\$ Commented 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\$ Commented Jan 5, 2014 at 14:39

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.