我尝试执行此任务:codewars kata
说明
在约翰的汽车中,GPS每秒记录行进的距离 来自原点(距离是以任意但一致的方式测量的 单元)。例如,下面是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我们可以计算约翰的平均每小时速度每个部分我们得到:
[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 :(得分:3)
@mcfinnigan's answer正确识别代码中的直接错误,但真正的根本原因是您没有编写惯用的Ruby。如果您正在编写惯用的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
如你所见,没有循环,没有索引,没有循环条件,事实上,除了空测量数组的边缘情况外,根本没有条件,所以没有条件,索引,循环等出错了。
问题被分解为可以单独测试和调试的较小子问题。每个方法都返回一个值(而不是仅仅打印到控制台),这样就可以轻松地自动测试它(以及在其他方法中重复使用它)。
答案 1 :(得分:2)
while i < x.length - 2
这似乎是个问题。一个经典的一个一个错误;你没有考虑阵列中的最后一个元素。
将您的条件更改为
while i < x.length - 1
你的bug就消失了。