एक वाक्य से नकली शब्द निकालें


10

इस चुनौती में, आप प्रत्येक वाक्य से डुप्लिकेट शब्द हटा देंगे ।

उदाहरण

Hello Hello, World!
Hello, World!

Code Code! Golf Code
Code! Golf Code

Hello  hello   World
Hello   World

Programming Golf Programming!
Programming Golf!

विशिष्टता

  • इनपुट ASCII वर्णों का एक स्ट्रिंग होगा।
  • एक वाक्य को स्ट्रिंग के अंत तक कुछ भी परिभाषित किया जाता है, एक लाइनफीड ( \n), या विराम चिह्न ( .!?)।
  • एक शब्द के अनुक्रम के रूप में परिभाषित किया गया है A-Za-z
  • शब्द असंवेदनशील हैं ( Hello== heLlO)।
  • किसी वाक्य में किसी शब्द की पहली घटना को ही रखा जाता है।
  • यदि एक शब्द हटा दिया जाता है, तो हटाए गए शब्द से पहले रिक्त स्थान हटा दिया जाना चाहिए। (जैसे A A B-> A B)।

यह बाइट्स जीत में इतना छोटा कोड है!


1
a b a.क्या जाता है?
lirtosiast

@ThomasKwa a b.क्योंकि `ए` हटा दिया जाता है।
डाउनगेट

के लिए a__b_b_a, क्या आपको a_b_a(पहले bहटाया गया) या a__b_a(दूसरा bनिकाला गया) मिलता है?

@CamilStaps आपको मिल जाएगा a__b__क्योंकि बार-बार bहटा दिया जाता है और दोहराया aको हटा दिया जाता है
डाउनगोट

1
@ ब्रैडगिल्बर्ब 2gills सभी ASCII वर्ण इनपुट में अनुमत हैं। केवल अक्षरों को ही शब्द माना जाता है
डाउनगोट

जवाबों:


3

विम, 27 बाइट्स

:s/\v\c(<\a+>).{-}\zs\s+\1

ध्यान दें कि 27 बाइट्स अंत में पीछे चल रही गाड़ी वापसी सहित है।

इसे ऑनलाइन आज़माएं! साइड नोट: यह एक अलग भाषा का लिंक है जिसे मैं "V" लिख रहा हूं। वी ज्यादातर विम के साथ पीछे की ओर संगत है, इसलिए सभी इरादों और उद्देश्यों के लिए, यह विम इंटरप्रेटर के रूप में गिना जा सकता है। मैंने एक बाइट भी जोड़ा %ताकि आप एक बार में सभी परीक्षण मामलों को सत्यापित कर सकें।

स्पष्टीकरण:

:s/\v                       "Substitute with the 'Magic flag' on. This magic flag allows us
                            "to shorten the regex by removing a lot of \ characters.
     \c(<\a+>)              "A case-insensitive word
              .{-}          "Any character (non-greedy)
                  \zs       "Start the selection. This means everything after this atom
                            "will be removed
                     \s+    "One or more whitespace characters,
                        \1  "Followed by the first word

6

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

ध्यान दें, जब मैंने इसे स्वयं पाया, तो यह निस्संदेह @ नील के समान है, केवल अतिरिक्त तर्क के साथ पूरे इनपुट स्ट्रिंग को वाक्यों में विभाजित करने के लिए।

s=>s.replace(/[^\n.!?]+/g,s=>s.replace(/ *([a-z]+)/ig,(r,w)=>k[w=w.toUpperCase()]?'':k[w]=r,k=[]))

परीक्षा

f=s=>s.replace(/[^\n.!?]+/g,s=>s.replace(/ *([a-z]+)/ig,(r,w)=>k[w=w.toUpperCase()]?'':k[w]=r,k=[]))

console.log=x=>O.textContent+=x+'\n'

;[['Hello Hello, World!','Hello, World!']
,['Code Code! Golf Code','Code! Golf Code']
,['Hello  hello   World','Hello   World']
,['Programming Golf Programming!','Programming Golf!']]
.forEach(t=>{
  var i=t[0],k=t[1],r=f(i)
  console.log((r==k?'OK ':'KO ')+i+' -> '+r)
})  
<pre id=O></pre>


6

रेटिना , 66 46 बाइट्स

बाइट गिनती आईएसओ 8859-1 एन्कोडिंग मानती है।

i`[a-z]+
·$0·
i` *(·[a-z]+·)(?<=\1[^.!?¶]+)|·

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

व्याख्या

चूँकि केवल अक्षरों को शब्द वर्ण माना जाना चाहिए (लेकिन रेगेक्स अंक और शब्द अक्षर को रेखांकित करता है, इसलिए भी), हमें अपनी शब्द सीमाएँ बनाने की आवश्यकता है। चूंकि इनपुट में केवल ASCII वर्ण सम्‍मिलित हैं, इसलिए मैं ·सभी शब्दों के आस-पास (ASCII के बाहर, लेकिन ISO 8859-1 के अंदर) सम्मिलित कर रहा हूं और फिर से डुप्लिकेट के साथ उन्हें निकाल रहा हूं। जेनेरिक शब्द सीमाओं को लागू करने के लिए लुकरॉइड्स का उपयोग करने पर 20 बाइट्स बचाता है।

