Project Euler 17

http://projecteuler.net/index.php?section=problems&id=17


再帰的にも書けそうですが、ここでは配列を使っています。

let init_array () =
   let str = [ "one"; "two"; "three"; "four"; "five"; "six"; "seven";
         "eight"; "nine"; "ten"; "eleven"; "twelve"; "thirteen";
         "fourteen"; "fifteen"; "sixteen"; "seventeen"; "eighteen";
         "nineteen"; "twelve"; "thirty"; "forty"; "fifty"; "sixty";
         "seventy"; "eighty"; "ninety"; "hundred"; "thousand" ]
   let num = [ 1..20 ] @ [ 30..10..100 ] @ [ 1000 ]
   
   let a = Array.create 1001 0
   List.iter (fun x -> a.[snd x] <- String.length (fst x))
                                          (List.zip str num)
   a

let update (a : int []) n =
   if n < 100 then
      a.[n] <- a.[n/10*10] + a.[n%10]
   else if n % 100 = 0 then
      a.[n] <- a.[n/100] + a.[100] + a.[n%100]
   else
      a.[n] <- a.[n/100] + a.[100] + "and".Length + a.[n%100]

let (a : int []) = init_array ()
List.iter (fun n -> if a.[n] = 0 then update a n) [1..1000]
a.[100] <- a.[100] + "one".Length
a.[1000] <- a.[1000] + "one".Length
printfn "%d" (Array.sum a)