Xóa các phần tử duy nhất khỏi chuỗi


12

Tôi đã gặp câu hỏi này, bởi vì nó có vẻ là trường hợp sử dụng rất phổ biến để tìm các ký tự duy nhất trong chuỗi. Nhưng nếu chúng ta muốn thoát khỏi chúng thì sao?

Đầu vào chỉ chứa bảng chữ cái viết thường. Chỉ các chữ cái từ a đến z được sử dụng. Độ dài đầu vào có thể từ 1 đến 1000 ký tự.

Ví dụ:
đầu vào:
đầu ra hellowworld: llool

Mục tiêu: Mã ngắn nhất sẽ thắng
Ngôn ngữ: Bất kỳ trong số 20 ngôn ngữ TIOBE hàng đầu

Câu trả lời:


7

Perl, 28 24 ký tự (bao gồm 1 cho tùy chọn 'p')

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

Sử dụng:

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

Lúc đầu, tôi nghĩ rằng tôi có thể làm điều này với cái nhìn tiêu cực và cái nhìn tiêu cực phía sau, nhưng hóa ra cái nhìn tiêu cực phải có chiều dài cố định. Vì vậy, tôi đã đi cho regexes lồng nhau thay thế. Cảm ơn mob cho tiền $&boa.


+1. Tôi ngây thơ nghĩ rằng tôi có thể lấy thứ này với câu trả lời Ruby của tôi.
Steven Rumbalski

tôi đã thử điều này trên văn bản tiếng Trung Quốc và nó đã không làm được điều đó. = (
ixtmixilix

@ixtmixilix - sau đó chạy perl với -CDStùy chọn
mob

@ixtmixilix Tôi không biết đủ về unicode và sự hỗ trợ của Perl về nó để đề xuất một cách để làm cho nó hoạt động với văn bản tiếng Trung Quốc tôi sợ. May mắn cho tôi câu hỏi chỉ nói chữ thường từ a đến z.
Gareth

1
Thay thế tất cả $1bằng $&và bạn có thể mất một vài dấu ngoặc đơn.
mob

12

(GolfScript, 15 13 ký tự)

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

GolfScript không phải là một trong top 20, mà là một codegolf không có GolfScript ... (tự chạy nó )

Phiên bản trước: ( chạy tập lệnh )

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

1
:;? Bạn đang cố tình gây nhầm lẫn cho người mới, phải không? ;)
Peter Taylor

@PeterTaylor Bạn nói đúng. Tôi nên đã chọn một )- nó sẽ làm cho nó một nụ cười sau đó :). Thật không may, tôi đã không tìm ra cách để loại bỏ chữ số 1. (Lưu ý cho người mới chơi GolfScript: bạn có thể thay thế bất kỳ ;trong mã bằng một x(hoặc bất kỳ chữ cái hoặc chữ số nào khác - hoặc bất kỳ ký tự nào không được sử dụng trong tập lệnh). Trong trường hợp đặc biệt ;này chỉ là một tên biến - và không có nghĩa là "pop và disard". Trong GolfScript, hầu hết tất cả các mã thông báo đều là biến và sử dụng các ký hiệu được xác định trước là cách tuyệt vời để làm cho các tập lệnh trở nên khó đọc hơn đối với người ngoài ;-).)
Howard

Một giải pháp 13-char khác::a{]a.@--,(},
Ilmari Karonen

7

J, 12 ký tự

Đã nhập câu trả lời Perl hợp lệ, đây là câu trả lời không hợp lệ (ngôn ngữ không nằm trong top 20 của TIOBE).

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

Sử dụng:

   a 'helloworld'
llool

Khai báo một động từ achỉ xuất ra các mục không duy nhất.



4

Ruby 46 40 36

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

Bạn có thể lưu 4 ký tự nếu bạn nội tuyến svà sử dụng $_cho lần xuất hiện thứ hai (không gian trước đó có thể được phân phối).
Howard

@Howard: Bắt đẹp. Cảm ơn. Tôi không có kinh nghiệm với Ruby.
Steven Rumbalski

2

Perl 44

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

Chấp hành:

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

2

K, 18

{x@&x in&~1=#:'=x}

Bạn có thể lưu một byte bằng cách sử dụng 1<#thay vì~1=#
J. Sendra

2

Python 2.7 ( 52 51), Python 3 (52)

Tôi không mong đợi nó sẽ quá ngắn.

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(): lưu trữ đầu vào dưới dạng chuỗi ( input()= eval(raw_input()))
(Python 3.0: input()đã được chuyển thành raw_input())

filter(lambda x:a.count(x)>1,a): Lọc qua tất cả các ký tự bên trong anếu chúng được tìm thấy anhiều lần ( a.count(x)>1).


Nếu bạn sử dụng python 3 thay thế, bạn có thể sử dụng input()chứ không phải raw_input(). Mặc dù bạn phải thêm một ký tự cho dấu ngoặc đóng, vì đó printlà một hàm trong python 3.
Strigoides

@Strigoides: Tôi đã thêm đoạn mã Python 3 vào câu trả lời của mình.
beary605

Bộ lọc của Python 3 trả về một trình vòng lặp ... Bạn sẽ cần phải làm''.join(...)
JBernardo

@JBernardo: :( Dang. Cảm ơn bạn đã thông báo cho tôi. Như bạn thấy, tôi không sử dụng 3.0.
beary605

2

sed và coreutils (128)

Được cho rằng đây không phải là một phần của danh sách TIOBE, nhưng thật thú vị (-:

<<<$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)

Phiên bản bỏ chơi gôn:

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)

Giải trình

Sed đầu tiên chuyển đổi đầu vào thành một ký tự trên mỗi dòng. Sed thứ hai tìm thấy các nhân vật chỉ xảy ra một lần. Thứ ba sed viết một kịch bản sed xóa các ký tự độc đáo. Sed cuối cùng thực thi các kịch bản được tạo ra.


2

Brachylog (v2), 8 byte

⊇.oḅlⁿ1∧

Hãy thử trực tuyến!

Chức năng trình. Về mặt kỹ thuật không giải mã vì câu hỏi có giới hạn về những gì langauges được phép cạnh tranh (tuy nhiên, một số câu trả lời khác đã bỏ qua hạn chế).

Giải trình

⊇.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.

Tại sao bạn CW tất cả các giải pháp của bạn?
Xù xì

1
@Shaggy: a) bởi vì tôi ổn với những người khác chỉnh sửa chúng, b) để tránh đạt được danh tiếng nếu họ được nâng cấp. Nói chung, tôi nghĩ rằng giao diện của Stack Exchange là một bất lợi lớn cho trang web - đôi khi có một mối tương quan tiêu cực giữa các hành động mà bạn có thể thực hiện để cải thiện đại diện và các hành động bạn có thể thực hiện để cải thiện trang web. Ngoài ra, ở một danh tiếng cao hút; trang web tiếp tục cằn nhằn bạn để thực hiện các nhiệm vụ quản trị viên và mọi thứ bạn làm là một công cụ cùn (ví dụ: khi bạn ở mức thấp, bạn có thể đề xuất chỉnh sửa, ở mức cao, nó chỉ bị ép buộc).
ais523