i`[a-z]+
·$0·

यह हर शब्द से मेल खाता है और इसे घेरता है ·

i` *(·[a-z]+·)(?<=\1[^.!?¶]+)|·

यह एक में दो चरण संकुचित है। <sp>*(·[a-z]+·)(?<=\1[^.!?¶]+)एक पूर्ण शब्द से मेल खाता है ( ·मैच में शामिल करके सुनिश्चित किया गया है), साथ ही इसके पहले के किसी भी स्थान के साथ, बशर्ते कि (लुकअप के अनुसार सुनिश्चित हो) हम वाक्य में कहीं पहले एक ही शब्द पा सकते हैं। ( एक लाइनफीड से मेल खाता है।)

दूसरा हिस्सा बस है ·, जो सभी कृत्रिम शब्द सीमाओं से मेल खाता है जो पहले छमाही के हिस्से के रूप में मेल नहीं खाते थे। किसी भी स्थिति में, मैच को स्ट्रिंग से हटा दिया जाता है।


4

सी, 326 बाइट्स

किसे नियमित अभिव्यक्ति की आवश्यकता है?

#include <ctype.h>
#define a isalpha
#define c(x)*x&&!strchr(".?!\n",*x)
#define f(x)for(n=e;*x&&!a(*x);++x);
main(p,v,n,e,o,t)char**v,*p,*n,*e,*o,*t;{for(p=v[1];*p;p=e){f(p)for(e=p;c(e);){for(;a(*++e););f(n)if(c(n)){for(o=p,t=n;a(*o)&&(*o-65)%32==(*t-65)%32;o++,t++);if(a(*t))e=n;else memmove(e,t,strlen(t)+1);}}}puts(v[1]);}

3

पर्ल 6 , 104 बाइट्स

{[~] .split(/<[.!?\n]>+/,:v).map(->$_,$s?{.comb(/.*?<:L>+/).unique(as=>{/<:L>+/;lc $/}).join~($s//'')})} # 104

उपयोग:

# give it a lexical name
my &code = {...}

say code "Hello Hello, World!
Code Code! Golf Code
Hello  hello   World
Programming Golf Programming!";
Hello, World!
Code! Golf Code
Hello   World
Programming Golf!

व्याख्या

{
  [~]                         # join everything that follows:

  .split(/<[.!?\n]>+/,:v)     # split on boundaries, keeping them
  .map(                       # loop over sentence and boundary together
    -> $_, $s? {              # boundary is optional (at the end of the string)
      .comb(/.*?<:L>+/)       # grab the words along with leading non letters
      .unique(                # keep the unique ones by looking at …
        as => {/<:L>+/;lc $/} # only the word chars in lowercase
      )
      .join                   # join the sentence parts
      ~                       # join that with …
      ($s//'')                # the boundary characters or empty string 
    }
  )
}

1

पर्ल 5, 57 बाइट्स

56 बाइट्स कोड + 1 के लिए -p

s/[^.!?
]+/my%h;$&=~s~\s*([A-z]+)~!$h{lc$1}++&&$&~egr/eg

उपयोग:

perl -pe 's/[^.!?
]+/my%h;$&=~s~\s*([A-z]+)~!$h{lc$1}++&&$&~egr/eg' <<< 'Hello Hello, World!
Code Code! Golf Code
Hello  hello   World
Programming Golf Programming!
'
Hello, World!
Code! Golf Code
Hello   World
Programming Golf!

+1 करने की आवश्यकता हो सकती है, वर्तमान में मैं मान रहा हूं कि इनपुट में केवल स्थान होंगे, कोई टैब नहीं।


एक टिप्पणी से "सभी ASCII पात्रों को इनपुट में अनुमति दी जाती है। केवल अक्षरों को शब्द माना जाता है" (मैं इसे चुनौती में संपादित करूँगा, मुझे लगता है)
मार्टिन एंडर

@ मार्टिनबटनर लानत है, ठीक है मैं \sइसके बजाय उपयोग करने के लिए अपडेट करूंगा ... फिर भी आपके रेटिना के पास कहीं नहीं है हालांकि!
डोम हेस्टिंग्स 13

ओह, मैंने देखा कि आपने अब क्यों पूछा। अगर हमें शब्दों के सामने व्हॉट्सएप हटाने की जरूरत है , तो मुझे एक और बाइट की भी जरूरत है। सवाल हालांकि "रिक्त स्थान" विशेष रूप से कहता है। मैंने स्पष्टीकरण मांगा है।
मार्टिन एंडर

@ मार्टिनबटनर मुझे लगता है कि मेरी टिप्पणी वास्तव में स्पष्ट नहीं थी! आपकी टिप्पणी के लिए धन्यवाद!
डोम हेस्टिंग्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.