¿Cuántas letras hay en esta palabra?

12

Inspirado por el Proyecto Euler # 17 , este es tu desafío. Escriba un programa o función completa que tome un número como entrada, luego imprima o devuelva cuántas letras se necesitarían para contar e incluir ese número en inglés (comenzando en uno). No incluye espacios, comas o guiones, pero debe incluir la palabra and. Por ejemplo. 342 se escribe: Three Hundred and Forty-Two. Esto tiene 23 letras de largo.

Su entrada será un número entero positivo. No tiene que manejar entradas inválidas. No se permiten las incorporadas o las bibliotecas que convierten números al inglés.

Aquí están todas las reglas sobre cómo deletrear números. (Nota: me doy cuenta de que algunas personas usan un conjunto diferente de reglas sobre cómo deletrear números. Estas serán solo las reglas oficiales para el propósito de este desafío)

1 a 20

uno, dos, tres, cuatro, cinco, seis, siete, ocho, nueve, diez, once, doce, trece, catorce, quince, dieciseis, diecisiete, dieciocho, diecinueve, veinte

21 a 99

Únete a estos:

Veinte, treinta, cuarenta, cincuenta, sesenta, setenta, ochenta, noventa

a estos:

-uno, -dos, -tres, -cuatro, -cinco, -seis, -seven, -ocho,-nueve,

Tenga en cuenta que cuatro tiene un u pero cuarenta no!

Ejemplos:

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

100 a 999

Escribe cuántos cientos (cien, doscientos, trescientos, etc.), una " y ", y el resto del número como arriba. El y cuenta para su puntaje de letras.

Ejemplos:

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 a 999,999

Escribe cuántos miles (mil, dos mil, etc.), una coma, luego el resto del número como se indica arriba. Tenga en cuenta que si no tiene cientos, aún necesita el y .

Ejemplos:

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

Millones

Escribe cuántos millones, luego el resto del número como arriba. Tenga en cuenta que "Un millón" es 6 ceros "1,000,000".

Ejemplos:

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 misma regla se aplica a miles de millones, billones, cuatrillones y más, pero para el propósito de este desafío, no tiene que manejar ningún número por encima de 999,999,999 (Novecientos noventa y nueve millones, novecientos noventa y nueve mil, novecientos noventa y nueve.)

Solucionador de Python

Aquí hay un breve script de Python para verificar las respuestas:

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

Tenga en cuenta que esto utiliza la biblioteca de lingüística NodeBox para convertir números al inglés. (sí, acabo de romper mi propia regla, pero esta no es una respuesta competitiva) Esto está disponible gratuitamente aquí .

Muestra de E / S

7: 27
19: 106
72: 583
108: 1000
1337: 31,131
1234567: 63,448,174
James
fuente
1
¿Por qué es Ciento uno , pero luego Un millón, seis mil ciento uno sin el y ?
Geobits
1
@FryAmTheEggman Usando su script de Python, 1100 -> mil ciento cien; 1200 -> mil doscientos, 1000100 -> un millón y cien, 1000200 -> un millian doscientos. Creo que A) DJ McGoathem debería abordar los casos especiales 1100 y 1000100 en su pregunta, o B) corregir sus casos de prueba
TheNumberOne
44
¿Por qué el "y"? Los nombres apropiados para los números nunca lo usan: 123 = "ciento veintitrés"
ricdesi
1
@ricdesi estoy de acuerdo. Relacionados . La gente cuenta "mil uno, mil dos, ...", sin la y s.
mbomb007

Respuestas:

1

Python 2, 266 259 236 229 228 bytes

Esto funciona para todas las entradas por debajo de mil millones. Esto funciona para todos los casos de prueba.

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)))

Para modificarlo para que se ajuste a la pregunta como se indica (por ejemplo, no trate los números que terminan con 100 especiales) simplemente reemplace el número 101 al final de la primera línea con 100.

Explicación:

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.
El numero uno
fuente