Project Euler

Problem #17

If the numbers 1 to 5 are written out in words: one, two, three, four, five, then there are 3 + 3 + 5 + 4 + 4 = 19 letters used in total.

If all the numbers from 1 to 1000 (one thousand) inclusive were written out in words, how many letters would be used?


NOTE: Do not count spaces or hyphens. For example, 342 (three hundred and forty-two) contains 23 letters and 115 (one hundred and fifteen) contains 20 letters. The use of "and" when writing out numbers is in compliance with British usage.

Erlang: Running time = 0.203s
p17()->io:format("~w~n",[lists:sum(lists:map(fun(X)->p17(X) end,lists:seq(1,1000)))]).
p17(0)->0;
p17(1)->3;     %"one"
p17(2)->3;     %"two"
p17(3)->5;     %"three"
p17(4)->4;     %"four"
p17(5)->4;     %"five"
p17(6)->3;     %"six"
p17(7)->5;     %"seven"
p17(8)->5;     %"eight"
p17(9)->4;     %"nine"
p17(10)->3;    %"ten"
p17(11)->6;    %"eleven"
p17(12)->6;    %"twelve"
p17(13)->8;    %"thirteen"
p17(14)->8;    %"fourteen"
p17(15)->7;    %"fifteen"
p17(16)->7;    %"sixteen"
p17(17)->9;    %"seventeen"
p17(18)->8;    %"eighteen"
p17(19)->8;    %"nineteen"
p17(1000)->11; %"one thousand"

p17(N) when N<40 -> 6+p17(N rem 10);   %"twenty","thirty"
p17(N) when N<70 -> 5+p17(N rem 10);   %"forty","fifty","sixty"
p17(N) when N<80 -> 7+p17(N rem 10);   %"seventy"
p17(N) when N<100 -> 6+p17(N rem 10);  %"eighty","ninety"
p17(N) when N rem 100 == 0-> p17(N div 100)+7;
p17(N) -> p17(N div 100) + 10 + p17(N rem 100).

Ruby: Running time = 0.04s
+#Enumerable

def p17write_num(n)
  return "" if n==0
  return "onethousand" if n==1000
  return (["one","two","three","four","five","six","seven","eight","nine"])[n-1] if n<10
  return p17write_num(n/100)+"hundred" if n%100==0
  return p17write_num(n/100)+"hundredand"+p17write_num(n%100) if n>100
  return (["ten", "eleven", "twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"])[n-10] if n<20
  (['twenty','thirty','forty','fifty','sixty','seventy','eighty','ninety'])[n/10 - 2]+p17write_num(n%10)
end

def p17
  puts (1..1000).map{|i|p17write_num(i).length}.sum
end