// Euler Problem 17: Number letter counts
let rec numberEnglish n =
match n with
| _ when n < 1 -> ""
| 1 -> "one"
| 2 -> "two"
| 3 -> "three"
| 4 -> "four"
| 5 -> "five"
| 6 -> "six"
| 7 -> "seven"
| 8 -> "eight"
| 9 -> "nine"
| 10 -> "ten"
| 11 -> "eleven"
| 12 -> "twelve"
| _ when n >= 13 && n <= 19 -> teens n
| _ when n >= 20 && n <= 99 -> teens2 n
| _ when n >= 100 && n <= 999 -> hundreds n
| 1000 -> "one thousand"
| _ -> ""
and teens n =
match n with
| 13 -> "thir"
| 14 -> "four"
| 15 -> "fif"
| 16 -> "six"
| 17 -> "seven"
| 18 -> "eigh"
| 19 -> "nine"
| _ -> ""
+ "teen"
and teens2 n =
let m1 =
match n / 10 with
| 2 -> "twenty"
| 3 -> "thirty"
| 4 -> "forty"
| 5 -> "fifty"
| 6 -> "sixty"
| 7 -> "seventy"
| 8 -> "eighty"
| 9 -> "ninety"
| _ -> ""
let m2 =
match n % 10 with
| 0 -> ""
| m -> "-" + numberEnglish m
m1 + m2
and hundreds n =
let m1 = numberEnglish (n / 100) + " hundred"
let m2 =
match n % 100 with
| 0 -> ""
| m -> " and " + numberEnglish m
m1 + m2
let euler017 () =
let sb = System.Text.StringBuilder ()
(sb, { 1 .. 1000 })
||> Seq.fold (fun b n -> b.Append (numberEnglish n))
|> string
|> Seq.sumBy (fun c -> if Core.char.IsLetter c then 1 else 0)
let timer f =
let sw = System.Diagnostics.Stopwatch ()
sw.Start ()
let r = f ()
sw.Stop ()
r, sw.Elapsed
let _ =
let r, t = timer euler017
printfn "Result: %A" r
printfn "Time: %A" t
Ly8gRXVsZXIgUHJvYmxlbSAxNzogTnVtYmVyIGxldHRlciBjb3VudHMKCmxldCByZWMgbnVtYmVyRW5nbGlzaCBuID0KICAgIG1hdGNoIG4gd2l0aAogICAgfCBfIHdoZW4gbiA8IDEgLT4gIiIKICAgIHwgMSAtPiAib25lIgogICAgfCAyIC0+ICJ0d28iCiAgICB8IDMgLT4gInRocmVlIgogICAgfCA0IC0+ICJmb3VyIgogICAgfCA1IC0+ICJmaXZlIgogICAgfCA2IC0+ICJzaXgiCiAgICB8IDcgLT4gInNldmVuIgogICAgfCA4IC0+ICJlaWdodCIKICAgIHwgOSAtPiAibmluZSIKICAgIHwgMTAgLT4gInRlbiIKICAgIHwgMTEgLT4gImVsZXZlbiIKICAgIHwgMTIgLT4gInR3ZWx2ZSIKICAgIHwgXyB3aGVuIG4gPj0gMTMgJiYgbiA8PSAxOSAtPiB0ZWVucyBuCiAgICB8IF8gd2hlbiBuID49IDIwICYmIG4gPD0gOTkgLT4gdGVlbnMyIG4KICAgIHwgXyB3aGVuIG4gPj0gMTAwICYmIG4gPD0gOTk5IC0+IGh1bmRyZWRzIG4KICAgIHwgMTAwMCAtPiAib25lIHRob3VzYW5kIgogICAgfCBfIC0+ICIiCgphbmQgdGVlbnMgbiA9CiAgICBtYXRjaCBuIHdpdGgKICAgIHwgMTMgLT4gInRoaXIiCiAgICB8IDE0IC0+ICJmb3VyIgogICAgfCAxNSAtPiAiZmlmIgogICAgfCAxNiAtPiAic2l4IgogICAgfCAxNyAtPiAic2V2ZW4iCiAgICB8IDE4IC0+ICJlaWdoIgogICAgfCAxOSAtPiAibmluZSIKICAgIHwgXyAtPiAiIgogICAgKyAidGVlbiIKCmFuZCB0ZWVuczIgbiA9CiAgICBsZXQgbTEgPQogICAgICAgIG1hdGNoIG4gLyAxMCB3aXRoCiAgICAgICAgfCAyIC0+ICJ0d2VudHkiCiAgICAgICAgfCAzIC0+ICJ0aGlydHkiCiAgICAgICAgfCA0IC0+ICJmb3J0eSIKICAgICAgICB8IDUgLT4gImZpZnR5IgogICAgICAgIHwgNiAtPiAic2l4dHkiCiAgICAgICAgfCA3IC0+ICJzZXZlbnR5IgogICAgICAgIHwgOCAtPiAiZWlnaHR5IgogICAgICAgIHwgOSAtPiAibmluZXR5IgogICAgICAgIHwgXyAtPiAiIgogICAgbGV0IG0yID0KICAgICAgICBtYXRjaCBuICUgMTAgd2l0aAogICAgICAgIHwgMCAtPiAiIgogICAgICAgIHwgbSAtPiAiLSIgKyBudW1iZXJFbmdsaXNoIG0KICAgIG0xICsgbTIKCmFuZCBodW5kcmVkcyBuID0KICAgIGxldCBtMSA9IG51bWJlckVuZ2xpc2ggKG4gLyAxMDApICsgIiBodW5kcmVkIgogICAgbGV0IG0yID0KICAgICAgICBtYXRjaCBuICUgMTAwIHdpdGgKICAgICAgICB8IDAgLT4gIiIKICAgICAgICB8IG0gLT4gIiBhbmQgIiArIG51bWJlckVuZ2xpc2ggbQogICAgbTEgKyBtMgoKbGV0IGV1bGVyMDE3ICgpID0KICAgIGxldCBzYiA9IFN5c3RlbS5UZXh0LlN0cmluZ0J1aWxkZXIgKCkKICAgIChzYiwgeyAxIC4uIDEwMDAgfSkKICAgIHx8PiBTZXEuZm9sZCAoZnVuIGIgbiAtPiBiLkFwcGVuZCAobnVtYmVyRW5nbGlzaCBuKSkKICAgIHw+IHN0cmluZwogICAgfD4gU2VxLnN1bUJ5IChmdW4gYyAtPiBpZiBDb3JlLmNoYXIuSXNMZXR0ZXIgYyB0aGVuIDEgZWxzZSAwKQoKbGV0IHRpbWVyIGYgPQogICAgbGV0IHN3ID0gU3lzdGVtLkRpYWdub3N0aWNzLlN0b3B3YXRjaCAoKQogICAgc3cuU3RhcnQgKCkKICAgIGxldCByID0gZiAoKQogICAgc3cuU3RvcCAoKQogICAgciwgc3cuRWxhcHNlZAoKbGV0IF8gPQogICAgbGV0IHIsIHQgPSB0aW1lciBldWxlcjAxNwogICAgcHJpbnRmbiAiUmVzdWx0OiAlQSIgcgogICAgcHJpbnRmbiAiVGltZTogJUEiIHQK