पाठ में वर्तनी की त्रुटियां गिनें; अपने कोड में वर्तनी त्रुटियों की संख्या को कम करें


28

एक प्रोग्राम या फ़ंक्शन लिखें जो दो इनपुट लेता है:

  1. एक लिखित संदेश
  2. अंग्रेजी भाषा का शब्दकोश, जैसा कि इस गितुब फ़ाइल में दिखाई देता है (जिसमें लगभग 60000 शब्द हैं)

और संदेश में वर्तनी त्रुटियों की संख्या को आउटपुट करता है (परिभाषा और परीक्षण मामलों के लिए नीचे देखें)।

आप अपने फ़ंक्शन के लिए एक पैरामीटर के रूप में डिक्शनरी प्राप्त कर सकते हैं, एक पूर्व-परिभाषित फ़ाइल के रूप में जिसे आपका प्रोग्राम अपने कोड में या किसी अन्य समझदार तरीके से हार्ड-कोडित डेटा के रूप में खोजने की उम्मीद करता है।


आपके कोड को कम से कम वर्तनी त्रुटियों के साथ, एक पाठ संदेश की तरह दिखना चाहिए। तो, आप इनपुट के रूप में खुद को खिलाकर अपने कोड के स्कोर की गणना करेंगे।

विजेता कोड है जिसमें सबसे कम स्कोर (न्यूनतम संभव स्कोर 0 है)। यदि समान स्कोर के साथ कई उत्तर हैं, तो विजेता का निर्णय कोड आकार (वर्णों में) द्वारा किया जाता है। यदि दो उत्तर अभी भी बंधे हैं, तो विजेता पहले वाला है।


यदि आवश्यक हो, तो आप पारंपरिक संदेश (1 बाइट "10" या 2 बाइट्स "13 10") और गैर-खाली में एन्कोड किए गए इनपुट संदेश को ASCII (बाइट्स 32 ... 126) मान सकते हैं। हालांकि, यदि आपके कोड में गैर-एएससीआईआई अक्षर हैं, तो उसे गैर-एएससीआईआई इनपुट का भी समर्थन करना चाहिए (ताकि यह अपने स्वयं के स्कोर की गणना कर सके)।

वर्ण निम्न वर्गों में विभाजित हैं:

  • अक्षर a ... z और A ... Z
  • व्हॉट्सएप (यहां या तो स्पेस कैरेक्टर या न्यूलाइन कैरेक्टर के रूप में परिभाषित)
  • विराम चिह्न . , ; : ! ?
    • वाक्य न खत्म होने वाली . ! ?
  • कचरा (शेष सभी)

एक शब्द को अक्षरों के अनुक्रम के रूप में परिभाषित किया गया है, जो कि अधिकतम है (अर्थात न तो पहले और न ही पत्र के बाद)।

एक वाक्य को वर्णों के एक अधिकतम अनुक्रम के रूप में परिभाषित किया गया है जो वाक्य-अंत नहीं हैं।

यदि यह वर्तनी नियमों में से किसी का उल्लंघन करता है तो एक वर्ण वर्तनी की त्रुटि है:

  1. एक अक्षर एक डिक्शनरी शब्द से संबंधित होना चाहिए (या, दूसरे शब्दों में: लंबाई एन का प्रत्येक शब्द डिक्शनरी त्रुटियों के रूप में डिक्शनरी काउंट्स में प्रकट नहीं होता है)
  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।
नाथन मेरिल

4
मुझे लगता है कि एसपीएल यहां विजेता है।
गुरुपाद ममदापुर

2
.गर्ट्रूड और भी बेहतर है। कमांड्स मनमाना वाक्य हैं, केवल शब्द गणना और औसत शब्द लंबाई मामला है।
रेनर पी।

मैंने सोचा कि जब मैंने इसे देखा तो "एप्लास्क्रिप्ट"। एक मैक नहीं है, यद्यपि।
पुरकाकूदरी

1
@PeterTaylor मैं नहीं चाहता कि नियम बहुत जटिल हो जाएं। आपका परीक्षण मामला ठीक है; मैंने इसे अपनी पोस्ट में जोड़ा।
अनातोलीग

जवाबों:


6

पर्ल 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
अब तक का सबसे पठनीय पर्ल कोड
क्रिति लिथोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.