2016-07-25 61 views
0

我嘗試做這個任務: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公佈更新後的 –

回答

3

@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:我的代碼中沒有可選參數。 –

2
while i < x.length - 2 

這似乎是問題所在。一個典型的錯誤的錯誤;你沒有考慮數組中的最後一個元素。

更改條件

while i < x.length - 1 

和你的bug消失。

+0

我不同意你的看法,因爲我用x.length -2得到X [I + 1]。在你的情況下,我+ 1是陣列的範圍。 –

+1

我向你保證它不是。你的數組長度爲14,我從未超過12. – mcfinnigan

+0

好吧,我同意你的看法,但仍然沒有通過所有測試。 –