2011-11-01 104 views
3

這是我在這個網站上的第一篇文章:-)我正在學習F#。爲此,我嘗試解決歐拉問題(http://projecteuler.net/)。在第11題(http://projecteuler.net/problem=11),完成第一個任務就是解析包含該20×20個網格中的文件:F#:文件解析

08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 

我寫了這個代碼解析的文件,我試圖做一個「功能「 辦法。它的工作原理,但我覺得它有點複雜相比,我可以寫在C#:

open System 
open System.IO 

let readLines = 
    seq { 
     use sr = new StreamReader("Input.txt") 
     while not sr.EndOfStream do 
      yield sr.ReadLine() 
    } |> Seq.zip (Seq.ofList [0..19]) 

let parseLine tupleLine = 
    let (index:int, line:string) = tupleLine 
    line.Split([| ' ' |]) 
    |> Array.map(fun s -> Int32.Parse(s)) 
    |> Seq.zip [| 0 .. 19 |] 
    |> Seq.map (fun tl -> (index, fst tl, snd tl)) 

let tabNumbers = Array.create 400 0 

let fillArray tupleNumber = 
    let (line, column, number) = tupleNumber 
    tabNumbers.[20 * line + column] <- number 

readLines 
|> Seq.map parseLine 
|> ignore 

有沒有一種簡單的方法來實現這一點? 提前謝謝!

PS:對不起我的英文不好...

+2

也許你不應該這樣做基於行,而是分裂每個空白字符。 – 2011-11-01 11:59:21

+0

你的英語不錯。 (La seule'faute'c'est de mettre des espaces avant les':?!')PS。 as-tu vu http://french.stackexchange.com? – Benjol

回答

10

這是你的代碼的相應版本:

let readLines = 
    "Input.txt" 
    |> File.ReadAllLines 
    |> Array.mapi (fun i line -> (i, line)) 

let parseLine (i, line) = 
    line.Split([|' '|]) 
    |> Array.mapi (fun j s -> i, j, Int32.Parse(s)) 

或者你可以結合他們有一個更簡潔的版本:

let readAll = 
    "Input.txt" 
    |> File.ReadAllLines 
    |> Array.mapi (fun i line -> line.Split([|' '|]) 
           |> Array.mapi (fun j s -> i, j, Int32.Parse(s))) 
+0

感謝您的回答,並感謝Array.mapi功能!你的解決方案比我的更乾淨清晰! 編輯:我想說你的答案是有用的,但我沒有enoiugh聲望做到這一點... – schglurps

+0

這樣做了,我投了你的答案! :-) – schglurps