gudii9
asked on
int in the range of 30 to 50 challenge
Hi,
I was working on the int in the range of 30 to 50 challenge
http://codingbat.com/prob/p132134
I wrote code like below
Expected Run
in3050(30, 31) → true true OK
in3050(30, 41) → false false OK
in3050(40, 50) → true true OK
in3050(40, 51) → false true X
in3050(39, 50) → false false OK
in3050(50, 39) → false false OK
in3050(40, 39) → true true OK
in3050(49, 48) → true true OK
in3050(50, 40) → true true OK
in3050(50, 51) → false true X
in3050(35, 36) → true true OK
in3050(35, 45) → false false OK
Correct for more than half the tests
How to fix and improve my program. Please advise
I was working on the int in the range of 30 to 50 challenge
http://codingbat.com/prob/p132134
I wrote code like below
public boolean in3050(int a, int b) {
if((Math.abs(a-30)>=10 &&Math.abs(b-30)>=10) || (Math.abs(a-40)>=10&& Math.abs(b-40)>=10))
{
return true;
}
if((Math.abs(a-40)>=10 && Math.abs(b-40)>=10) || (Math.abs(a-50)>=10 && Math.abs(b-50)>=10))
{
return true;
}
return false;
}
I have couple of test cases failing as belowExpected Run
in3050(30, 31) → true true OK
in3050(30, 41) → false false OK
in3050(40, 50) → true true OK
in3050(40, 51) → false true X
in3050(39, 50) → false false OK
in3050(50, 39) → false false OK
in3050(40, 39) → true true OK
in3050(49, 48) → true true OK
in3050(50, 40) → true true OK
in3050(50, 51) → false true X
in3050(35, 36) → true true OK
in3050(35, 45) → false false OK
Correct for more than half the tests
How to fix and improve my program. Please advise
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Think more carefully about what in the range 30..40 inclusive means, and what Math.abs(a-30)>=10 means
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
thinking. Why thinking is takes time. why it is not spontaneous yet with java language unlike english language?
ASKER
in the mind i have answer but to teach computer to understand is bit hard for me
Don't worry that it takes time. It will all get faster with practice.
Everyone is slow when they start out.
Doug
Everyone is slow when they start out.
Doug
ASKER
public class Test9 {
public static void main(String[] args) {
// TODO Auto-generated method stub
in3050(40,51);
}
public static boolean in3050(int a, int b) {
if((Math.abs(a-30)<=10 &&Math.abs(b-30)<=10) || (Math.abs(a-40)<=10&& Math.abs(b-40)<=10))
{
return true;
}
if((Math.abs(a-40)<=10 && Math.abs(b-40)<=10) || (Math.abs(a-50)<=10 && Math.abs(b-50)<=10))
{
return true;
}
if((a-50)>0 && (b-50)>0)
{
return false;
}
return false;
}
}
tried as above but still not working. WIll modify more
Think more carefully about what in the range 30..40 inclusive means, and what Math.abs(a-40)<=10 means
Think about what happens when a is 29, 30, 31, 39, 40, 41
Another hint: How would you test for in the range -10..10?
Think about what happens when a is 29, 30, 31, 39, 40, 41
Another hint: How would you test for in the range -10..10?
>> why it is not spontaneous yet with java language unlike english language?
I think that's because you use the method Math.abs()
I wonder why you use it for this challenge?
Let's do it in English:
Checking if an int x is in the range 30...40 is just as simple as
1) checking that x is 30 or more
but ALSO
2) checking that x is no more than 40, thus 40 or less
In java
1) x >= 30
AND
2) x <= 40
Hence, checking if an int x is in the range 30...40 is just as simple as:
if ( x>=30 && x<=40) {
}
You have to check if both a and b are in the range 30..40, so that just doubling what you already had above:
if ( (a>=30 && a<=40) && (b>=30 && b<=40) ) {
}
And you have to check it for another range: 40...50, so that's replacing 30 by 40 and 40 by 50:
if ( (a>=40 && a<=50) && (b>=40 && b<=50) ) {
}
So the eventual result is:
I think that's because you use the method Math.abs()
I wonder why you use it for this challenge?
Let's do it in English:
Checking if an int x is in the range 30...40 is just as simple as
1) checking that x is 30 or more
but ALSO
2) checking that x is no more than 40, thus 40 or less
In java
1) x >= 30
AND
2) x <= 40
Hence, checking if an int x is in the range 30...40 is just as simple as:
if ( x>=30 && x<=40) {
}
You have to check if both a and b are in the range 30..40, so that just doubling what you already had above:
if ( (a>=30 && a<=40) && (b>=30 && b<=40) ) {
}
And you have to check it for another range: 40...50, so that's replacing 30 by 40 and 40 by 50:
if ( (a>=40 && a<=50) && (b>=40 && b<=50) ) {
}
So the eventual result is:
public boolean in3050(int a, int b) {
if ( (a>=30 && a<=40) && (b>=30 && b<=40) ) { // a and b in the range 30...40?
return true; // Yes!
}
if ( (a>=40 && a<=50) && (b>=40 && b<=50) ) { // a and b in the range 40...50?
return true; // Yes!
}
return false; // no succes (otherwhise, we shouldn't have come till here)
}
ASKER
Above solution works great.. in my mind i was struck with one direction of Math.abs for this challenge. How to keep mind working thinking on all different directions and possibilities.
For what range of numbers is Math.abs(a-40)<=10 true?
ASKER
both sides of 40 ie 30-50 since -10 also considered as 10 with abs
Yes. So can you see how to modify 30-50 to 30-40?
ASKER
public class Test8 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
boolean b=in3050(30, 51);
System.out.println("b is-->"+b);
}
public static boolean in3050(int a, int b) {
if ( a>=30 && a<=40 && b>=30 && b<=40 ) { // a and b in the range 30...40?
return true; // Yes!
}
if ( a>=40 && a<=50 && b>=40 && b<=50 ) { // a and b in the range 40...50?
return true; // Yes!
}
return false; // no succes (otherwhise, we shouldn't have come till here)
}
}
Even if i remove the inner brackets I still get same results.
Instead of
if ( (a>=30 && a<=40) &&( b>=30 && b<=40) )
changed as below
if ( a>=30 && a<=40 && b>=30 && b<=40 )
So no need of inner extra brackets right?
Please advise
In java, comparisons have precedence over boolean operators,
but I was asking whether you could figure out if
30-50 corresponds to Math.abs(a-40)<=10
then
30-40 corresponds to what?
but I was asking whether you could figure out if
30-50 corresponds to Math.abs(a-40)<=10
then
30-40 corresponds to what?
ASKER
(a-35)<=5
which adds 5 on both sides of 35
which adds 5 on both sides of 35
Correct, Math.abs(a-35)<=5 would test for the range 30..40
>> Above solution works great..
Then why didn't you give it any points?
Then why didn't you give it any points?
ASKER
Open in new window
I think i improved my code bit still 2 failing
Expected Run
in3050(30, 31) → true true OK
in3050(30, 41) → false false OK
in3050(40, 50) → true true OK
in3050(40, 51) → false true X
in3050(39, 50) → false false OK
in3050(50, 39) → false false OK
in3050(40, 39) → true true OK
in3050(49, 48) → true true OK
in3050(50, 40) → true true OK
in3050(50, 51) → false true X
in3050(35, 36) → true true OK
in3050(35, 45) → false false OK