स्ट्रिंग से अद्वितीय तत्वों को निकालना


12

मैं इस सवाल पर आया था, क्योंकि यह स्ट्रिंग में अद्वितीय पात्रों को खोजने के लिए बहुत सामान्य उपयोग-मामला लगता है। लेकिन क्या होगा अगर हम उनसे छुटकारा पाना चाहते हैं?

इनपुट में केवल निचले मामले के अक्षर हैं। केवल z से z अक्षरों का उपयोग किया जाता है। इनपुट की लंबाई 1 से 1000 तक हो सकती है।

उदाहरण:
इनपुट
: हेलोवर्ल्ड आउटपुट: लोल

उद्देश्य: सबसे छोटा कोड
भाषा जीतता है : TIOBE भाषाओं के शीर्ष 20 में से कोई भी

जवाबों:


7

पर्ल, 28 24 अक्षर ('पी' विकल्प के लिए 1 शामिल है)

s/./$&x(s!$&!$&!g>1)/eg

उपयोग:

> perl -pe 's/./$&x(s!$&!$&!g>1)/eg'
helloworld
llool

पहले तो मैंने सोचा कि मैं इसे नकारात्मक रूप से आगे और नकारात्मक रूप में देख सकता हूं, लेकिन यह पता चलता है कि नकारात्मक दिखने वाले लोगों की निश्चित लंबाई होनी चाहिए। इसलिए मैं इसके बजाय नेस्टेड रेगेक्स के लिए गया। टिप के लिए भीड़ के लिए धन्यवाद के साथ $&


+1। मैंने भोलेपन से सोचा कि मैं अपने रूबी के जवाब से इस बात को ले सकता हूं।
स्टीवन रूंबल्स्की

मैं चीनी पाठ पर यह कोशिश की और यह चाल नहीं किया। =
ixtmixilix

@ixtmixilix - साथ तो चलाने पर्ल -CDSविकल्प
भीड़

@ixtmixilix मुझे यूनिकोड और पर्ल के समर्थन के बारे में पर्याप्त नहीं पता है कि यह चीनी पाठ के साथ काम करने का एक तरीका सुझाता हूं जिससे मुझे डर लगता है। मेरे लिए सौभाग्य से सवाल केवल एक मामला z को कम कहता है।
गारेथ

1
सभी के $1साथ बदलें $&और आप कोष्ठक के एक जोड़े को खो सकते हैं।
भीड़

12

(गोल्फस्क्रिप्ट, १५ १३ अक्षर)

:;{.;?);>?)},

GolfScript टॉप 20 में से एक नहीं है, लेकिन GolfScript के बिना एक कोडगॉल्फ ... ( इसे स्वयं चलाएं )

पिछला संस्करण: ( स्क्रिप्ट चलाएँ )

1/:;{;\-,;,(<},

1
:;? आप जानबूझकर newbies को भ्रमित करने की कोशिश कर रहे हैं, क्या आप नहीं हैं? ;)
पीटर टेलर

@PeterTaylor आप सही हैं। मुझे चुना जाना चाहिए )- यह इसे एक स्माइली बना देगा :)। दुर्भाग्य से, मुझे अंकों को समाप्त करने का एक तरीका भी नहीं मिला। 1. (गोल्फस्क्रिप्ट newbies के लिए नोट: आप ;कोड में किसी भी x(या किसी अन्य पत्र या अंक के साथ - या किसी भी वर्ण का अन्यथा स्क्रिप्ट में उपयोग नहीं किया जा सकता है) को बदल सकते हैं। इस विशेष मामले ;में सिर्फ एक चर नाम है - और इसका अर्थ "पॉप और त्यागें" नहीं है। गोल्फस्क्रिप्ट में लगभग सभी टोकन किसी भी तरह से चर रहे हैं, और पूर्वनिर्धारित प्रतीकों का उपयोग करना स्क्रिप्ट्स को बाहरी लोगों के लिए और अधिक अपठनीय बनाने का एक शानदार तरीका है;;;)।
हावर्ड

एक और 13-चार समाधान::a{]a.@--,(},
इल्मरी करोनन

7

जे, 12 वर्ण

मान्य पर्ल उत्तर दर्ज करने के बाद, यहाँ एक अमान्य (TIOBE शीर्ष 20 में नहीं) उत्तर है।

a=:#~1<+/@e.

उपयोग:

   a 'helloworld'
llool

एक क्रिया की घोषणा करता है aजो केवल गैर विशिष्ट वस्तुओं का उत्पादन करती है।



4

रूबी 46 40 36

gets.chars{|c|$><<c if$_.count(c)>1}

