这个单词有多少个字母?


12

项目Euler#17的启发,这是您的挑战。编写一个完整的程序或函数,以数字作为输入,然后打印或返回用英语计算该数字(包括该数字在内)需要多少个字母(从一个开始)。您不能包含空格,逗号或连字符,但应包含单词and。例如。342拼写为:Three Hundred and Forty-Two。这是23个字母长的字母。

您的输入将是一个正整数。您不必处理无效的输入。不允许将数字转换为英语的内置程序或库。

这是有关如何拼写数字的所有规则。(注意:我意识到有些人对数字的拼写使用了不同的规则。这只是本次挑战的官方规则)

1至20

一,二,三,四,五,六,七,八,九,十,十一,十二,十三,十四,十五,十六,十七,十八,十九,二十

21至99

加入这些:

二十,三十,四十,五十,六十,七十,八十,九十

这些:

-一,-二,-三,-四,-五,-六,-七,-八,-九,

请注意,四个有一个u,四十个没有!

例子:

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

100至999

写出几百个(一百个,两百个,三百个,等等),一个“ ”,以及上面其余的数字。该不计入您的来信得分。

例子:

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

写下几千(一千,两千,等等),一个逗号,然后按上述其余数字。请注意,如果您没有数百个,则仍然需要

例子:

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

百万

写出几百万,然后其余的如上。请注意,“百万”是6个零“ 1,000,000”。

例子:

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

相同的规则适用于数十亿,万亿,四十亿分之一及以上的数字,但出于这一挑战的目的,您不必处理任何超过999,999,999(99,900,900,99,99,000)的数字,九十九。)

Python求解器

这是一个简短的python脚本,用于验证答案:

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

请注意,这使用NodeBox语言学库将数字转换为英语。(是的,我只是违反了自己的规则,但这不是一个有竞争力的答案)。可在此处免费获得。

样品I / O

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

1
为什么一百零一,但随后一亿六千,101
Geobits,2016年


1
@FryAmTheEggman使用他的python脚本1100-> 110。1200-> 1200,1000100->一百,1000200->一千两百。我认为A)DJ McGoathem应该在他的问题中解决1100和1000100的特殊情况,或者B)更正他的测试用例
TheNumberOne,2016年

4
为什么是“与”?数字的专有名称永远不会使用它:123 =“ 123”
ricdesi

1
@ricdesi我同意。相关的。人们数“ 111,102,...”,不带
mbomb007 '16

Answers:


1

Python 2中,266个 259 236 229 228字节

这适用于所有十亿以下的投入。这适用于所有测试用例。

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

要修改它以适应所述问题(例如,不要以100特殊结尾的数字),只需将第一行末尾的数字101替换为100。

说明:

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.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.