अस्पष्ट बहुवचन (ओं) को निकालें!


21

प्रोग्रामिंग बहुत कठोर है। आप "केला गणना को आउटपुट" करने के लिए एक कार्यक्रम नहीं बता सकते हैं, आपको इसे बताना होगा print(bananas)

लेकिन जब आप ऐसा करते हैं, तो आप एक समस्या के साथ समाप्त होते हैं: आप नहीं जानते कि आपके पास पहले से कितने केले हैं, इसलिए आप नहीं जानते कि बहुवचन का उपयोग करना है या नहीं।

कभी-कभी, प्रोग्रामर आलसी तरीके से जाते हैं। जांच के बजाय, वे सिर्फ प्रिंट करते हैं there are X banana(s)

लेकिन यह बदसूरत है, इसलिए हमें इसे ठीक करने के लिए एक कार्यक्रम की आवश्यकता है।

विधियों)

एक स्ट्रिंग में अस्पष्ट प्लुरल निकालने के लिए, निम्नलिखित चरणों का पालन करें:

  1. शब्दों की सूची में रिक्त स्थान पर स्ट्रिंग विभाजित करें।

  2. समाप्त होने वाले प्रत्येक शब्द के (s)लिए, निम्नलिखित करें:

    • पूर्ववर्ती शब्द है a, an, 1या one, हटाने (s)शब्द के अंत में।
    • अन्यथा, अगर शब्द स्ट्रिंग में पहला शब्द है या पूर्ववर्ती शब्द नहीं है a, an, 1या one, की जगह (s)के साथ शब्द के अंत में s
  3. मूल व्हाट्सएप को संरक्षित करते हुए, एक स्ट्रिंग में एक साथ वापस शब्दों की सूची में शामिल हों।

उदाहरण)

चलो एक तार ले लो there's a banana(s) and three apple(s)

सबसे पहले, हम स्ट्रिंग को शब्दों की एक सूची में विभाजित करते हैं: ["there's", "a", "banana(s)", "and", "three", "apple(s)"]

दूसरे चरण के लिए, हम दो शब्दों को समाप्त करते हैं (s): banana(s)और apple(s)

पहले banana(s)का शब्द है a, इसलिए हम (s)इसे बनाते हैं, हटाते हैं banana। पहले apple(s)का शब्द है three, इसलिए हम बदल जाते (s)हैं s, इस प्रकार यह बन जाता है apples

अब हमारे पास है ["there's", "a", "banana", "and", "three", "apples"]। एक साथ वापस सूची में शामिल हो, हम प्राप्त करते हैं there's a banana and three apples। यह हमारा अंतिम परिणाम है।

चुनौतियाँ)

एक प्रोग्राम या फ़ंक्शन बनाएँ जो किसी भी उचित प्रारूप में एक अस्पष्ट स्ट्रिंग लेता है और उस स्ट्रिंग के अन-एम्बिग्रेटेड संस्करण को वापस करता है।

आप मान सकते हैं कि स्ट्रिंग में कोई नया लिंक, टैब या गाड़ी का रिटर्न नहीं है।

मैं यह okay thenबताना भूल गया कि चैलेंज पोस्ट करते समय स्पेस या स्पेस के समूहों (यानी दो स्पेस के साथ होना चाहिए ["okay", "then"]या नहीं ["okay", "", "then"]) को विभाजित करना है, इसलिए आप विभाजन के किसी भी रूप को मान सकते हैं।

परीक्षण के मामलों)

Input                                         -> Output
there are two banana(s) and one leprechaun(s) -> there are two bananas and one leprechaun
there's a banana(s) and three apple(s)        -> there's a banana and three apples
apple(s)                                      -> apples
one apple(s)                                  -> one apple
1 banana(s)                                   -> 1 banana
banana                                        -> banana
preserve    original      whitespace(s)       -> preserve    original      whitespaces
11 banana(s)                                  -> 11 bananas
an apple(s)                                   -> an apple
this is a te(s)t                              -> this is a te(s)t
I am a (s)tranger(s)                          -> I am a (s)tranger

स्कोरिंग

जैसा कि यह , कम से कम बाइट्स जीत के साथ प्रस्तुत करना!


यह प्रश्न सैंडबॉक्स किया गया है ।
LyricLy

क्या apple(s)टेस्ट केस की applesजगह उपज मिलनी चाहिए? चुनौती में कहा गया है Otherwise, if the word is the first word in the string . . . replace the (s) at the end of the word with s.कि मैं ध्यान देता हूं कि यह मामला applesपहले तीन संशोधनों के लिए सैंडबॉक्स में आया लेकिन चौथे में बदल गया।
फायरफ्लेम 241