यदि आप इनलाइन करते हैं sऔर $_दूसरी उपस्थिति के लिए उपयोग करते हैं तो 4 चार्ट बचा सकते हैं (पहले स्थान फिर डिस्पेंसेबल है)।
हावर्ड

@ हॉवर्ड: अच्छा कैच। धन्यवाद। मुझे रूबी के साथ शून्य अनुभव है।
स्टीवन रूंबल्स्की

2

पर्ल 44

$l=$_;print join"",grep{$l=~/$_.*$_/}split""

निष्पादन:

perl -lane '$l=$_;print join"",grep{$l=~/$_.*$_/}split""' <<< helloworld
llool


2

पायथन 2.7 ( 52 51), पायथन 3 (52)

मुझे उम्मीद नहीं थी कि यह इतना छोटा होगा।

2.7: a=raw_input();print filter(lambda x:a.count(x)>1,a)

3.0: a=input();print''.join(i for i in a if a.count(x)>1)

raw_input()एक स्ट्रिंग ( input()= eval(raw_input())) के रूप में स्टोर इनपुट
(पायथन 3.0: input()में बदल गया है raw_input())

filter(lambda x:a.count(x)>1,a): aयदि वे aएक से अधिक बार ( a.count(x)>1) में पाए जाते हैं तो सभी वर्णों के माध्यम से फ़िल्टर करें ।


आप के बजाय अजगर 3 का उपयोग करते हैं, तो आप उपयोग कर सकते हैं input()के बजाय raw_input()। आप एक बंद कोष्ठक के लिए एक चरित्र को जोड़ने के लिए, के बाद से है हालांकि printअजगर 3. में एक समारोह है
Strigoides

@Strigoides: मैंने अपने उत्तर में पायथन 3 कोड स्निपेट जोड़ा है।
beary605

पायथन 3 का फिल्टर एक ''.join(...)
पुनरावृत्ति

।। @JBernardo: :( डैंग मुझे सूचित करने के लिए धन्यवाद आप देख सकते हैं, मैं 3.0 का उपयोग नहीं करते।
beary605

2

सेड और कोरुटिल (128)

दी गई यह TIOBE सूची का हिस्सा नहीं है, लेकिन यह मजेदार है (-:

<<<$s sed 's/./&\n/g'|head -c -1|sort|uniq -c|sed -n 's/^ *1 (.*)/\1/p'|tr -d '\n'|sed 's:^:s/[:; s:$:]//g\n:'|sed -f - <(<<<$s)

डी-गोल्फ संस्करण:

s=helloworld
<<< $s sed 's/./&\n/g'        \
| head -c -1                  \
| sort                        \
| uniq -c                     \
| sed -n 's/^ *1 (.*)/\1/p'   \
| tr -d '\n'                  \
| sed 's:^:s/[:; s:$:]//g\n:' \
| sed -f - <(<<< $s)

व्याख्या

पहला सेड इनपुट को प्रति पंक्ति एक वर्ण में परिवर्तित करता है। दूसरे सेड में वे अक्षर मिलते हैं जो केवल एक बार होते हैं। थर्ड सेड एक सीड स्क्रिप्ट लिखता है जो यूनिक कैरेक्टर्स को डिलीट करता है। अंतिम सेड जनरेट स्क्रिप्ट को निष्पादित करता है।


2

ब्रेकीलॉग (v2), 8 बाइट्स

⊇.oḅlⁿ1∧

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

कार्य प्रस्तुत करना। तकनीकी रूप से गैरकानूनी होने के कारण इस सवाल पर एक सीमा होती है कि लैंगगेज को प्रतिस्पर्धा करने की अनुमति क्या है (हालांकि, कई अन्य उत्तरों ने पहले ही प्रतिबंध की अनदेखी की है)।

व्याख्या

⊇.oḅlⁿ1∧
⊇         Find {the longest possible} subset of the input
  o       {for which after} sorting it,
   ḅ        and dividing the sorted input into blocks of identical elements,
    lⁿ1     the length of a resulting block is never 1
 .     ∧  Output the subset in question.

आप अपने सभी समाधानों को सीडब्ल्यू क्यों करते हैं?
झबरा

1
@ शागिर्द: क) क्योंकि मैं अन्य लोगों के साथ उन्हें संपादित करने के लिए ठीक हूं, ख) यदि वे अपवित्र हैं तो प्रतिष्ठा हासिल करने से बचें। सामान्य तौर पर मुझे लगता है कि स्टैक एक्सचेंज का गैमीफ़िकेशन साइट के लिए एक बड़ी बाधा है - कभी-कभी उन कार्यों के बीच एक नकारात्मक सहसंबंध होता है जो आप प्रतिनिधि को सुधारने के लिए ले सकते हैं और जिन क्रियाओं से आप वास्तव में साइट को सुधार सकते हैं। इसके अतिरिक्त, एक उच्च प्रतिष्ठा की संख्या में होने से बेकार है; साइट आपको व्यवस्थापन कार्य करने के लिए परेशान करती रहती है, और आप जो कुछ भी करते हैं वह एक ब्लंट इंस्ट्रूमेंट होता है (जैसे कि जब आप कम प्रतिनिधि पर होते हैं तो आप एक संपादन का सुझाव दे सकते हैं , उच्च प्रतिनिधि में यह बस के माध्यम से मजबूर हो जाता है)।
अनीस ५२३

