ONLY DO WHAT ONLY YOU CAN DO

こけたら立ちなはれ 立ったら歩きなはれ

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