Скільки букв у цьому слові?


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

Від 1000 до 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 (Дев'ятсот дев'яносто дев'ять мільйонів, дев'ятсот дев'яносто дев'ять тисяч, дев'ятсот дев'яносто дев'ять.)

Python solver

Ось короткий скрипт 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 використовує для перетворення чисел на англійську мову. (так, я просто порушив своє власне правило, але це не є конкурентоспроможною відповіддю) Це вільно доступне тут .

Зразок вводу / виводу

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

1
Чому це сто одна , а тоді один мільйон, шість тисяч, сто один без і ?
Геобіт


1
@FryAmTheEggman Використовуючи свій сценарій python, 1100 -> тисяча і сто; 1200 -> одна тисяча двісті, 1000100 -> один мільйон і сто, 1000200 -> один мільярд двісті. Я думаю, що або A) DJ McGoathem повинен вирішити 1100 і 1000100 особливих випадків у своєму питанні, або B) виправити свої тестові справи
TheNumberOne

4
Чому "і"? Власні назви для цифр ніколи не використовують його: 123 = "сто двадцять три"
ricdesi

1
@ricdesi Я згоден. Пов'язані . Люди рахують "тисячу одну, тисячу дві, ...", без і с.
mbomb007

Відповіді:


1

Пітон 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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.