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)