2017-12-02 170 views
0

我正在處理一組編碼挑戰。作爲其中的一部分,我需要在列表中找到可以被整除的兩個數字。只會有一組數字符合這個標準。查找可以被另一個數字整除的序列中的第一個數字

這是我現在所擁有的

let spreadsheet (s: string) = 
    s.Split([|"\r\n"|], StringSplitOptions.RemoveEmptyEntries) 
    |> Seq.map (fun(d: string) -> d.Split([|' '|], StringSplitOptions.RemoveEmptyEntries) |> Seq.map Int32.Parse) 

let fourthChallenge() = 
    // In the real code, this reads from a file. That part works fine though. 
    let input = spreadsheet "5 9 2 8\r\n9 4 7 3\r\n3 8 6 5" 
    let firstEvenlyDivisable number data = data |> Seq.collect /number |> Seq.find (fun x -> box x :? int) 
    let rowChecksums = input |> Seq.map (fun (row: seq<int>) -> Seq.iteri (fun i n -> firstEvenlyDivisable n (Seq.skip i row))) 
    Seq.sum rowChecksums 

我有現在的問題是,firstEvenlyDivisable似乎是一個seq<int> -> unit,而不是seq<int> -> int我期望的功能。

當數據出來Seq.collect /number它似乎是seq<unit>,我不清楚爲什麼。

+0

我建議添加類型註釋以幫助追蹤問題。 – Foole

+0

@Foole Yup,看起來像'iteri'不會返回一個序列。我完全認爲它的確如此。我其實需要'mapi'。 –

回答

1

問題是Seq.iteri沒有返回生成的序列。要在運行項目功能後返回序列,您需要mapi

您還需要明確地將row作爲第二個參數傳遞給Seq.mapi

這是代碼的工作版本。

let fourthChallenge() = 
    let input = spreadsheet (readChallengeInput 3) 
    let firstEvenlyDivisable number (data: seq<int>) = data |> Seq.map (fun (i: int) -> i/number) |> Seq.find (fun x -> box x :? int) 
    let rowChecksums = input |> Seq.collect (fun (row: seq<int>) -> Seq.mapi (fun i n -> firstEvenlyDivisable n (Seq.skip i row)) row) 
    Seq.sum rowChecksums 
相關問題