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

时间:2016-07-25 10:10:14

标签: ruby

我尝试执行此任务: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。

我不知道自己哪里做错了。有人可以提供一些解决问题的提示吗?

2 个答案:

答案 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就消失了。