2013-05-26 38 views
1

我想用F#解決Project Euler Problem #11,我在解決如何實例化原始網格時遇到問題。如何實例化一個包含數據的矩形數組?

我已經試過:

let grid : int [,] = [|[|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|]|] 

和許多其他的排列沒有運氣。我所有的努力給我:

這種表達預計有型int [,]但這裏有類型'a[]

如何實例化矩形陣列,而不必單獨設置每個單元格?

+0

有一個多維數組字面沒有語法。使用'array2D'運算符或'Array2D.init'函數。請參閱[MSDN](http://msdn.microsoft.com/en-us/library/dd233214.aspx)文章。 – bytebuster

+0

你正在創建一個'int [] []'這可能對你想要的有好處 - 訪問'grid。[x]。[y]'雖然可能會很笨拙 –

+0

而不是將數據硬編碼到代碼中I' d帶有文本文件和數據加載器功能。 –

回答

6

您可以使用內置庫函數array2D。它將數組int[][]的數組轉換成二維數組int[,]。你可以這樣調用(使用略小輸入數組):

let grid = 
    array2D [| [|08; 02; 22; |] 
      [|49; 49; 99; |]   
      [|01; 70; 54; |] |] 

,或者您可以使用流水線操作,並調用它像這樣:

let grid = 
    [| [|08; 02; 22; |] 
    [|49; 49; 99; |]   
    [|01; 70; 54; |] |] |> array2D 

雖然這不是一種特殊的語言語法用於構建二維數組,實際上它的功能如同一個.F#有許多類似的功能,您可以使用它們來構建集合,不可變的映射和其他類型。在下面的例子中,seqdict的所有功能,但你可以看到他們的語法(對於某些其它數據類型,有更長的功能,如Map.ofSeq):

dict [ "cz", "Ahoj"; "en", "Hello" ] 
seq { 1 .. 100 } 

功能實際上對任何收集工作集合(不只是陣列的陣列),因爲它具有以下類型:

val array2D : seq<#seq<'a>> -> 'a[,] 

這意味着它需要實現該IEnumerable接口(內#seq)任何類型的任意序列(外seq) - 因此你也可以生產T.他使用更復雜的序列解析數據,然後將其傳遞給array2D

+0

'map'從哪裏來?它似乎不適合我。也許它需要一些「開放」的? – svick

+0

Map是f#中標準的不可變關聯數組(或c#中的字典):http://msdn.microsoft.com/en-us/library/ee353686.aspx –

+0

@svick我的壞 - 「map」實際上並不存在。要構建地圖,必須使用長函數名稱 - 「Map.ofSeq」。 –

0

如何:

let my2DArray = 
    [| for i in 0 .. rowCount - 1 do 
     yield [| for i in 0 ..columnCount - 1 do yield init |] 
    |] |> array2D 
相關問題