Сколько букв в этом слове?


12

Вдохновленный проектом Euler # 17 , это ваш вызов. Напишите полную программу или функцию, которая принимает число в качестве входных данных, затем напечатайте или верните, сколько букв потребуется, чтобы сосчитать до и включая это число на английском языке (начиная с единицы). Вы не включаете пробелы, запятые или дефисы, но должны включать слово and. Например. 342 пишется: Three Hundred and Forty-Two. Это 23 буквы длиной.

Ваш ввод будет положительным целым числом. Вам не нужно обрабатывать неверные данные. Встроенные модули или библиотеки, которые конвертируют числа в английский, не допускаются.

Вот все правила о том, как пишется число. (Примечание: я понимаю, что некоторые люди используют другой набор правил для написания чисел. Это будут просто официальные правила для этой задачи)

От 1 до 20

один, два, три, четыре, пять, шесть, семь, восемь, девять, десять, одиннадцать, двенадцать, тринадцать, четырнадцать, пятнадцать, шестнадцать, семнадцать, восемнадцать, девятнадцать, двадцать

С 21 по 99

Присоединяйтесь к этим:

Двадцать, тридцать, сорок, пятьдесят, шестьдесят, семьдесят, восемьдесят, девяносто

к этим:

один, два, три, четыре, пять, шесть, семь, восемь, девять,

Обратите внимание, что у четверки есть вы, а у сорока нет!

Примеры:

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

Вот короткий скрипт на 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
Почему сто один , а потом один миллион шесть тысяч сто один без и ?
Geobits


1
@FryAmTheEggman Используя свой скрипт на python, 1100 -> тысяча сто; 1200 -> одна тысяча двести, 1000100 -> один миллион сто, 1000200 -> один миллион двести. Я думаю, что либо A) DJ McGoathem должен рассмотреть 1100 и 1000100 особых случаев в своем вопросе, либо B) исправить свои контрольные примеры
TheNumberOne

4
Почему "а"? Собственные имена для чисел никогда не используют его: 123 = "сто двадцать три"
ricdesi

1
@ricdesi Я согласен. Относящиеся . Люди считают "тысяча одна, тысяча два, ...", без и с.
mbomb007

Ответы:


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.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.