问题与得到正确的最高平均速度
我尝试做这个任务:codewars kata问题与得到正确的最高平均速度
说明:
在约翰的汽车GPS记录每S秒的距离从起点行驶 (距离测量在任意但一致的 单位)。例如,下面是其中s = 15的记录的一部分:
X = [0.0,0.19,0.5,0.75,1.0,1.25,1.5,1.75,2.0,2.25]的 区段:
0.0-0.19,0.19-0.5,0.5-0.75,0.75-1.0,1.0-1.25,1.25-1.50,1.5-1.75,1.75-2.0,2.0-2.25我们可以计算John的平均每小时的小时速度,我们得到:
[45.6,74.4,60.0,60.0,60.0,60.0,60.0,60.0,60.0]给定s和x 的任务是返回一个整数的平均最大平均速度 X。如果x长度小于 或等于1则返回0:汽车没有移动。
实施例:
与上述数据的函数的GPS(X,S)应该返回74
我的代码:
def gps(s, x)
i = 0
speed = 0
max = 0
0 if x.length <= 1
while i < x.length - 2
speed = get_speed(x[i].to_f, x[i + 1].to_f, s)
max = speed if speed > max
i += 1
end
print max.floor
end
def get_speed(a, b, s)
((b - a).abs * ((60/s) * 60))
end
问题是与通过一些测试。
测试: gps(20, [0.0, 0.23, 0.46, 0.69, 0.92, 1.15, 1.38, 1.61]) result: 41
- 正确 gps(12, [0.0, 0.11, 0.22, 0.33, 0.44, 0.65, 1.08, 1.26, 1.68, 1.89, 2.1, 2.31, 2.52, 3.25]) result: 77
- 不正确,应该是219
我没有想法,我做错了。有人可以提供一些提示来解决问题吗?
@mcfinnigan's answer正确地识别眼前的错误在你的代码,但真正根本原因是,你是不是写地道的红宝石。如果您正在编写惯用的Ruby(而不是像Ruby那样使用FORTRAN,那么您将使用迭代器而不是手动摆弄循环索引,而且问题甚至不会出现在第一位。事情是这样的:
def gps(interval, measurements)
compute_result(interval, measurements).tap(&method(:print))
end
private
def compute_result(interval, measurements)
return 0 if measurements.length <= 1
hourly_speed(max_distance(*distances(*measurements)), interval)
end
def distances(*measurements)
measurements.
each_cons(2). # iterate over all consecutive pairs
map {|a, b| b - a } # transform to list of distances travelled
end
def max_distance(*distances)
distances.max
end
def hourly_speed(distance, time_in_seconds)
seconds_per_hour = 60.0 * 60
(distance * seconds_per_hour/time_in_seconds).floor
end
正如你看到的,有没有循环,没有指标,没有循环的条件,事实上,除了空测量阵列的edgecase,还有根本没有条件,等有是没有条件,指标,循环等得到错误。
该问题被分解为可以单独测试和调试的较小子问题。每个方法都会返回一个值(而不是仅仅打印到控制台),从而可以轻松地自动对其进行测试(也可以在其他方法中重复使用)。
while i < x.length - 2
这似乎是问题所在。一个典型的错误的错误;你没有考虑数组中的最后一个元素。
更改条件
while i < x.length - 1
和你的bug消失。
我不同意你的看法,因为我用x.length -2得到X [I + 1]。在你的情况下,我+ 1是阵列的范围。 –
我向你保证它不是。你的数组长度为14,我从未超过12. – mcfinnigan
好吧,我同意你的看法,但仍然没有通过所有测试。 –
你能在这里发表的问题? – Pramod
@Pramod公布更新后的 –