นับข้อผิดพลาดการสะกดในข้อความ ลดจำนวนข้อผิดพลาดการสะกดคำในรหัสของคุณ


28

เขียนโปรแกรมหรือฟังก์ชั่นที่รับสองอินพุต:

  1. ข้อความตัวอักษร
  2. พจนานุกรมภาษาอังกฤษตามที่ปรากฏในไฟล์ Github นี้ (มีประมาณ 60000 คำ)

และส่งออกจำนวนข้อผิดพลาดการสะกดคำในข้อความ (ดูด้านล่างสำหรับคำจำกัดความและกรณีทดสอบ)

คุณสามารถรับพจนานุกรมเป็นพารามิเตอร์ในการทำงานของคุณในฐานะไฟล์ที่กำหนดไว้ล่วงหน้าซึ่งโปรแกรมของคุณคาดหวังว่าจะค้นหาเป็นข้อมูลที่กำหนดโค้ดยากในรหัสของคุณหรือในลักษณะที่เหมาะสมอื่น ๆ


รหัสของคุณควรมีลักษณะเหมือนข้อความตัวอักษรมีข้อผิดพลาดในการสะกดน้อยที่สุด ดังนั้นคุณจะคำนวณคะแนนของรหัสของคุณโดยป้อนให้ตัวเองเป็นอินพุต

ผู้ชนะคือรหัสที่มีคะแนนต่ำสุด (คะแนนที่น้อยที่สุดคือ 0) หากมีหลายคำตอบด้วยคะแนนเดียวกันผู้ชนะจะถูกตัดสินโดยขนาดรหัส (เป็นตัวอักษร) หากคำตอบทั้งสองยังคงถูกผูกไว้ผู้ชนะคือคำตอบก่อนหน้า


หากจำเป็นคุณสามารถสมมติว่าข้อความอินพุตเป็น ASCII (ไบต์ 32 ... 126) โดยมีบรรทัดใหม่เข้ารหัสในลักษณะทั่วไป (1 ไบต์ "10" หรือ 2 ไบต์ "13 10") และไม่ว่างเปล่า อย่างไรก็ตามหากรหัสของคุณมีอักขระที่ไม่ใช่ ASCII ก็ควรสนับสนุนการป้อนข้อมูลที่ไม่ใช่ ASCII (เพื่อให้สามารถคำนวณคะแนนของตัวเอง)

อักขระแบ่งออกเป็นคลาสต่อไปนี้:

  • ตัวอักษร a ... z และ A ... Z
  • ช่องว่าง (กำหนดที่นี่เป็นอักขระช่องว่างหรืออักขระขึ้นบรรทัดใหม่)
  • วรรคตอน . , ; : ! ?
    • ประโยคที่สิ้นสุด . ! ?
  • มูลฝอย (ส่วนที่เหลือทั้งหมด)

คำที่ถูกกำหนดให้เป็นลำดับของตัวอักษรซึ่งเป็นสูงสุด (เช่นค่านำหน้าหรือตามตัวอักษร)

ประโยคที่ถูกกำหนดให้เป็นลำดับสูงสุดของตัวละครที่ไม่ได้เป็นประโยคที่สิ้นสุด

อักขระเป็นข้อผิดพลาดในการสะกดคำหากมีการละเมิดกฎการสะกดคำใด ๆ :

  1. ตัวอักษรต้องอยู่ในคำในพจนานุกรม (หรือในคำอื่น ๆ : แต่ละคำที่มีความยาว N ที่ไม่ปรากฏในพจนานุกรมจะนับเป็นข้อผิดพลาดในการสะกดคำ N)
  2. อักขระตัวแรกในประโยคโดยไม่สนใจอักขระช่องว่างเริ่มต้นใด ๆ ต้องเป็นตัวอักษรตัวพิมพ์ใหญ่
  3. ตัวอักษรทั้งหมดจะต้องเป็นตัวพิมพ์เล็กยกเว้นตัวอักษรที่ระบุโดยกฎก่อนหน้า
  4. อนุญาตให้ใช้เครื่องหมายวรรคตอนเฉพาะหลังจากตัวอักษรหรือขยะ
  5. อนุญาตให้ใช้อักขระขึ้นบรรทัดใหม่หลังจากอักขระสิ้นสุดประโยคเท่านั้น
  6. ไม่อนุญาตให้ใช้อักขระช่องว่างในตอนต้นของข้อความและหลังอักขระช่องว่าง
  7. ไม่ควรมีขยะ (หรือในคำอื่น ๆ : การนับจำนวนอักขระแต่ละตัวเป็นข้อผิดพลาดในการสะกดคำ)

