คำนี้มีกี่ตัวอักษร?


12

แรงบันดาลใจจากProject Euler # 17นี่คือความท้าทายของคุณ เขียนโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบที่ใช้ตัวเลขเป็นอินพุตจากนั้นพิมพ์หรือส่งคืนจำนวนตัวอักษรที่ใช้ในการนับและรวมถึงตัวเลขนั้นเป็นภาษาอังกฤษ (เริ่มต้นที่หนึ่ง) คุณไม่ได้มีช่องว่างจุลภาคหรือยัติภังค์ andแต่คุณควรจะรวมถึงคำว่า ตัวอย่างเช่น. 342 Three Hundred and Forty-Twoสะกด: ความยาว 23 ตัวอักษร

ข้อมูลที่คุณป้อนจะเป็นจำนวนเต็มบวก คุณไม่ต้องจัดการอินพุตที่ไม่ถูกต้อง ไม่อนุญาตให้ใช้บิวด์อินหรือไลบรารี่ที่แปลงตัวเลขเป็นภาษาอังกฤษ

นี่คือกฎทั้งหมดสำหรับวิธีสะกดหมายเลข (หมายเหตุ: ฉันรู้ว่าบางคนใช้ชุดของกฎที่แตกต่างกันสำหรับวิธีการสะกดหมายเลขนี่จะเป็นกฎอย่างเป็นทางการสำหรับจุดประสงค์ของการท้าทายนี้)

1 ถึง 20

หนึ่ง, สอง, สาม, สี่, ห้า, หก, เจ็ด, แปด, เก้า, สิบเอ็ด, สิบสอง, สิบสาม, สิบสี่, สิบห้า, สิบห้า, สิบหก, สิบหก, สิบเจ็ด, สิบแปด, สิบเก้า, ยี่สิบ

21 ถึง 99

เข้าร่วมเหล่านี้:

ยี่สิบ, สามสิบ, สี่สิบ, ห้าสิบ, หกสิบ, เจ็ดสิบ, แปดสิบ, เก้าสิบ

ถึงสิ่งเหล่านี้:

-one, -two,-สาม, -four, -five, -six, -seven, -eight, -nine,

โปรดทราบว่าสี่มี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

ล้าน

เขียนว่ามีกี่ล้านแล้วจึงเหลือตัวเลขดังกล่าวข้างต้น โปรดทราบว่า "A ล้าน" คือ 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 สั้น ๆ เพื่อตรวจสอบคำตอบ:

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

1
ที่เกี่ยวข้องและที่เกี่ยวข้องมากขึ้น
Zgarb

1
@FryAmTheEggman ใช้สคริปต์ python ของเขาที่ 1100 -> หนึ่งพันและหนึ่งร้อย; 1200 -> หนึ่งพันสองร้อย, 1,000100 -> หนึ่งล้านและหนึ่งร้อย, 1,000200 -> หนึ่งพันสองร้อย ฉันคิดว่า A) DJ McGoathem ควรจัดการกับกรณีพิเศษ 1100 และ 1,000100 ในคำถามของเขาหรือ B) แก้ไขกรณีทดสอบของเขา
TheNumberOne

4
ทำไมต้อง "และ" ชื่อที่ถูกต้องสำหรับตัวเลขไม่เคยใช้: 123 = "หนึ่งร้อยยี่สิบสาม"
ricdesi

1
@ricdesi ฉันเห็นด้วย ที่เกี่ยวข้อง คนนับ "หนึ่งพันหนึ่งหนึ่งพันสอง ..." โดยไม่ต้องและ s
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.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.