我决定把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?
答案 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