이 단어에는 몇 글자가 있습니까?


12

프로젝트 오일러 # 17 에서 영감을 얻은 것은 이것이 당신의 도전입니다. 숫자를 입력으로 사용하는 전체 프로그램 또는 함수를 작성한 다음 영어로 숫자를 포함하여 계산하는 데 필요한 문자 수를 인쇄하거나 반환하십시오 (1부터 시작). 공백, 쉼표 또는 하이픈은 포함하지 않지만 단어는 포함해야합니다 and. 예를 들어. 342 철자 : Three Hundred and Forty-Two. 23 자 길이입니다.

입력은 양의 정수입니다. 유효하지 않은 입력을 처리 할 필요는 없습니다. 숫자를 영어로 변환하는 내장 또는 라이브러리는 허용되지 않습니다.

다음은 숫자 철자법에 대한 모든 규칙입니다. (참고 : 일부 사람들은 숫자를 철자하는 방법에 대해 다른 규칙을 사용한다는 것을 알고 있습니다. 이것은이 도전의 목적을위한 공식 규칙 일뿐입니다)

1에서 20

하나, 둘, 셋, 넷, 다섯, 여섯, 일곱, 여덟, 아홉, 열, 열한, 열두, 열 세, 열 네, 열 다섯, 열 여섯, 열 일곱, 열 여덟, 열 여덟, 열 여덟, 열 여덟

21에서 99

다음에 가입하십시오 :

스물, 삼십, 사십, 오십, 육십, 일흔, 여든, 구십

이들에게 :

-1, -2, -3, -4, -5, -6, -7, -8, -9,

참고 것을 유를 하지만 마흔이 되지 않습니다!

예 :

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

100에서 999

위와 같이 몇 백 (1 백, 2 백, 3 백 등), " "및 나머지 수를 쓰십시오 . 당신의 편지 점수에 반영 않습니다.

예 :

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 천, 2 천 등), 쉼표, 나머지 수를 적습니다. 수백이 없다면 여전히 and 가 필요합니다 .

예 :

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 개의 0 "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를 초과하여 처리 할 필요는 없습니다 (9 백 9 천만, 9 억 9 천만, 구 백구 구).

파이썬 솔버

다음은 답변을 확인하는 간단한 파이썬 스크립트입니다.

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
왜이다 백 하나 ,하지만 한 만 육천, 백일 포함하지 않는 및이 ?
Geobits


1
@FryAmTheEggman 그의 파이썬 스크립트를 사용하여, 1100-> 천 및 백; 1200-> 천 이백, 1000100-> 백만 및 백, 1000200-> 일 백만 이백. 나는 A) DJ McGoathem이 그의 질문에서 1100과 1000100의 특별한 경우를
다루

4
왜 "그리고"? 숫자에 대한 적절한 이름을 사용하지 않을 : 123 = "백스물세"
ricdesi

1
@ricdesi 동의합니다. 관련 . 사람들은 " s "가없는 "1,000, 1, 2, ..."를 센다 .
mbomb007

답변:


1

파이썬 2, 266 259 236 229 228 바이트

이것은 10 억 미만의 모든 입력에 적용됩니다. 이것은 모든 테스트 사례에 적용됩니다.

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.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.