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)