@ fireflame241 नियमों का दूसरा मसौदा लिखते समय, मैं इसे बनाने जा रहा था ताकि स्ट्रिंग की शुरुआत अपरिवर्तित हो। मैंने उस नियम को बाद में बदल दिया, लेकिन परीक्षण के मामले में नहीं। अच्छी पकड़।
LyricLy

टेस्ट मामले सुझाव: There's a single banana(s)-> There's a single bananas
जोनाथन एलन

1
@JonathanAllan आप नहीं कर सकते। मैं कुछ परीक्षण मामलों को जोड़ूंगा।
लाइरिकली

जवाबों:


6

मैथेमेटिका, 151 148 बाइट्स

StringReplace[j=" ";k=Except@j;j<>j<>#<>j,j~~a:k...~~s:j..~~w:k..~~"(s)"~~j:>{j,a,s,w,If[FreeQ[a,"a"|"an"|"1"|"one"],"s",""]}<>j]~StringTake~{3,-2}&

व्याख्या

j=" ";k=Except@j

jएक व्हाट्सएप कैरेक्टर पर सेट करें । k"नहीं j" (= गैर-व्हाट्सएप चरित्र) पैटर्न पर सेट करें ।

j<>j<>#<>j

दो व्हाट्सएप को प्रीपेन्ड करें और एक व्हाट्सएप (ओं) को इनपुट में जोड़ें।

j~~a:k...~~s:j..~~w:k..~~"(s)"~~j

एक विकल्प के लिए पैटर्न से मेल खाते हैं:

  1. एक व्हाट्सएप (एस), उसके बाद
  2. केवल गैर-व्हाट्सएप कैरेक्टर (क्वांटिफायर) (इसे कॉल करें a) के बाद एक लंबाई-शून्य या लंबे समय तक प्रतिस्थापन , इसके बाद
  3. sउसके बाद केवल व्हाट्सएप कैरेक्टर (एस) (इस पर कॉल करें ) से मिलकर एक लम्बाई-एक या लंबे समय तक घटिया
  4. केवल गैर-व्हाट्सएप चरित्र (ओं) (शब्द) (इस कॉल) से मिलकर एक लंबाई-एक या लंबे समय तक प्रतिस्थापन w, उसके बाद
  5. स्ट्रिंग "(s)", उसके बाद
  6. एक व्हाट्सएप
यदि [FreeQ [एक, "एक" | "एक" | "1" | "एक"], "एस", ""]

यदि aएकवचन शब्द (ओं) में से एक नहीं है, तो मूल्यांकन करें "s", अन्यथा ""

StringReplace[..., ... :>{j,a,s,w,If[FreeQ[a,"a"|"an"|"1"|"one"],"s",""]}<>j]

साथ मेल खाते नमूने की जगह j, a, s, w, If[FreeQ[a,"a"|"an"|"1"|"one"],"s",""], और jएक साथ शामिल हो गए।

... ~StringTake~{3,-2}

स्थिति 3 से स्थिति -2 तक ले जाएं (1-अनुक्रमित; अंत से नकारात्मक सूचकांक गणना)। ऐसा इसलिए है क्योंकि हमने शुरुआत में तीन स्थान जोड़े हैं।


3
बहुवचन-एस को हटाने के लिए बिलिन का उपयोग क्यों नहीं किया जाता है?
थॉमस वेलर

5

पायथन 3 , 94 बाइट्स

lambda s,r=re.sub:r(r"\(s\)( |$)","s",r(r"\b(an?|1|one)(\s+)(.+)\(s\)",r"\1\2\3",s))
import re

इसे ऑनलाइन आज़माएं!

-4 बाइट्स मैं cri everytim के लिए धन्यवाद (मुझे लगता है कि यह स्वीकार्य है)


@JonathanAllan फिक्स्ड, धन्यवाद।
हाइपरन्यूट्रिनो

1
__import__संभवतः छोटा नहीं हो सकता ... हाँ, यह एक नियमित रूप से 4 बाइट्स छोटा है import re
पूरी तरह से

@icrieverytim हुह आप सही हैं (केवल 3 बाइट्स हालांकि) धन्यवाद
हाइपरनेट्रिनो


@icrieverytim ._ ओह अच्छा। धन्यवाद!
हाइपरएन्यूट्रीनो

4

रेटिना , 53 बाइट्स

(( |^)(a|an|1|one) [^ ]*)\(s\)( |$)
$1
\(s\)( |$)
s$1

इसे ऑनलाइन आज़माएं!


1
इसके बाद इस स्थान को हटा दिया गया banana(s)है there's a banana(s) and three apple(s)- यह ठीक करने का
नील

आप बदल सकते हैं a|anकरने के लिए an?के लिए -1 बाइट
PunPun1000

4

गणितज्ञ, 313 बाइट्स

(Table[If[StringLength@z[[i]]>3&&StringTake[z[[i]],-3]=="(s)",z[[i]]=StringDrop[z[[i]],-3];t=1;While[z[[i-t]]=="",t++];If[FreeQ[{"a","an","1","one"},z[[i-t]]],z[[i]]=z[[i]]<>"s"]],{i,2,Length[z=StringSplit[#," "]]}];If[StringTake[z[[1]],-3]=="(s)",z[[1]]=StringDrop[z[[1]],-3];z[[1]]=z[[1]]<>"s"];StringRiffle@z)&

3

पर्ल 5, 43 + 1 (-पी) = 44 बाइट्स

s/\b((one|1|an?) +)?\S+\K\(s\)\B/"s"x!$1/ge

प्रत्येक (s)शब्द के अंत में मिलान करें , इसे !$1(1 या 0) निबंधों के साथ बदलें ।


2

पायथ - 53 बाइट्स

एल्गोरिथ्म का पालन करता है बहुत ज्यादा के रूप में यह है।

K+kczdjdt.e?q"(s)"gb_2+<b_3*\s!}@Ktk[\a"an""one"\1)bK

इसे यहाँ ऑनलाइन आज़माएँ


1
पर विफल there are two banana(s) and one leprechaun(s)(दो रिक्त स्थान के बाद one)। मूल व्हाट्सएप संरक्षित है, लेकिन इससे पहले ही leprechaun(s)नजरअंदाज कर देता oneहै।
LyricLy

1
@LyricLy आपने ओपी में स्पष्ट रूप से यह नहीं कहा है। आपकी "विधि (ओं) के दो रिक्त स्थान (उपयोगों) के साथ" "शब्दों के एक सूची में रिक्त स्थान पर स्ट्रिंग को विभाजित करने" का अनुभाग () शब्दों के बीच वास्तव में एक खाली शब्द हैoneleprechaun(s)
जोनाथन एलन

2

जेली ,  52 51  49 बाइट्स

जेली को एक रेगेक्स (एस) परमाणु नहीं मिला है

Ṫ
Ñ;”s
Ṫḣ-3
UṪw“)s(”⁼1
“µḣ⁴µuʠg*»ḲċḢ‘×Ç‘
⁶;ḲÇĿ2ƤK

एक स्ट्रिंग को स्वीकार करने वाला एक पूरा कार्यक्रम (यदि बहुलीकरण या उद्धरण युक्त पायथन फॉर्मेटिंग का उपयोग करके) और आउटपुट प्रिंट करता है।

इसे ऑनलाइन आज़माएं! या परीक्षण-सूट देखें

कैसे?

Ṫ - Link 1, tail: two words (list of lists)
Ṫ - tail

Ñ;”s - Link 2, tail and replace last three chars with an 's': two words (list of lists)
Ñ    - call the next link (3) as a monad
  ”s - literal 's'
 ;   - concatenate

Ṫḣ-3 - Link 3, tail and remove the last three chars: two words (list of lists)
Ṫ    - tail
  -3 - literal minus three
 ḣ   - head from index (1-indexed and modular)

UṪw“)s(”⁼1 - Link 4, tail ends with "(s)"?: two words (list of lists)
U          - upend (reverse each word)
 Ṫ         - tail
   “)s(”   - literal [')', 's', '('] - that is "(s)" reversed
  w        - index of first sublist equal to that or 0 if not found
         1 - literal one
        ⁼  - equal?

“µḣ⁴µuʠg*»ḲċḢ‘×Ç‘ - Link 5, categorise: two words (list of lists)
“µḣ⁴µuʠg*»        - compression of string "a 1" + word " an" + word " one"
          Ḳ       - split on spaces = ["a", "1", "an", "one"]
            Ḣ     - head (the first word)
           ċ      - count occurrences (of head in the list - either 0 or 1)
             ‘    - increment
               Ç  - call the last link (4) as a monad - i.e. f(two words)
              ×   - multiply
                ‘ - increment - so we have: 1 for ["1", "blah"],
                  -             2 for ["blah", "blah(s)"] or 3 for ["1", "blah(s)"]

⁶;ḲÇĿ2ƤK - Main link: list of characters, the string
⁶        - literal space character
 ;       - concatenate (place a space at the beginning as we want to inspect pairs)
  Ḳ      - split on spaces (giving an empty list at the start)
     2Ƥ  - for all infixes of length two:
    Ŀ    -   call the link at the given index as a monad:
   Ç     -     call the last link (5) as a monad
       K - join the result with spaces
         - implicit print

मैं उत्सुक हूं कि आपने एक अलग लिंक के रूप में क्यों उपयोग किया । क्या यह मूल सूची से तत्व को हटाने से रोकता है?
हाइपरन्यूट्रिनो

नहीं, मुझे जोड़ी की पूंछ प्राप्त करने की आवश्यकता है ... एक कोड टिप्पणी लिखना, हो सकता है कि आप एक बार एक गोल्फ को देख सकें।
जोनाथन एलन

आह ठीक है। धन्यवाद, मैं एक बार कमेंटरी (या फिर पहले) गोल्फ को स्पॉट करने की कोशिश करूँगा!
हाइपरन्यूट्रिनो

तो 1, 2 और 3 सभी पूंछों को जोड़ता है, और लिंक 5 चुनता है कि ऐसा करने के लिए कौन कॉल और उपयोग करता Ŀहै, लेकिन मुझे लिंक 4 के अंदर पूंछ करने का एक छोटा तरीका नहीं दिखता है, लेकिन हो सकता है। वहाँ भी लिंक 4 की पूंछ प्राप्त करने का एक तरीका हो सकता है!
जोनाथन एलन

@ हायपरनेट्रिनो मुझे लगता है कि चीज़ Ŀपहले लिंक को कॉल कर सकती है, इसीलिए यह अपने आप में एक लिंक है।
आउटगॉल्फ


1

पर्ल 5 , 56 + 1 ( -p) = 57 बाइट्स

s/\b(an?|1|one) +\S+\K\(s\)(?= |$)//g;s/\(s\)( |$)/s$1/g

इसे ऑनलाइन आज़माएं!


1
परीक्षण मामलों पर नहीं, लेकिन मुझे लगता है कि यह विफल रहता है a hel(s)lo
नील

यह ठीक से काम कर रहा है जैसा कि परीक्षण के मामले में प्रदान किया गया है। यह मेरे TIO लिंक में परीक्षण के मामलों के नीचे है।
21

वैसे मुझे सिर्फ a hel(s)loपरीक्षा के मामलों में शामिल होना पड़ेगा , और फिर शायद आप अपना कोड ठीक कर लेंगे ...
नील

0

जावास्क्रिप्ट (ईएस 6), 88 87 बाइट्स

a=>a.replace(/(\S+)( +)(\S+)\(s\)/g,(m,f,s,w)=>f+s+w+(/^(a|an|1|one)$/.exec(f)?'':'s'))

स्पष्टीकरण जल्द ही आ रहा है।


1
आप \s"` के अनुसार बदल सकते हैं "आप मान सकते हैं कि स्ट्रिंग में कोई नया लिंक, टैब या गाड़ी का रिटर्न नहीं है।"
सुपरस्टॉर्मर

"यह एक ते (s) t" पर विफल रहता है। आप (\s|$)रेगेक्स के अंत में जोड़कर ठीक कर सकते हैं ।
बिरजोलक्स्यूव

"सेब (ओं)" पर भी विफल रहता है। इस TIO में फिक्स्ड
Birjolaxew

धन्यवाद @Birjolaxew, जब मैं कर सकता हूँ तो परिवर्तनों को संपादित करूंगा ...
XavCo7

0

जावास्क्रिप्ट (ईएस 6), 84 बाइट्स

s=>s.replace(/((^|\S+ +)\S+)\(s\)(?!\S)/g,(_,a)=>a+(/^(1|an?|one) /.test(a)?'':'s'))

यहाँ पिछले भाग को पुनर्व्यवस्थित करने का एक दिलचस्प तरीका है, जो दुखद रूप से 2 बाइट्स लंबा है:

s=>s.replace(/((^|\S+ +)\S+)\(s\)(?!\S)/g,(_,a)=>a+'s'.slice(/^(1|an?|one) /.test(a)))

0

जावास्क्रिप्ट (स्पाइडरमोनी) , 82 बाइट्स

s=s.replace(/(\S+ +(\S+))\(s\)\B/g,(_,a)=>a+("s"[+/^(1|one|an?)\b/i.test(a)]||""))

इसे ऑनलाइन आज़माएं!

78 बाइट संस्करण (कम मजबूत)

s=s.replace(/(\S+ +(\S*))\(s\)/g,(_,a)=>a+("s"[+/^(1|one|an?)/i.test(a)]||""))

यह ETHproductions का एक संशोधित संस्करण है '(मेरे पास 50 प्रतिनिधि नहीं हैं।)

व्याख्या

  • /(\S+ +(\S+))\(s\)/g- ( amount object(s)) देखने के लिए वास्तविक पैटर्न
  • (_,a)=>a- _एक पकड़ है सभी चर, aहै(\S+ +(\S+))
  • "s"[+/^(1|one|an?)/i.test(a)]||"" - ऐरे को स्लाइस करने के बजाय, बस डमी ऐरे बनाएं और इंडेक्स प्राप्त करें (+/.../.test एक नंबर लौटाता है)
    • "s"[+/^(1|one|an?)/i.test(a)]लौट जाना चाहिए undefined( trueया 1परीक्षण के लिए)""
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.