2

Japt , 6 5 byte

ÆèX É

-1 byte nhờ @Oliver

Hãy thử trực tuyến!


2
Chào mừng đến với Japt! Thực sự có một lối tắt cho o@:Æ
Oliver

@Oliver Một lối tắt khác mà tôi đã bỏ lỡ, tuyệt, cảm ơn :)
Quintec

@Oliver, câu hỏi hay hơn là làm thế nào tôi bỏ lỡ nó?! : \
Xù xì

1

Con trăn (56)

Đây là một thay thế khác (vài ký tự dài hơn) trong Python:

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

Nếu bạn chấp nhận đầu ra dưới dạng danh sách (ví dụ ['l', 'l', 'o', 'o', 'l']), thì chúng tôi có thể rút nó xuống còn 49 ký tự:

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

Này, >1là một ý tưởng tốt! Tôi có thể kết hợp điều đó vào giải pháp của mình không?
beary605

@ beary605 Chắc chắn không có vấn đề gì cả - cách dễ dàng để cắt xén một nhân vật: D
arshajii

1

Toán học 72 63

Ok, Mathematica không nằm trong số 20 ngôn ngữ hàng đầu, nhưng tôi vẫn quyết định tham gia bữa tiệc.

x là chuỗi đầu vào.

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

1

Perl (55)

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

Đọc từ stdin.


1

C # - 77 ký tự

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

Nếu bạn chấp nhận đầu ra dưới dạng một mảng, nó sẽ giảm xuống còn 65 ký tự:

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

1

Đại dương, 139 133

Sử dụng ExtStib's 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

Phiên bản không chơi gôn

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

Hàm gtrả về số lần xuất hiện của c trong chuỗi s. Chức năngf thay thế tất cả các ký tự bằng chuỗi rỗng hoặc chuỗi chứa char tùy thuộc vào số lần xuất hiện. Chỉnh sửa: Tôi rút ngắn mã bằng 6 ký tự bằng cách lạm dụng biểu diễn bên trong của bools :-)

Ồ, và ocaml là 0 trên chỉ số TIOBE ;-)


f *** chỉ số TIOBE.
ixtmixilix

Tôi đồng ý. Ngoài ra, cảm ơn cho upvote. Bây giờ tôi có thể nhận xét :-)
ReyCharles

1

PHP - 70

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

với giả định $ s = 'hellowworld'.


1

Java 8, 90 byte

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

Giải trình:

Hãy thử trực tuyến.

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

PowerShell , 59 byte

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

Hãy thử trực tuyến!

Ít chơi gôn hơn:

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

Lưu ý: $repeatedCharslà một mảng. Theo mặc định, Powershell kết hợp các phần tử mảng bằng dấu cách char trong khi chuyển đổi mảng thành chuỗi. Vì vậy, biểu thức chính quy chứa khoảng trắng (Trong ví dụ này [^l o]). Dấu cách không ảnh hưởng đến kết quả vì chuỗi đầu vào chỉ chứa các chữ cái.


1

APL (Dyalog kéo dài) , 8 byte SBCS

Chức năng tiền tố ẩn danh.

∊⊢⊆⍨1<⍧⍨

Hãy thử trực tuyến!

⍧⍨ selfie đếm ngược (số lần xuất hiện của các thành phần đối số trong chính đối số)

1< Mặt nạ Boolean nơi một ít hơn đó

⊢⊆⍨ phân vùng đối số bằng mặt nạ đó (bắt đầu phân vùng mới trên 1s và xóa trên 0)

ε nlist (flatten)



1

R , 70 byte

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

Hãy thử trực tuyến!

Một nỗ lực kém, thậm chí từ một ngôn ngữ top 20 của TIOBE. Tôi biết điều gì đó có thể được thực hiện trong nửa thứ hai, nhưng tại thời điểm này, bất kỳ golf nào thoát khỏi tôi.




0

PHP - 137

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

Mã thường

$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

Phiên bản cải tiến:

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

Tất nhiên điều này cần phải được thông báo để tắt

Biên tập: Cải thiện lấy cảm hứng từ @hengky mulyono

Tôi rất tệ ở codegolf :)


0

C ++, 139 byte

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;

vô dụng:

#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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.