【发布时间】:2020-02-28 22:04:11
【问题描述】:
我目前正在解决这个 kata:"How far I will go?"!
描述说:
输入:您最近发现马以一种独特的方式旅行 - 他们要么在奔跑(以最高速度),要么在休息(静止不动)。
以下是一匹特定马如何旅行的示例:
Blaze 可以以 14 米/秒的速度奔跑 60 秒,但必须 然后休息 45 秒。
500 秒后,Blaze 将行驶 4200 米。
你的工作是编写一个函数来返回一匹马能跑多长时间 在给定时间之后旅行。
totalTime - How long the horse will be traveling (in seconds)
runTime - How long the horse can run for before having to rest (in seconds)
restTime - How long the horse have to rest for after running (in seconds)
speed - The max speed of the horse (in metres/second)
我已经手算过:
给定:速度 = 14,运行时间 = 60,休息时间 = 45,总时间 = 500
-> 为了计算马跑了多少时间,我们计算如下:
totalTime / (runTime + restTime) = 500 / (60 + 45) = 500 / 105 = 4.76... roundUp(totalTime) = 5
总运行时间 = 5 * 运行时间 = 5 * 60 = 300
--> 计算马走了多少距离:
x = 速度 * 总运行时间 = 14 * 300 = 4200
我已经翻译成如下代码:
public class Kata {
public static int travel(int totalTime, int runTime, int restTime, int speed) {
int totalRunTime = 0;
if(totalTime < runTime){
totalRunTime = totalTime;
}else{
totalRunTime = (int)Math.ceil( (double)totalTime/(runTime + restTime) ) * runTime;
}
return speed * totalRunTime;
}
}
当我们运行基本测试时,它会给出预期的输出:
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import org.junit.runners.JUnit4;
public class KataTest {
@Test
public void exampleTests() {
assertEquals(4200, Kata.travel(500, 60, 45, 14));
assertEquals(1120, Kata.travel(1000, 10, 127, 14));
assertEquals(1000, Kata.travel(100, 10, 0, 10));
assertEquals(1000, Kata.travel(100, 10, 0, 10));
assertEquals(450, Kata.travel(25, 50, 120, 18));
}
}
但是,当我们使用高级示例进行测试时,数字更大,它显示的结果不准确。
例如:
给定:速度 = 6,运行时间 = 34,休息时间 = 180,总时间 = 99094;预期的输出是 94524,但是我发布的代码给了我们 94656
我已经手写了跟踪以了解我的代码的作用:
-> 计算这匹马跑的总时间:
totalTime / (runTime + restTime) = 99094 / (34 + 180) = 99094 / 214 = 463.05... roundUp(totalTime) = 464
总运行时间 = 464 * 运行时间 = 464 * 34 = 15776
--> 计算马走了多远:
x = 速度 * 总运行时间 = 6 * 15776 = 94656
那么失败的测试是:
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import org.junit.runners.JUnit4;
public class KataTest {
@Test
public void biggerTests() {
assertEquals(84954920, Kata.travel(35869784, 90, 100, 5));
}
}
我的直觉是代码必须在从 double 到 int 的转换或使用 Math.ceil 的舍入中进行改进,但我不知道为什么或如何解决它。这是我认为我们可以改进的地方:
totalRunTime = (int)Math.ceil( (double)totalTime/(runTime + restTime) ) * runTime;
我也看过:
【问题讨论】:
-
如果手动计算给出
94656但预期是94524那么问题在于计算,而不是四舍五入。 (在这种情况下,用463*214(向下取整)得到整个周期的99082;现在只剩下12秒,所以马不会跑满18秒,计算公式如下给定算法) -
还是个小例子,马跑60秒后要休息60秒,总时间是30秒。
标签: java math int double calculus