问题与得到正确的最高平均速度

问题描述:

我尝试做这个任务: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

我没有想法,我做错了。有人可以提供一些提示来解决问题吗?

+0

你能在这里发表的问题? – Pramod

+0

@Pramod公布更新后的 –

@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,还有根本没有条件,等有是没有条件,指标,循环等得到错误。

该问题被分解为可以单独测试和调试的较小子问题。每个方法都会返回一个值(而不是仅仅打印到控制台),从而可以轻松地自动对其进行测试(也可以在其他方法中重复使用)。

+0

这是一个不错的解决方案。 – mcfinnigan

+0

你能解释一下为什么你不注意,有些参数是可选的? –

+0

@ŁukaszKorol:我的代码中没有可选参数。 –

while i < x.length - 2 

这似乎是问题所在。一个典型的错误的错误;你没有考虑数组中的最后一个元素。

更改条件

while i < x.length - 1 

和你的bug消失。

+0

我不同意你的看法,因为我用x.length -2得到X [I + 1]。在你的情况下,我+ 1是阵列的范围。 –

+1

我向你保证它不是。你的数组长度为14,我从未超过12. – mcfinnigan

+0

好吧,我同意你的看法,但仍然没有通过所有测试。 –