Bu kelimede kaç harf var?


12

Project Euler # 17'den esinlenerek , bu sizin meydan okuma. Bir sayıyı girdi olarak alan tam bir program veya işlev yazın, ardından sayıyı saymak için İngilizce'ye (birinden başlayarak) kadar sayı yazıp döndürün. Boşluk, virgül veya kısa çizgi eklemezsiniz, ancak sözcüğü eklemeniz gerekir and. Örneğin. 342 yazıldığından: Three Hundred and Forty-Two. Bu 23 harf uzunluğunda.

Girişiniz pozitif bir tamsayı olacaktır. Geçersiz girişleri işlemeniz gerekmez. Sayıları İngilizceye dönüştüren yerleşik veya kitaplıklara izin verilmez.

İşte sayıları hecelemek için tüm kurallar. (Not: Bazı kişilerin sayıları hecelemek için farklı kurallar kullandığını anlıyorum. Bu sadece bu zorluğun resmi kuralları olacaktır)

1 ila 20

bir, iki, üç, dört, beş, altı, yedi, sekiz, dokuz, on, onbir, on iki, on üç, on dört, on beş, on altı, on yedi, on sekiz, on dokuz, yirmi

21 ila 99

Bunlara katılın:

Yirmi, otuz, kırk, elli, altmış, yetmiş, seksen, doksan

Bunlara:

-bir, -iki, -üç, -beş, -beş, -six, -seven, -sekiz, -nine,

Dörtte bir u olduğunu unutmayın ama kırk yok!

Örnekler:

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

100 ila 999

Kaç yüz (yüz, iki yüz, üç yüz, vb.), Bir " ve " ve yukarıdaki sayının geri kalanını yazın. Ve mektubunuz puanı doğru sayarmısın.

Örnekler:

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

Kaç bin (bin, iki bin vb.), Virgül, sonra sayının geri kalanını yukarıdaki gibi yazın. Yüzlerce bilginiz yoksa, ve öğelerine ihtiyacınız olduğunu unutmayın .

Örnekler:

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

Milyonlarca

Kaç milyon, sonra sayının geri kalanını yukarıdaki gibi yazın. "Bir milyon" un 6 sıfır "1,000,000" olduğunu unutmayın.

Örnekler:

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

Aynı kural milyarlar, trilyonlar, katrilyonlar ve üstü için de geçerlidir, ancak bu meydan okuma amacıyla 999,999,999 (Dokuz Yüz doksan dokuz milyon, dokuz yüz doksan dokuz bin, dokuz yüz doksan dokuz.)

Python çözücü

Yanıtları doğrulamak için kısa bir python betiği:

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

Bu sayıları İngilizceye dönüştürmek için NodeBox dilbilim kütüphanesini kullanır. (evet, kendi kuralımı kırdım, ama bu rakip bir cevap değil) Bu, burada serbestçe mevcuttur .

Örnek G / Ç

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

1
Neden yüz bir , ama sonra bir milyon, altı bin, yüz ve olmadan ?
Geobits


1
@FryAmTheEggman Python senaryosunu kullanarak, 1100 -> bin ve yüz; 1200 -> bin iki yüz, 1000100 -> bir milyon ve yüz, 1000200 -> bir millian iki yüz. Sanırım A) DJ McGoathem, sorusundaki 1100 ve 1000100 özel durumları ele almalı veya B) test vakalarını düzeltmelidir
TheNumberOne

4
Neden "ve"? Sayılar için uygun isimler asla kullanmaz: 123 = "yüz yirmi üç"
ricdesi

1
@ricdesi katılıyorum. İlgili . İnsanlar saymak "bin bir, bin iki ...", olmadan ve s.
mbomb007

Yanıtlar:


1

Python 2, 266 259 236 229 228 bayt

Bu, bir milyarın altındaki tüm girdiler için geçerlidir. Bu, tüm test senaryoları için geçerlidir.

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

Soruyu belirtilen şekilde uyacak şekilde değiştirmek için (örn. 100 özel ile biten sayılara işlem yapmayın) ilk satırın sonundaki 101 sayısını 100 ile değiştirin.

Açıklama:

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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.