วิธีการนับพยางค์เป็นคำ ๆ


22

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

เอาท์พุท:คุณจะคืนค่าจำนวนเต็มตั้งแต่ 1 ถึง 7 เพื่อแสดงจำนวนพยางค์ที่คุณคิดว่าเป็น

การให้คะแนน:โปรแกรมของคุณจะทำงานกับคำทั้งหมดที่พบในที่เก็บนี้ ถ้าคุณได้รับNคำที่ถูกต้องและโปรแกรมของคุณไบต์ขนาดใหญ่แล้วคะแนนของคุณคือM N-(M*10)ชนะคะแนนมากที่สุด

เพื่อสร้างการนับพยางค์ของฉันฉันใช้สิ่งนี้เป็นรายการคำศัพท์ของฉันและนี่เพื่อนับพยางค์


คำ 3 พยางค์ประกอบด้วย "inn" และ "ruby" คำ 2 พยางค์ประกอบด้วย: "irs", "ore", "roy", "yer" นอกเหนือจากนั้นรายการดูเหมือนแม่นยำพอ
justhalf

@ justhalf ขอบคุณสำหรับการจับเหล่านั้น การสร้างรายการเป็นส่วนที่ยากที่สุดของความท้าทาย
นาธานเมอร์ริลล์


3
ความท้าทายนี้ทำให้ฉันรู้ว่าภาษาอังกฤษโง่แค่ไหน ใช้resumeตัวอย่างเช่น ...
SP3000

คำตอบ:


12

Ruby, 8618 ถูกต้อง (91.1%), 53 ไบต์, 8618 - 10 * 53 = 8088 คะแนน

->s{s.scan(/[aiouy]+e*|e(?!d$|ly).|[td]ed|le$/).size}

นี่คือฟังก์ชัน Ruby แบบไม่ระบุชื่อซึ่งใช้ regexes เพื่อนับพยางค์

ฟังก์ชั่นเพิ่มพยางค์สำหรับทุกตัวอย่างของ:

  • การทำงานของ non- evowels ตามด้วยศูนย์มากกว่าes
  • eซึ่งเป็นไม่ได้เป็นส่วนหนึ่งของต่อท้ายedหรือelyมีข้อยกเว้นของต่อท้ายtedหรือdeds
  • ต่อท้าย le

การวิเคราะห์

แนวคิดพื้นฐานคือการนับจำนวนเสียงสระ แต่ด้วยตัวของมันเองนั้นไม่แม่นยำมาก ( [aeiouy]+ได้รับ 74% ที่ถูกต้อง) เหตุผลหลักสำหรับเรื่องนี้คือเนื่องจากความเงียบeซึ่งปรับเปลี่ยนเสียงสระก่อนหน้าในขณะที่ไม่ได้ออกเสียงเอง ตัวอย่างเช่นคำว่าslateมีสองเสียงสระ แต่พยางค์เดียวเท่านั้น

เพื่อจัดการกับสิ่งนี้เรานำeส่วนแรกของ regex มาใช้และจัดการแยกต่างหาก การตรวจจับความเงียบeนั้นยาก แต่ฉันพบสองกรณีที่เกิดขึ้นบ่อยครั้ง:

  • เป็นส่วนหนึ่งของการติดตามed(เว้นแต่ว่าจะเป็นtedหรือdedชอบsettledหรือsaddled)
  • เป็นส่วนหนึ่งของการติดตามevy(เช่นlovely)

e.กรณีเหล่านี้ได้รับการยกเว้นเฉพาะในสิ่งที่จะเป็นอย่างอื่น

เหตุผล.ในการที่e(?!d$|ly).จะกินถ่านต่อไปหากมีเสียงสระคู่ (เช่นeaหรือee) และเพื่อที่eจะไม่นับตอนท้ายของคำ อย่างไรก็ตามต่อท้ายle เป็นมักจะออกเสียงเพื่อให้มีการเพิ่มใน

ในที่สุดเสียงสระจะถูกนับเป็นหนึ่งพยางค์ แม้ว่านี่อาจไม่ใช่กรณี (เช่นcurious) แต่ก็มักจะยากที่จะทราบว่ามีหลายพยางค์หรือไม่ ใช้iaของcelestialและspatialเป็นตัวอย่าง

โปรแกรมทดสอบ

ฉันไม่รู้ทับทิมจริงๆดังนั้นฉันจึงไม่แน่ใจว่าจะสามารถตีกอล์ฟได้ดีเพียงใด ฉันจัดการเพื่อขูดโปรแกรมทดสอบร่วมกันโดยปรึกษา SO มากมายแม้ว่า:

cases = 0
correct = 0

s = "->s{s.scan(/[aiouy]+e*|e(?!d$|ly).|[td]ed|le$/).size}"

f = eval s

for i in 1 ... 8
    filepath = i.to_s + "-syllable-words.txt"
    file = File.open(filepath)

    while (line = file.gets)
        word = line.strip
        cases += 1
        if f.call(word) == i
            correct += 1
        end
    end
end

p "Correct: #{correct}/#{cases}, Length: #{s.length}, Score: #{correct - s.length*10}"

อ๊ะคุณสร้างมาตรฐานให้สูงมาก ในไพ ธ อนความยาวโค้ดนั้นมีความยาว 20 ตัวอักษรอย่างแน่นอนดังนั้นการติดตั้ง "สระของคุณตามด้วยตัวอักษรที่ไม่ใช่e" ให้ 6638 (แก้ไข 7158)
justhalf

