查找序列中的第一个数字,该序列可以完全被另一个数字整除

时间:2017-12-02 20:37:16

标签: f#

我正在处理一系列编码挑战。作为其中的一部分,我需要在列表中找到可均分的两个数字。只有一组数字符合这一标准。

这是我现在的功能

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>,我不明白为什么。

1 个答案:

答案 0 :(得分: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