Berapa banyak huruf dalam kata ini?


12

Terinspirasi oleh Project Euler # 17 , ini adalah tantangan Anda. Tulis program atau fungsi lengkap yang menggunakan angka sebagai input, lalu cetak atau kembalikan jumlah huruf yang diperlukan untuk menghitung dan memasukkan angka itu dalam bahasa Inggris (mulai dari satu). Anda tidak memasukkan spasi, koma, atau tanda hubung, tetapi Anda harus memasukkan kata and. Sebagai contoh. 342 dieja: Three Hundred and Forty-Two. Ini panjangnya 23 huruf.

Masukan Anda akan berupa bilangan bulat positif. Anda tidak harus menangani input yang tidak valid. Built-in atau perpustakaan yang mengonversi angka ke bahasa Inggris tidak diperbolehkan.

Berikut ini semua aturan cara mengeja angka. (Catatan: Saya menyadari bahwa beberapa orang menggunakan seperangkat aturan berbeda untuk cara mengeja angka. Ini hanya akan menjadi aturan resmi untuk tujuan tantangan ini)

1 hingga 20

satu, dua, tiga, empat, lima, enam, tujuh, delapan, sembilan, sepuluh, sebelas, dua belas, tiga belas, empat belas, lima belas, enam belas, tujuh belas, delapan belas, sembilan belas, dua puluh

21 hingga 99

Bergabunglah dengan ini:

Dua puluh, tiga puluh, empat puluh, lima puluh, enam puluh, tujuh puluh, delapan puluh, sembilan puluh

kepada ini:

-satu, -dua, -tiga, -Empat, -five, -six, -seven, -delapan, -nine,

Perhatikan bahwa empat memiliki u tetapi empat puluh tidak!

Contoh:

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

100 hingga 999

Tulis berapa ratus (seratus, dua ratus, tiga ratus, dll.), Sebuah " dan ", dan sisanya dari angka seperti di atas. The dan melakukan penghitungan terhadap skor surat Anda.

Contoh:

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

Tulis berapa ribu (seribu, dua ribu, dll.), Koma, lalu sisa angka seperti di atas. Perhatikan bahwa jika Anda tidak memiliki ratusan, Anda masih memerlukan dan .

Contoh:

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

Jutaan

Tuliskan berapa jutaan, lalu sisa angkanya seperti di atas. Perhatikan bahwa "Satu juta" adalah 6 nol "1.000.000".

Contoh:

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

Aturan yang sama berlaku untuk miliaran, triliunan, kuadrili dan di atas, tetapi untuk tujuan tantangan ini, Anda tidak harus menangani angka di atas 999.999.999 (Sembilan Seratus sembilan puluh sembilan juta, sembilan ratus sembilan puluh sembilan ribu, sembilan ratus sembilan puluh sembilan.)

Pemecah python

Berikut ini adalah skrip python pendek untuk memverifikasi jawaban:

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

Perhatikan bahwa ini menggunakan perpustakaan lodeistik NodeBox untuk mengkonversi angka ke bahasa Inggris. (ya, saya baru saja melanggar aturan saya sendiri, tetapi ini bukan jawaban yang bersaing) Ini tersedia secara bebas di sini .

Contoh I / O

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

1
Mengapa seratus satu , tetapi kemudian satu juta, enam ribu, seratus satu tanpa dan ?
Geobits


1
@FryAmTheEggman Menggunakan skrip python-nya, 1100 -> seribu seratus; 1200 -> seribu dua ratus, 1000100 -> satu juta dan seratus, 1000200 -> satu ribu dua ratus. Saya pikir baik A) DJ McGoathem harus mengatasi 1100 dan 1000100 kasus khusus dalam pertanyaannya, atau B) memperbaiki kasus pengujiannya
TheNumberOne

4
Mengapa "dan"? Nama yang tepat untuk angka tidak pernah menggunakannya: 123 = "seratus dua puluh tiga"
ricdesi

1
@ricdesi saya setuju. Terkait . Orang menghitung "seribu satu, seribu dua, ...", tanpa dan s.
mbomb007

Jawaban:


1

Python 2, 266 259 236 229 228 byte

Ini bekerja untuk semua input di bawah satu miliar. Ini berfungsi untuk semua kasus uji.

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

Untuk memodifikasinya agar sesuai dengan pertanyaan sebagaimana dinyatakan (mis. Jangan perlakukan angka yang diakhiri dengan 100 spesial) cukup ganti angka 101 di akhir baris pertama dengan 100.

Penjelasan:

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.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.