Combien de lettres dans ce mot?

12

Inspiré par le projet Euler # 17 , c'est votre défi. Écrivez un programme ou une fonction complète qui prend un nombre en entrée, puis imprimez ou renvoyez le nombre de lettres qu'il faudrait pour compter jusqu'à ce nombre en anglais (en commençant par un). Vous n'incluez pas d'espaces, de virgules ou de tirets, mais vous devez inclure le mot and. Par exemple. 342 est orthographié: Three Hundred and Forty-Two. Cela fait 23 lettres.

Votre entrée sera un entier positif. Vous n'avez pas à gérer les entrées non valides. Les bibliothèques intégrées ou convertissant des nombres en anglais ne sont pas autorisées.

Voici toutes les règles pour épeler les nombres. (Remarque: je me rends compte que certaines personnes utilisent un ensemble de règles différent pour orthographier les nombres. Ce ne seront que les règles officielles aux fins de ce défi)

1 à 20

un, deux, trois, quatre, cinq, six, sept, huit, neuf, dix, onze, douze, treize, quatorze, quinze, seize, dix-sept, dix-huit, dix-neuf, vingt

21 à 99

Rejoignez-les:

Vingt, trente, quarante, cinquante, soixante, soixante-dix, quatre-vingt, quatre-vingt-dix

à ceux-là:

-un, -two, -three, -four, -five, -six, -seven, -eight, -nine,

Notez que quatre a un u mais pas quarante !

Exemples:

53: Fifty-three
60: sixty
72: seventy-two
99: ninety-nine

100 à 999

Écrivez combien de centaines (cent, deux cents, trois cents, etc.), un « et » et le reste du nombre comme ci-dessus. Le et compte pour votre score de lettre.

Exemples:

101: One hundred and one
116: One hundred and sixteen
144: One hundred and forty-four
212: Two hundred and twelve
621: Six Hundred and twenty-one

1 000 à 999 999

Écrivez combien de milliers (mille, deux mille, etc.), une virgule, puis le reste du nombre comme ci-dessus. Notez que si vous n'avez pas de centaines, vous avez toujours besoin des touches et .

Exemples:

1,101: One thousand, one hundred and one
15,016: Fifteen thousand and sixteen
362,928: Three hundred and sixty-two thousand, nine hundred and twenty-eight

Des millions

Écrivez combien de millions, puis le reste du nombre comme ci-dessus. Notez que "Un million" équivaut à 6 zéros "1 000 000".

Exemples:

191,232,891: One hundred and ninety-one million, two hundred and thirty-two thousand, eight hundred and ninety-one
1,006,101: One million, six thousand, one hundred and one

La même règle s'applique aux milliards, trillions, quadrillions et plus, mais pour ce défi, vous n'avez pas à gérer un nombre supérieur à 999 999 999 (neuf cent quatre-vingt-dix-neuf millions, neuf cent quatre-vingt-dix-neuf mille, neuf cent quatre-vingt-dix-neuf.)

Solveur Python

Voici un court script python pour vérifier les réponses:

import en 

def get_letter_num(s):
    count = 0
    for c in s:
        if c.isalpha():
            count += 1
    return count

number = input()
count = 0
for i in xrange(1, number + 1):
    count += get_letter_num(en.number.spoken(i))

print count

Notez que cela utilise la bibliothèque linguistique NodeBox pour convertir les nombres en anglais. (oui, je viens d'enfreindre ma propre règle, mais ce n'est pas une réponse concurrente) Ceci est disponible gratuitement ici .

Exemple d'E / S

7: 27
19: 106
72: 583
108: 1000
1337: 31,131
1234567: 63,448,174
James
la source
1
Pourquoi est-il cent un , mais alors un million, six mille, cent un sans le et ?
Geobits
1
Liés et plus liés .
Zgarb
1
@FryAmTheEggman En utilisant son script python, 1100 -> mille cent; 1200 -> mille deux cents, 1000100 -> un million et cent, 1000200 -> un millian deux cents. Je pense que A) DJ McGoathem devrait aborder les cas spéciaux 1100 et 1000100 dans sa question, ou B) corriger ses cas de test
TheNumberOne
4
Pourquoi le "et"? Les noms propres pour les nombres ne l'utilisent jamais: 123 = "cent vingt-trois"
ricdesi
1
@ricdesi Je suis d'accord. Connexes . Les gens comptent "mille un, mille deux, ...", sans le et l' art.
mbomb007

Réponses:

1

Python 2, 266 259 236 229 228 octets

Cela fonctionne pour tous les intrants inférieurs à un milliard. Cela fonctionne pour tous les cas de test.

def l(n):b=[6,3,2][(n<1000)+(n<10**6)];c=10**b;return int("0335443554"[n%10])+int("0366555766"[n/10])+(n-10in[4,6,7,9])if n<100else l(n/c)+(l(n%c)or-3*(b<3))+7+(b<6)+2*(b<3)+3*(b>2)*(0<n%c<101)
print sum(map(l,range(input()+1)))

Pour le modifier afin qu'il corresponde à la question comme indiqué (par exemple, ne traitez pas les nombres se terminant par 100 spéciaux), remplacez simplement le nombre 101 à la fin de la première ligne par 100.

Explication:

def l(n):
    b=[6, 3, 2][(n < 1000) + (n < 10**6)] # b = 2 if n < 1000 else 3 if n < 1000000 else 6
    c=10**b
    return (                            # Parenthesis added for readability.
            int("0335443554"[n % 10]) + # Compute length of last digit. one -> 3, seven -> 5, etc.
            int("0366555766"[n / 10]) + # Compute length of second to last digit. ten -> 3, eighty -> 6, etc.
            (n - 10 in[4, 6, 7, 9])     # Add one to length if the number is 14, 16, 17, or 19.

            if n < 100 else             # Use above procedure if the number is under 100.
                                        # If otherwise, use below procedure.

            l(n / c) +                  # Compute length of the top portion of number.
                (l(n % c) or            # Compute length of bottom portion of number.
                -3 * (b < 3)) +         # If the number < 1000 and is a multiple of 100,
                                        # subtract 3 from the length because of missing and.
            7 +                         # Add 7 to the length for "million"
            (b < 6) +                   # Add 8 to the length for "thousand"
            2 * (b < 3) +               # Add 10 to the length for "hundred and"
                3 *                     # Add 3 to the length for another "and"
                (b > 2) *               # if the number >= 1000
                (0 < n % c < 101)       # and the bottom portion > 0 and <= 100
    )
print sum(map(l,range(input()+1)))      # For the reader to figure out.
Le numéro un
la source