2

जाप , 6 5 बाइट्स

ÆèX É

-1 बाइट @ @ ओलिवर को धन्यवाद

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


2
Japt में आपका स्वागत है! इसके लिए वास्तव में एक शॉर्टकट है o@:Æ
ओलिवर

@ ओलिवर का एक और शॉर्टकट जो मुझे याद था, कूल,
थैंक्स

@ ओलिवर, बेहतर सवाल यह है कि फेक ने मुझे कैसे याद किया ?! : \
झबरा

1

पायथन (56)

यहाँ पायथन में एक और (अब कुछ वर्ण) विकल्प है:

a=raw_input();print''.join(c for c in a if a.count(c)>1)

यदि आप आउटपुट को एक सूची के रूप में स्वीकार करते हैं (उदाहरण के लिए ['l', 'l', 'o', 'o', 'l']), तो हम इसे 49 अक्षरों तक उबाल सकते हैं :

a=raw_input();print[c for c in a if a.count(c)>1]

अरे, >1एक अच्छा विचार है! क्या मुझे अपने समाधान में शामिल करना चाहिए?
beary605

@ beary605 निश्चित रूप से कोई समस्या नहीं है - एक चरित्र को ट्रिम करने का आसान तरीका: D
arshajii

1

गणितज्ञ 72 63

ठीक है, गणितज्ञ शीर्ष 20 भाषाओं में से नहीं है, लेकिन मैंने वैसे भी पार्टी में शामिल होने का फैसला किया।

x इनपुट स्ट्रिंग है।

"" <> Select[y = Characters@x, ! MemberQ[Cases[Tally@y, {a_, 1} :> a], #] &]

1

पर्ल (55)

@x=split//,<>;$s{$_}++for@x;for(@x){print if($s{$_}>1)}

स्टड से पढ़ता है।


1

सी # - 77 अक्षर

Func<string,string>F=s=>new string(s.Where(c=>s.Count(d=>c==d)>1).ToArray());

यदि आप आउटपुट को एक सरणी के रूप में स्वीकार करते हैं, तो यह 65 वर्णों तक पहुँच जाता है:

Func<string,char[]>F=s=>s.Where(c=>s.Count(d=>c==d)>1).ToArray();

1

ओकैमेल, १३ ९ १३३

ExtLib के ExtString.String का उपयोग करता है

open ExtString.String
let f s=let g c=fold_left(fun a d->a+Obj.magic(d=c))0 s in replace_chars(fun c->if g c=1 then""else of_char c)s

गैर-गोल्फ संस्करण

open ExtString.String
let f s =
  let g c =
    fold_left
      (fun a c' -> a + Obj.magic (c' = c))
      0
      s
  in replace_chars
  (fun c ->
    if g c = 1
    then ""
    else of_char c)
  s

फ़ंक्शन gस्ट्रिंग s में c के आवृत्तियों की संख्या लौटाता है। कार्यक्रमf सभी वर्णों को रिक्त स्ट्रिंग या आवृत्तियों की संख्या के आधार पर चार युक्त स्ट्रिंग द्वारा प्रतिस्थापित करता है। संपादित करें: मैंने बूल्स के आंतरिक प्रतिनिधित्व का दुरुपयोग करते हुए कोड को 6 वर्णों से छोटा कर दिया है :-)

ओह, और ओसमल TIOBE इंडेक्स पर 0 है ;-)


च *** TIOBE इंडेक्स।
ixtmixilix

मैं सहमत हूँ। इसके अलावा, upvote के लिए धन्यवाद। अब मैं टिप्पणी कर सकता हूं :-)
ReyCharles

1

PHP - 70

while($x<strlen($s)){$c=$s[$x];echo substr_count($s,$c)>1?$c:'';$x++;}

$ asumption $ s = 'helloworld' के साथ।


1

जावा 8, 90 बाइट्स

s->{for(char c=96;++c<123;s=s.matches(".*"+c+".*"+c+".*")?s:s.replace(c+"",""));return s;}