นอกจากนี้ประโยคสุดท้ายจะต้องว่างเปล่าหรือประกอบด้วยอักขระขึ้นบรรทัดใหม่หนึ่งตัว (เช่นข้อความควรลงท้ายด้วยอักขระลงท้ายประโยคและขึ้นบรรทัดใหม่ซึ่งเป็นตัวเลือก - ลองเรียกว่ากฎ 8)

กรณีทดสอบ (ด้านล่างอักขระแต่ละตัวเป็นกฎที่ละเมิดหลังจากนั้น=>คือคำตอบที่จำเป็น):

Here is my 1st test case!!
           711           4                => 4

main(){puts("Hello World!");}
2   777    883     3     77 78            => 12

  This message starts with two spaces
66                                   8    => 3

What ? No apostrophe's??
     4              71 4                  => 4

  Extra   whitespace   is   BAD!
66      661111111111 66   66333           => 21

Several
lines?
Must be used only to separate sentences.
                                          => 1 (first linebreak is en error: rule 5)

"Come here," he said.
73         7                              => 3 (sentence starts with '"', not 'C')

2
ฉันคาดหวังว่าจะมีช่องโหว่มากมาย แต่คุณดูเหมือนจะครอบคลุมพวกเขาทั้งหมด +1 จากฉัน
Nathan Merrill

4
ฉันคิดว่าSPLเป็นผู้ชนะที่นี่
Gurupad Mamadapur

2
. เกอร์ทรูดก็ดีกว่า คำสั่งเป็นประโยคโดยพลการเฉพาะจำนวนคำและความยาวของคำโดยเฉลี่ย
Rainer P.

ฉันคิดว่า "Applescript" เมื่อฉันเห็นสิ่งนี้ แม้ว่าจะไม่มี Mac ก็ตาม
PurkkaKoodari

1
@PeterTaylor ฉันไม่ต้องการให้กฎซับซ้อนเกินไป กรณีทดสอบของคุณดี ฉันเพิ่มลงในโพสต์ของฉัน
anatolyg

คำตอบ:


6

Perl 6 , 134 ข้อผิดพลาดการสะกด

my token punctuation {<[.,;:!?]>}
my \text = slurp; my \mistakes=[]; for split /\.|\!|\?/, text { for .trim.match: :g, /<:letter>+/ -> \word { (append mistakes, .comb when none words slurp pi given lc word) or (push mistakes, $_ if ((.from or word.from) xor m/<[a..z]>/) for word.match: :g, /./) }}
append mistakes, comb / <after \s | <punctuation>> <punctuation> | <!before <punctuation> | <:letter> | \s> . | <!after \.|\!|\?> \n | [<before ^> | <after \s>] \s /, text; say mistakes.Numeric

ด้วยช่องว่างพิเศษสำหรับการอ่าน:

my token punctuation {<[.,;:!?]>}
my \text = slurp;
my \mistakes=[];
for split /\.|\!|\?/, text {
    for .trim.match: :g, /<:letter>+/ -> \word {
        (append mistakes, .comb when none words slurp pi given lc word)
        or
        (push mistakes, $_ if ((.from or word.from) xor m/<[a..z]>/) for word.match: :g, /./)
    }
}
append mistakes, comb /
  <after \s | <punctuation>> <punctuation>
  | <!before <punctuation> | <:letter> | \s> .
  | <!after \.|\!|\?> \n
  | [<before ^> | <after \s>] \s
/, text;
say mistakes.Numeric

หมายเหตุ:

  • คาดว่าพจนานุกรมในไฟล์ที่เรียกว่า3.14159265358979ในไดเรกทอรีการทำงานปัจจุบัน
  • ส่วนแรงบันดาลใจเพียงอย่างเดียวคือสาย
    append mistakes, .comb when none words slurp pi given lc word,
    ส่วนที่เหลือเป็นไม่ดีงาม แต่อย่างน้อยก็อาจเป็นพื้นฐานสำหรับการแก้ปัญหาที่ดีกว่า ... :)

4
รหัส perl ที่อ่านได้มากที่สุด
Kritixi Lithos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.