F# で Project Euler Problem 8
まず、複数行文字列
> " - 12345 - 67890 - " - ;; val it : string = " 12345 67890 " > let str = " - 12345 - 67890 - ";; val str : string = " 12345 67890 "
改行を取り除く
> str.Replace("\n", "") - ;; val it : string = "1234567890"
文字列の中の1文字
> str.Chars(0);; val it : char = '\010' > str.Chars(1);; val it : char = '1' > str.Chars(2);; val it : char = '2' > String.length str - ;; val it : int = 13 > for i in [1..String.length(str)] do - printf "%d" i - ;; 12345678910111213val it : unit = () > for i in [0 .. String.length(str)-1] do - printf "%c" str.[i] - ;; 1234567890val it : unit = ()
5文字ずつ、取り出す
> "12345".Substring(2,3) - ;; val it : string = "345" > seq { - for i in [0 .. String.length(str)-1] do - yield str.Substring(i, 5) - } - ;; val it : seq<string> = seq ["12345"; "23456"; "34567"; "45678"; ...] > seq { - for i in [0 .. String.length(str)-1] do - yield str.Substring(i, 5) - } - ;; val it : seq<string> = seq ["12345"; "23456"; "34567"; "45678"; ...] > [ for i in [0 .. String.length(str)-5] do - yield str.Substring(i, 5) - ] - ;; val it : string list = ["12345"; "23456"; "34567"; "45678"; "56789"; "67890"]
文字を数値に
> int32("1") - ;; val it : int32 = 1
5文字の積
> "12345".ToCharArray() - ;; val it : char [] = [|'1'; '2'; '3'; '4'; '5'|] > [ for i in [0 .. String.length(str)-5] do - yield str.Substring(i, 5).ToCharArray() - ] - ;; val it : char [] list = [[|'1'; '2'; '3'; '4'; '5'|]; [|'2'; '3'; '4'; '5'; '6'|]; [|'3'; '4'; '5'; '6'; '7'|]; [|'4'; '5'; '6'; '7'; '8'|]; [|'5'; '6'; '7'; '8'; '9'|]; [|'6'; '7'; '8'; '9'; '0'|]] > [ for i in [0 .. String.length(str)-5] do - let lst = str.Substring(i, 5).ToCharArray() - |> Array.map(fun n -> n) - yield lst - ] - ;; val it : char [] list = [[|'1'; '2'; '3'; '4'; '5'|]; [|'2'; '3'; '4'; '5'; '6'|]; [|'3'; '4'; '5'; '6'; '7'|]; [|'4'; '5'; '6'; '7'; '8'|]; [|'5'; '6'; '7'; '8'; '9'|]; [|'6'; '7'; '8'; '9'; '0'|]] > [1..5];; val it : int list = [1; 2; 3; 4; 5] > [1..5] - |> List.reduce(+) - ;; val it : int = 15 > [|1..5|] - |> Array.reduce(+) - ;; val it : int = 15 > [|1..5|] - |> Array.reduce(*) - ;; val it : int = 120 > [ for i in [0 .. String.length(str)-5] do - let lst = str.Substring(i, 5).ToCharArray() - |> Array.map(fun n -> int32(n)) - |> Array.reduce(*) - yield lst - ] - ;; val it : int32 list = [344362200; 379501200; 417451320; 458377920; 502452720; 455051520] > [ for i in [0 .. String.length(str)-5] do - let lst = str.Substring(i, 5).ToCharArray() - |> Array.map(fun n -> int32(n)) - yield lst - ] - ;; val it : int32 [] list = [[|49; 50; 51; 52; 53|]; [|50; 51; 52; 53; 54|]; [|51; 52; 53; 54; 55|]; [|52; 53; 54; 55; 56|]; [|53; 54; 55; 56; 57|]; [|54; 55; 56; 57; 48|]] > [ for i in [0 .. String.length(str)-5] do - let lst = str.Substring(i, 5).ToCharArray() - |> Array.map(fun n -> int32(n) - 48) - yield lst - ] - ;; val it : int32 [] list = [[|1; 2; 3; 4; 5|]; [|2; 3; 4; 5; 6|]; [|3; 4; 5; 6; 7|]; [|4; 5; 6; 7; 8|]; [|5; 6; 7; 8; 9|]; [|6; 7; 8; 9; 0|]] > [ for i in [0 .. String.length(str)-5] do - let lst = str.Substring(i, 5).ToCharArray() - |> Array.map(fun n -> int32(n) - 48) - |> Array.reduce(*) - yield lst - ] - ;; val it : int32 list = [120; 720; 2520; 6720; 15120; 0] > [ for i in [0 .. String.length(str)-5] do - let lst = str.Substring(i, 5).ToCharArray() - |> Array.map(fun n -> int32(n) - 48) - |> Array.reduce(*) - yield lst - ] - |> List.max - ;; val it : int32 = 15120
まとめ
> let tmp = " - 73167176531330624919225119674426574742355349194934 - 96983520312774506326239578318016984801869478851843 - 85861560789112949495459501737958331952853208805511 - 12540698747158523863050715693290963295227443043557 - 66896648950445244523161731856403098711121722383113 - 62229893423380308135336276614282806444486645238749 - 30358907296290491560440772390713810515859307960866 - 70172427121883998797908792274921901699720888093776 - 65727333001053367881220235421809751254540594752243 - 52584907711670556013604839586446706324415722155397 - 53697817977846174064955149290862569321978468622482 - 83972241375657056057490261407972968652414535100474 - 82166370484403199890008895243450658541227588666881 - 16427171479924442928230863465674813919123162824586 - 17866458359124566529476545682848912883142607690042 - 24219022671055626321111109370544217506941658960408 - 07198403850962455444362981230987879927244284909188 - 84580156166097919133875499200524063689912560717606 - 05886116467109405077541002256983155200055935729725 - 71636269561882670428252483600823257530420752963450 - " - ;; val tmp : string = " 73167176531330624919225119674426574742355349194934 969835203"+[960 chars] > let str = tmp.Replace("\n", "") - ;; val str : string = "7316717653133062491922511967442657474235534919493496983520312"+[939 chars] > [ for i in [0 .. String.length(str)-5] do - let lst = str.Substring(i, 5).ToCharArray() - |> Array.map(fun n -> int32(n) - 48) - |> Array.reduce(*) - yield lst - ] - |> List.max - ;; val it : int32 = 40824