Có bao nhiêu chữ cái trong từ này?


12

Lấy cảm hứng từ Project Euler # 17 , đây là thử thách của bạn. Viết một chương trình hoặc hàm đầy đủ lấy một số làm đầu vào, sau đó in hoặc trả về số lượng chữ cái cần thiết để đếm và bao gồm số đó bằng tiếng Anh (bắt đầu từ một). Bạn không bao gồm dấu cách, dấu phẩy hoặc dấu gạch nối, nhưng bạn nên bao gồm từ and. Ví dụ. 342 được đánh vần : Three Hundred and Forty-Two. Đây là 23 chữ cái dài.

Đầu vào của bạn sẽ là một số nguyên dương. Bạn không phải xử lý các đầu vào không hợp lệ. Không được phép xây dựng hoặc thư viện chuyển đổi số sang tiếng Anh.

Dưới đây là tất cả các quy tắc về cách đánh vần số. (Lưu ý: Tôi nhận thấy rằng một số người sử dụng một bộ quy tắc khác cho cách đánh vần số. Đây sẽ chỉ là quy tắc chính thức cho mục đích của thử thách này)

1 đến 20

một, hai, ba, bốn, năm, sáu, bảy, tám, chín, mười, mười một, mười hai, mười ba, mười bốn, mười lăm, mười sáu, mười bảy, mười tám, mười chín, hai mươi, hai mươi

21 đến 99

Tham gia

Hai mươi, ba mươi, bốn mươi, năm mươi, sáu mươi, bảy mươi, tám mươi, chín mươi

với những điều này:

-one, -two, -three, -four, -five, -six, -seven, -eight, -nine,

Lưu ý rằng bốn có một u nhưng bốn mươi thì không!

Ví dụ:

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

100 đến 999

Viết ra có bao nhiêu trăm (một trăm, hai trăm, ba trăm, v.v.), một " " và phần còn lại của số như trên. Các không tính vào điểm số thư của bạn.

Ví dụ:

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 đến 999.999

Viết có bao nhiêu nghìn (một nghìn, hai nghìn, v.v.), một dấu phẩy, sau đó phần còn lại của số như trên. Lưu ý rằng nếu bạn không có hàng trăm, bạn vẫn cần .

Ví dụ:

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

Hàng triệu

Viết ra bao nhiêu triệu, phần còn lại của số như trên. Lưu ý rằng "Một triệu" là 6 số không "1.000.000".

Ví dụ:

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

Quy tắc tương tự áp dụng cho hàng tỷ, hàng nghìn tỷ, bốn tỷ trở lên, nhưng với mục đích của thử thách này, bạn không phải xử lý bất kỳ số nào trên 999.999.999 (Chín trăm chín mươi chín triệu, chín trăm chín mươi chín nghìn, 999.)

Người giải Python

Đây là một đoạn script python ngắn để xác minh câu trả lờ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

Lưu ý rằng thư viện này sử dụng thư viện ngôn ngữ NodeBox để chuyển đổi số sang tiếng Anh. (vâng, tôi vừa phá vỡ quy tắc của riêng mình, nhưng đây không phải là câu trả lời cạnh tranh) Điều này có sẵn miễn phí ở đây .

Mẫu I / O

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

1
Tại sao lại là Một trăm lẻ một , nhưng rồi Một triệu, sáu nghìn, một trăm một mà không có ?
Geobits


1
@FryAmTheEggman Sử dụng tập lệnh python của mình, 1100 -> một nghìn lẻ một trăm; 1200 -> một nghìn hai trăm, 1000100 -> một triệu và một trăm, 1000200 -> một millian hai trăm. Tôi nghĩ rằng A) DJ McGoathem nên giải quyết 1100 và 1000100 trường hợp đặc biệt trong câu hỏi của anh ấy hoặc B) sửa các trường hợp thử nghiệm của anh ấy
TheNumberOne

4
Tại sao "và"? Tên thích hợp cho các số không bao giờ sử dụng nó: 123 = "một trăm hai mươi ba"
ricdesi

1
@ricdesi Tôi đồng ý. Liên quan . Mọi người đếm "một nghìn một, một nghìn hai, ...", không có s.
mbomb007

Câu trả lời:


1

Python 2, 266 259 236 229 228 byte

Điều này hoạt động cho tất cả các đầu vào dưới một tỷ. Điều này làm việc cho tất cả các trường hợp thử nghiệm.

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

Để sửa đổi nó cho phù hợp với câu hỏi như đã nêu (ví dụ: không xử lý các số kết thúc bằng 100 đặc biệt) chỉ cần thay thế số 101 ở cuối dòng đầu tiên bằng 100.

Giải trình:

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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.