 # ANEO Sponsored Puzzle discussion

#154

aah, I get it now. Thanks very much for clearing that up. I went back to read the problem statement again with this knowledge and it still wasn’t clear. #155

I found that the inequality below is able to check whether the light (at distance ‘d’,duration ‘t’) will be green or red while moving at the velocity (‘v’).

The light will be green if:

``````    d/v - t [ floor(d/vt) + mod( floor(d/vt) ,2 ) ] >= 0
``````

else:
The light will be red

• I am actually trying to find the nearest even multiple of ‘t’ to ‘d/v’.

#156

I suspect most of the problems people run into is this rule “You can not cross a traffic light the second it turns red !” You have to round such that this holds true in your math. That is you can hit a light just as it turns green, but you must hit a light before it turns read. Use floor and ceil wisely.

#157

Result:
Finally, I got 100% score.

Observation:
I found that using floor(d/(v*5/18)) works very well.

Conclusion:
Thanks ANEO for this interesting puzzle. #158

I’m annoyed by this puzzle…

``````/**
* Returns time (in seconds) to travel the given distance and the given speed.
* @param distance (meter)
* @param speedInkmPerHour (km/h)
* @return time in second to travel the given distance.
*/
private int getDuration(int distance, int speedInkmPerHour);
``````

Different implementations and result for the tests :

• (int) Math.round(distance/ ( speedInkmPerHour/ (18d/5d) ) );
–> 100% Given tests / 80% Validator tests
• (int) Math.floor(distance/ ( speedInkmPerHour/ (18d/5d) ) );
–> 80% Given tests / 90% Validator tests
• (int) Math.ceil(distance/ ( speedInkmPerHour/ (18d/5d) ) );
–> 80% Given tests / 80% Validator tests
• (int) (distance/ ( speedInkmPerHour/ (18d/5d) ) );
–> 80% Given tests / 90% Validator tests

or even

• (int) Math.round(distance/ ( speedInkmPerHour * (5d/18d) ) );
–> 100% Given tests / 80% Validator tests
• (int) Math.floor(distance/ ( speedInkmPerHour * (5d/18d) ) );
–> 80% Given tests / 90% Validator tests
• (int) Math.ceil(distance/ ( speedInkmPerHour * (5d/18d) ) );
–> 80% Given tests / 80% Validator tests
• (int) (distance/ ( speedInkmPerHour * (5d/18d) ) );
–> 80% Given tests / 90% Validator tests

#159

It is annoying. You must use both floor and ceil, never round. However, you haven’t said where you are using these rounding techniques. It matters. You can arrive at a light just when it turns green, however, you may not arrive at a light just as it turns red.

#160

Thank you. I will try these.

I use the following method with the time given by the method “getDuration(int distance, int speedInKmPerHour)” :

``````/**
* Returns if time is when light is green. <br/>
* Exclude instant when green -> red <br/>
* Include instant when red -> green.
* @param lightPeriod (in seconds) green -> red -> green -> red
* @param time (in seconds)
* @return
*/
private boolean isGreen(int lightPeriod, int time)
{
if(time < lightPeriod)
return true; // Pass before green -> red, OK
if(time == lightPeriod)
return false; // Pass when green -> red, not OK
if(time < lightPeriod*2)
return false; // Pass before red -> green not OK

return isGreen(lightPeriod, time-(lightPeriod*2));
}
``````

But maybe is should try another approach.

#161

IDK guys why are you going in such complicated matters on a problem which can be easily solved with a do while :))

#162

Yes I don’t see why 89 is not accepted, maybe a rounding problem because with floating numbers, 24.68 is the answer