21 de noviembre de 2013

Number letter counts - Project Euler, problema 17

El problema es el siguiente:
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.

y mi solución (mas bonita sin los comments xD) en matlab/octave es la siguiente:

%Aquí se cuentan los dígitos
%length('onetwothreefourfivesixseveneightnine');
unoa9=36;
%del 10 al 19
%length('teneleventwelvethirteenfourteenfifteensixteenseventeeneighteennineteen');
dieza19=70;
  %aquí se cuentan las decenas
  %10*length('teneleventwelvethirteenfourteenfifteensixteenseventeeneighteennineteen');
unoa99=460;
  %y acá se le agregan los números del 10 al 19
  %además 9 veces los dígitos:
  %21,...,29,31,...,39,....,91,...,99
unoa99=unoa99+dieza19+unoa9*9;
  %1-99,..,101-199,....,901-999
unoa1000=10*unoa99;
%recordar contar la palabra and
%length('hundredand');
h=10;
  %analicemos cada decena:
  %hay 100 decenas
  %una decena cualquiera (de interés del problema)
  %utiliza una vez todos los dígitos de 1 a 9
  %y en caso de ser parte de un número mayor a cien
  %utilizara 'hundredand'
  %i.e. two hundred and eighty eight
  %dicho de otra forma,
  %solamente se utiliza 'and' en las centenas
  %10x,20x,...,90x (que son 9 en cada decena), donde x es un dígito
  %i.e. las decenas tienen unoa9+h*9 caractéres debidos a 'hundredand'
  %pero no se utiliza 'and' en:
  %100,200,...,900, que son 9 en total, 'and' tiene 3 caracteres.
  %Así tenemos que hay en total 100*(unoa9+h*9)-9*3 caracteres
  %debidos a los 'hundred' y 'hundredand' apropiados.
unoa1000=unoa1000+(100*(unoa9+h*9)-9*3);
%se suma one thousand
unoa1000=unoa1000+length('onethousand');
%solución :)
unoa1000