स्पष्टीकरण:

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

s->{                         // Method with String as both parameter and return-type
  for(char c=96;++c<123;     //  Loop over the lowercase alphabet
    s=s.matches(".*"+c+".*"+c+".*")?
                             //   If the String contains the character more than once
       s                     //    Keep the String as is
      :                      //   Else (only contains it once):
       s.replace(c+"",""));  //    Remove this character from the String
  return s;}                 //  Return the modified String

1

पावरशेल , 59 बाइट्स

"$args"-replace"[^$($args|% t*y|group|?{$_.Count-1}|% n*)]"

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

कम गोल्फ वाला:

$repeatedСhars=$args|% toCharArray|group|?{$_.Count-1}|% name
"$args"-replace"[^$repeatedСhars]"

नोट: $repeatedCharsएक सरणी है। डिफ़ॉल्ट रूप से, एक पॉवर्सशेल सरणी तत्वों को स्पेस चार से जोड़ता है जबकि एरे को स्ट्रिंग में परिवर्तित करता है। तो, regexp में रिक्त स्थान होते हैं (इस उदाहरण में, [^l o])। रिक्त स्थान परिणाम को प्रभावित नहीं करते हैं क्योंकि इनपुट स्ट्रिंग में केवल अक्षर होते हैं।


1

एपीएल (Dyalog विस्तारित) , 8 बाइट्स SBCS

बेनामी tacit उपसर्ग समारोह।

∊⊢⊆⍨1<⍧⍨

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

⍧⍨ काउंट-इन सेल्फ़ी (तर्क में तर्क तत्वों की घटनाएँ ही)

1< बूलियन मास्क जहां एक से कम है

⊢⊆⍨ उस मुखौटा द्वारा तर्क का विभाजन करें (1 एस पर एक नया विभाजन शुरू करें और 0 पर हटा दें)

fl nlist (समतल)


1

जावास्क्रिप्ट, 45 बाइट्स

s=>[...s].filter(c=>s.match(c+'.*'+c)).join``

1

आर , 70 बाइट्स

a=utf8ToInt(scan(,''));intToUtf8(a[!a%in%names(table(a)[table(a)<2])])

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

एक खराब प्रयास, यहां तक ​​कि एक TIOBE शीर्ष 20 भाषा से। मुझे पता है कि दूसरी छमाही के बारे में कुछ किया जा सकता है, लेकिन इस समय, कोई भी गोल्फ खिलाड़ी मुझसे बच जाता है।


1

जावास्क्रिप्ट, 34 बाइट्स

एक स्ट्रिंग के रूप में इनपुट, एक चरित्र सरणी के रूप में आउटपुट।

s=>[...s].filter(x=>s.split(x)[2])

यह ऑनलाइन की कोशिश करो!


अच्छा लगा। यहाँ एक वैकल्पिक 34- बायटर का उपयोग किया गया है map: tio.run/##BcExDoAgDADAvzgYOtjBHT9CTCSICqmUWKL8vt5l/…
ओलिवर

@ ओलिवर, काफी नहीं
झबरा


0

PHP - 137

कोड

implode('',array_intersect(str_split($text),array_flip(array_filter(array_count_values(str_split($text)),function($x){return $x>=2;}))));

सामान्य कोड

$text   = 'helloworld';
$filter = array_filter(array_count_values(str_split($text)), function($x){return $x>=2;});
$output = implode('',array_intersect(str_split($text),array_flip($filter)));

echo $output;

0

PHP - 83 78

<?for($a=$argv[1];$i<strlen($a);$r[$a[$i++]]++)foreach($ras$k=>$c)if($c>1)echo$k

संशोधित संस्करण:

<?for($s=$argv[1];$x<strlen($s);$c=$s[$x++]) echo substr_count($s,$c)>1?$c:'';

बेशक इसे बंद करने के लिए नोटिस की जरूरत है

संपादित करें: @engky mulyono से प्रेरित सुधार

मैं कोडगोल्फ में बहुत बुरा हूँ :)


0

सी ++, 139 बाइट्स

string s;cin>>s;string w{s}; auto l=remove_if(begin(s),end(s),[&w](auto&s){return count(begin(w),end(w),s)==1;});s.erase(l,end(s));cout<<s;

ungolfed:

#include <algorithm>
#include <string>
#include <iostream>

int main() {
  using namespace std;
  string s;
  cin >> s;
  const string w{s};
  auto l = remove_if(begin(s), end(s), [&w](auto& s) {
                                         return count(begin(w), end(w), s) == 1;
                                       });
  s.erase(l, end(s));
  cout << s;
  return 0;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.