この単語にはいくつの文字がありますか?


12

Project Euler#17に触発され、これがあなたの挑戦です。入力として数値を受け取る完全なプログラムまたは関数を作成し、その数値までカウントするのに必要な文字数(1から始まる)を印刷または返します。スペース、コンマ、ハイフンは含めませんが、単語を含める必要がありますand。例えば。342のスペルは次のとおりThree Hundred and Forty-Twoです。これは23文字の長さです。

入力は正の整数になります。無効な入力を処理する必要はありません。数値を英語に変換する組み込みまたはライブラリは許可されていません。

数字のつづり方に関するすべてのルールを次に示します。(注:一部の人々は、数字のつづり方に異なる規則のセットを使用していることを認識しています。これは、このチャレンジの目的のための公式規則にすぎません)

1から20

1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20

21から99

これらに参加してください:

20、30、40、50、60、70、80、90

これらに:

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

4にはu40あることに注意してくださいしません!

例:

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

数千(1000、2000など)、カンマ、残りの数字を上記のように書きます。あなたは何の数百を持っていない場合、あなたはまだ必要があることを注意して

例:

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

同じルールが何十億、1兆、4千万以上にも当てはまりますが、このチャレンジの目的のために、999,999,999(9億9,900万、9億、9万9千、 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言語ライブラリを使用して数値を英語に変換することに注意してください。(はい、私は自分のルールを破っただけですが、これは競合する答えではありません)これはここで自由に利用できます

サンプルI / O

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

1
なぜそれは百と百、しかしその後百万、六千、百と百なし
ジオビット

1
関連およびより関連
-Zgarb

1
@FryAmTheEggman pythonスクリプトを使用して、1100-> 1000と100。1200->千二百、1000100->百万および百、1000200->百万二百。A)DJ McGoathemは彼の質問の1100と1000100の特別なケースに対処するか、B)彼のテストケースを修正する必要があります
-TheNumberOne

4
なぜ「and」ですか?数字の適切な名前は決して使用しません:123 = "百二十三"
-ricdesi

1
@ricdesi同意します。関連。人々はなしで、「...、千1、千2」をカウントし、 S。
mbomb007

回答:


1

Python 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.