Quante lettere in questa parola?


12

Ispirata al Project Euler # 17 , questa è la tua sfida. Scrivi un programma completo o una funzione che accetta un numero come input, quindi stampa o restituisci quante lettere ci vorrebbe per contare fino a includere quel numero in inglese (iniziando da uno). Non includere spazi, virgole o trattini, ma è necessario includere la parola and. Per esempio. 342 è farro: Three Hundred and Forty-Two. Sono lunghe 23 lettere.

Il tuo input sarà un numero intero positivo. Non è necessario gestire input non validi. Non sono consentiti built-in o librerie che convertono i numeri in inglese.

Ecco tutte le regole su come si scrive il numero. (Nota: mi rendo conto che alcune persone usano un diverso insieme di regole per come si scrive il numero. Queste saranno solo le regole ufficiali ai fini di questa sfida)

Da 1 a 20

uno, due, tre, quattro, cinque, sei, sette, otto, nove, dieci, undici, dodici, tredici, quattordici, quindici, sedici, diciassette, diciotto, diciannove, venti

21 a 99

Unisciti a questi:

Venti, trenta, quaranta, cinquanta, sessanta, settanta, ottanta, novanta

a questi:

-uno, -due, -three, -four, -five, -six, -seven, -eight, -nine,

Nota che quattro ha un u ma quaranta no!

Esempi:

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

Da 100 a 999

Scrivi quante centinaia (cento, duecento, trecento, ecc.), Un " e " e il resto del numero come sopra. Il e conta per il punteggio della tua lettera.

Esempi:

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

Scrivi quante migliaia (mille, duemila, ecc.), Una virgola, quindi il resto del numero come sopra. Nota che se non ne hai centinaia, hai ancora bisogno di e .

Esempi:

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

milioni

Scrivi quanti milioni, poi il resto del numero come sopra. Si noti che "Un milione" è 6 zero "1.000.000".

Esempi:

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 stessa regola si applica a miliardi, trilioni, quadrilioni e oltre, ma ai fini di questa sfida, non è necessario gestire alcun numero superiore a 999.999.999 (Nove novecentonovantanove, Novecentonovantanove mila, novecentonovantanove.)

Risolutore di Python

Ecco un breve script Python per verificare le risposte:

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

Si noti che questo utilizza la libreria linguistica NodeBox per convertire i numeri in inglese. (sì, ho appena infranto la mia regola, ma questa non è una risposta concorrente) È disponibile gratuitamente qui .

I / O di esempio

7: 27
19: 106
72: 583
108: 1000
1337: 31,131
1234567: 63,448,174

1
Perché è Centuno , ma poi Milioni, seimila, centouno senza e ?
Geobits,


1
@FryAmTheEggman Usando il suo script python, 1100 -> mille e cento; 1200 -> milleduecento, 1000100 -> un milione e cento, 1000200 -> un millian duecento. Penso che A) DJ McGoathem dovrebbe affrontare i casi speciali 1100 e 1000100 nella sua domanda, oppure B) correggere i suoi casi di test
TheNumberOne

4
Perché il "e"? I nomi propri dei numeri non lo usano mai: 123 = "centoventitre"
ricdesi,

1
@ricdesi Sono d'accordo. Correlato . Le persone contano "mille, milledue, ...", senza la e s.
mbomb007,

Risposte:


1

Python 2, 266 259 236 229 228 byte

Funziona con tutti gli input inferiori a un miliardo. Questo funziona per tutti i casi di 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)))

Per modificarlo per adattarlo alla domanda come indicato (ad esempio, non trattare i numeri che terminano con 100 speciali) è sufficiente sostituire il numero 101 alla fine della prima riga con 100.

Spiegazione:

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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.