Wie viele Buchstaben enthält dieses Wort?

12

Inspiriert von Project Euler # 17 ist dies Ihre Herausforderung. Schreiben Sie ein vollständiges Programm oder eine Funktion, die eine Zahl als Eingabe verwendet, und geben Sie dann aus oder geben Sie zurück, wie viele Buchstaben erforderlich wären, um bis zu dieser Zahl auf Englisch zu zählen (beginnend mit einer). Sie geben keine Leerzeichen, Kommas oder Bindestriche an, aber Sie sollten das Wort eingeben and. Beispielsweise. 342 ist geschrieben: Three Hundred and Forty-Two. Dies ist 23 Buchstaben lang.

Ihre Eingabe wird eine positive ganze Zahl sein. Sie müssen keine ungültigen Eingaben verarbeiten. Integrierte oder Bibliotheken, die Zahlen in Englisch konvertieren, sind nicht zulässig.

Hier finden Sie alle Regeln für die Rechtschreibung von Zahlen. (Hinweis: Mir ist klar, dass einige Leute andere Regeln für die Rechtschreibung von Zahlen anwenden. Dies sind nur die offiziellen Regeln für diese Herausforderung.)

1 bis 20

eins, zwei, drei, vier, fünf, sechs, sieben, acht, neun, zehn, elf, zwölf, dreizehn, vierzehn, fünfzehn, sechzehn, siebzehn, achtzehn, neunzehn, zwanzig

21 bis 99

Mach mit bei:

Zwanzig, dreißig, vierzig, fünfzig, sechzig, siebzig, achtzig, neunzig

zu diesen:

-ein, -zwei, -drei, -vier, -fünf, -sechs, -sieben, -acht, -neun,

Beachten Sie, dass vier ein u hat, aber vierzig nicht!

Beispiele:

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

100 bis 999

Schreiben Sie wie oben beschrieben, wie viele Hunderte (einhundert, zweihundert, dreihundert usw.), ein " und " und den Rest der Zahl auf. Das und zählt für Ihre Briefpunktzahl.

Beispiele:

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 bis 999.999

Schreiben Sie wieviele Tausender (eintausend, zweitausend usw.), ein Komma und dann den Rest der Zahl wie oben. Beachten Sie, dass Sie, wenn Sie keine Hunderte haben, immer noch das und benötigen .

Beispiele:

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

Millionen

Schreiben Sie, wie viele Millionen, dann den Rest der Zahl wie oben. Beachten Sie, dass "A million" 6 Nullen "1,000,000" ist.

Beispiele:

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

Dieselbe Regel gilt für Milliarden, Billionen, Billionen und mehr, aber für diese Herausforderung müssen Sie keine Zahlen über 999.999.999 (neunhundertneunundneunzig Millionen, neunhundertneunundneunzigtausend, neun hundert neun und neunzig.)

Python-Löser

Hier ist ein kurzes Python-Skript, um die Antworten zu überprüfen:

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

Beachten Sie, dass dies die NodeBox-Sprachbibliothek verwendet, um Zahlen in Englisch zu konvertieren. (ja, ich brach nur meine eigene Regel, aber dies ist keine konkurrierende Antwort) Diese frei verfügbar ist hier .

Beispiel-E / A

7: 27
19: 106
72: 583
108: 1000
1337: 31,131
1234567: 63,448,174
James
quelle
1
Warum ist es einhundertein , aber dann eine Million, sechstausend, einhundertein ohne das und ?
Geobits
1
Verwandte und verwandte .
Zgarb
1
@FryAmTheEggman Mit seinem Python-Skript 1100 -> eintausendeinhundert; 1200 -> eintausendzweihundert, 1000100 -> eine Million und einhundert, 1000200 -> ein Millian zweihundert. Ich denke, entweder A) DJ McGoathem sollte die Sonderfälle 1100 und 1000100 in seiner Frage ansprechen, oder B) seine Testfälle korrigieren
TheNumberOne
4
Warum das "und"? Ordnungsgemäße Namen für Zahlen verwenden sie niemals: 123 = "einhundertdreiundzwanzig"
ricdesi
1
@ricdesi Ich stimme zu. Verwandte . Die Leute zählen "eintausendeins, eintausendzwei, ...", ohne das und s.
mbomb007

Antworten:

1

Python 2, 266 259 236 229 228 Bytes

Dies funktioniert für alle Eingaben unter einer Milliarde. Dies funktioniert für alle Testfälle.

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

Um es an die angegebene Frage anzupassen (z. B. Zahlen, die mit 100 enden, nicht behandeln), ersetzen Sie einfach die Nummer 101 am Ende der ersten Zeile durch 100.

Erläuterung:

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.
Die Nummer eins
quelle