2
@ justhalf เป็นเพียงเหตุผลเดียวที่ฉันใช้ Ruby: PI โดยปกติใช้ Python สำหรับทุกอย่าง
Sp3000

5

Python3, 7935 - 10 * 71 = 7225

คำตอบที่รวดเร็วและสกปรกของฉัน: นับจำนวนเสียงสระที่ต่อเนื่องกัน แต่ลบเสียงสุดท้ายก่อน

lambda w:len(''.join(" x"[c in"aeiouy"]for c in w.rstrip('e')).split())

หลังจากถอด e แล้วสิ่งนี้จะแทนที่เสียงสระด้วยxและอักขระอื่น ๆ ทั้งหมดด้วยช่องว่าง ผลลัพธ์จะถูกนำกลับมารวมกันเป็นสตริงแล้วแบ่งบนช่องว่าง สะดวกช่องว่างที่จุดเริ่มต้นและจุดสิ้นสุดจะถูกละเว้น (เช่น" x xx ".split()ให้["x","xx"]) ความยาวของรายการผลลัพธ์จึงเป็นจำนวนของกลุ่มเสียงสระ

คำตอบเดิม 83- ไบต์ด้านล่างมีความแม่นยำมากขึ้นเพราะมันจะลบเพียงอีเดียวในตอนท้าย ใหม่กว่าจึงมีปัญหาสำหรับคำเช่นbee; แต่รหัสที่สั้นกว่าจะมีผลมากกว่านั้น

lambda w:len(''.join(" x"[c in"aeiouy"]for c in(w[:-1]if'e'==w[-1]else w)).split())

โปรแกรมทดสอบ:

syll = lambda w:len(''.join(c if c in"aeiouy"else' 'for c in w.rstrip('e')).split())

overallCorrect = overallTotal = 0
for i in range(1, 7):
    with open("%s-syllable-words.txt" % i) as f:
        words = f.read().split()
    correct = sum(syll(word) == i for word in words)
    total = len(words)
    print("%s: %s correct out of %s (%.2f%%)" % (i, correct, total, 100*correct/total))
    overallCorrect += correct
    overallTotal += total

print()
print("%s correct out of %s (%.2f%%)" % (overallCorrect, overallTotal, 100*overallCorrect/overallTotal))

เห็นได้ชัดว่านี่สกปรกเกินไปและไม่เร็วพอที่จะเอาชนะคำตอบ Ruby ของ Sp3000 ; ^)


->s{s.scan(/([aiouy]|e(?!$))+/).size}คะแนน 7583. 84% ค่อนข้างน่าประทับใจสำหรับบางสิ่งที่เรียบง่าย
Sp3000

1

Perl, 8145 - 3 * 30 = 7845

ใช้รายการจากก่อนที่จะกระทำล่าสุด

#!perl -lp
$_=s/(?!e[ds]?$)[aeiouy]+//g

ไฟล์ได้รับการอัพเดทเร็ว ๆ นี้ ฉันลองดูและไม่เห็นคำที่คุณตั้งชื่อในไฟล์ 1 พยางค์
Sp3000

@ Sp3000 กำจัดแล้ว พวกเขามีการอัปเดตเมื่อ 7 ชั่วโมงที่แล้วตามสิ่งที่ฉันเห็นและยังมีคำเหล่านั้นอยู่ใต้ลิงก์: github.com/nathanmerrill/wordsbysyllables/blob/master/
......

ดูเหมือน @NathanMerrill messed up ปรับปรุง 7 ชั่วโมงที่ผ่านมา: ประวัติศาสตร์
Sp3000

@ Sp3000 ขอบคุณ ฉันอัปเดตคะแนนเป็นรุ่นเก่ากว่า รายการเหล่านั้นยังคงมีข้อผิดพลาดค่อนข้างน้อย แต่ไม่รุนแรงเท่า
nutki

0

Python, 5370-10 * 19 = 5180

โปรแกรมนี้เพียงสมมติว่าคำที่ยาวขึ้นหมายถึงพยางค์ที่มากขึ้น

lambda x:len(x)/6+1

โปรแกรมทดสอบที่ฉันใช้คือ:

correct = 0
y = lambda x:len(x)/6+1
for i in xrange(1,8):
    f = file(str(i)+"-syllable-words.txt")
    lines = f.read().split("\n")
    f.close()
    correct += len([1 for line in lines if y(line)==i])
print correct

เราควรสร้างโปรแกรมหรือฟังก์ชั่นหรือไม่? ของคุณไม่ได้เป็นโปรแกรมมันไม่มีผลอะไรเมื่อทำงาน
justhalf

@ justhalf ฉันต้องการบางสิ่งบางอย่างที่รับอินพุตและสร้างเอาต์พุต (แม้ว่าเอาต์พุตนั้นไม่ใช่ STDIO)
Nathan Merrill

Btw ฉันไม่ได้รับ 5150 สำหรับการใช้ 7 แต่ 4391 ในการทดสอบของฉันดีกว่าที่จะใช้len(x)/6แทน (5377-190 = 5187)
justhalf

@justhalf ด้วยการปรับปรุงฉันได้รับ 5343 แต่แน่นอนได้รับคะแนนแย่ลงด้วย len (x) / 6 ฉันจะโพสต์โปรแกรมทดสอบของฉัน
นาธานเมอร์ริลล์

readlines()รวมถึงการขึ้นบรรทัดใหม่ในผลลัพธ์ (len(x)+1)/7+1ดังนั้นคุณเป็นจริง คุณควรใช้read().split('\n')แทน แม้ว่าฉันจะได้ 5352 สำหรับสูตรนั้น
justhalf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.