f# - 循环遍历数组

时间:2009-02-07 23:02:56

标签: f#

我决定把f#作为我的功能语言。

我的问题:在文件中给出一堆50位数,得到每行总和的前10位数。 (对于那些知道的人来说是欧拉问题)

例如(简化): 1234567890

总和是45
第一个“十”数字或在我们的例子中“第一”数字是4.

继承我的问题, 我读了我的数字文件, 我可以使用“\ n”分割它,现在我有每一行,然后我尝试将它转换为char数组,但问题来了。我无法访问该数组的每个元素。

let total =
    lines.Split([|'\n'|])
    |> Seq.map  (fun line -> line.ToCharArray())
    |> Seq.take 1
    |> Seq.to_list  
    |> Seq.length

我得到每一行,将它转换为数组,我拿第一个数组(仅用于测试),我尝试将其转换为列表,然后获取列表的长度。但是这个长度是我有多少个数组的长度(即1)。它应该是50,因为数组中有多少元素。

有没有人知道如何管道它来访问每个char?

5 个答案:

答案 0 :(得分:5)

Seq.take仍在返回seq<char array>。要获得第一个数组,您可以使用Seq.nth 0

答案 1 :(得分:4)

我的最终答案:

let total =
    lines.Split([|'\n'|])
    |> Seq.map (fun line -> line.ToCharArray() |> Array.to_seq)      
    |> Seq.map (fun eachSeq -> eachSeq 
                               |> Seq.take 50 //get rid of the \r
                               |> Seq.map (fun c -> Double.Parse(c.ToString()))
                               |> Seq.skip 10
                               |> Seq.sum                                
                               )
    |> Seq.average

是我最终得到的,它正在发挥作用:)。

基本上在我将它转换为charArray后,我将其作为一个序列。所以现在我有一系列的序列。然后我可以遍历每个序列。

答案 2 :(得分:3)

我不是百分百肯定你所要求的,但我相信你正试图写这样的东西:

lines.Split([|'\n'|) |> Seq.map (fun line -> line.Length)

这会将每一行转换为表示每行长度的整数序列。

答案 3 :(得分:3)

这是我的解决方案:

string(Seq.sumBy bigint.Parse (data.Split[|'\n'|])).Substring(0, 10)

答案 4 :(得分:1)

我将数据复制到一个字符串中,每行用x分隔。然后答案就是一行(换成SO):

let ans13 = data |> String.split ['x'] |> Seq.map Math.BigInt.Parse 
                                                      |> Seq.reduce (+)

如果您正在从文件中读取它,则需要添加文件读取代码:

let ans13 = IO.File.ReadAllLines("filename") |> Seq.map Math.BigInt.Parse
                                                            |> Seq.reduce (+)

编辑:实际上,我不确定我们是在谈论同样的欧拉问题 - 这是13,但你的描述听起来略有不同。要在求和后得到前10位数,请执行:

printfn "%s" <| String.sub (string ans13) 0 10
相关问题