Menghapus elemen unik dari string

12

Saya menemukan pertanyaan ini, karena sepertinya sangat umum digunakan untuk menemukan karakter unik dalam string. Tetapi bagaimana jika kita ingin menyingkirkan mereka?

Input hanya berisi huruf kecil. Hanya huruf dari a hingga z yang digunakan. Panjang input dapat dari 1 hingga 1000 karakter.

Contoh:
input: helloworld
output: llool

Tujuan: Kode terpendek menang
Bahasa: Salah satu dari 20 bahasa TIOBE teratas

pengguna14742
sumber

Jawaban:

7

Perl, 28 24 karakter (termasuk 1 untuk opsi 'p')

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

Pemakaian:

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

Pada awalnya saya pikir saya bisa melakukan ini dengan pandangan ke depan negatif dan pandangan ke belakang negatif, tetapi ternyata pandangan negatif di belakang harus memiliki panjang yang tetap. Jadi saya pergi untuk regex bersarang sebagai gantinya. Dengan terima kasih kepada mob untuk $&tipnya.

Gareth
sumber
+1. Dengan naif kupikir aku bisa menerima benda ini dengan jawaban Ruby-ku.
Steven Rumbalski
Saya mencoba ini pada teks Cina dan tidak berhasil. = (
ixtmixilix
@ixtmixilix - lalu jalankan perl dengan -CDSopsi
mob
@ixtmixilix Saya tidak cukup tahu tentang unicode dan dukungan Perl untuk menyarankan cara untuk membuatnya bekerja dengan teks Cina, saya khawatir. Untungnya bagi saya pertanyaannya hanya huruf kecil a sampai z.
Gareth
1
Ganti semua $1dengan $&dan Anda bisa kehilangan beberapa pasang tanda kurung.
mob
12

(GolfScript, 15 13 karakter)

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

GolfScript bukan salah satu dari 20 teratas, tetapi codegolf tanpa GolfScript ... ( jalankan sendiri )

Versi Sebelumnya: ( run script )

1/:;{;\-,;,(<},
Howard
sumber
1
:;? Anda sengaja mencoba membingungkan para pemula, bukan? ;)
Peter Taylor
@PeterTaylor Anda benar. Aku seharusnya memilih )- itu akan membuatnya tersenyum :). Sayangnya, saya tidak menemukan cara untuk menghilangkan digit 1. (Catatan untuk pemula GolfScript: Anda dapat mengganti apa pun ;dalam kode dengan x(atau huruf atau digit lainnya - atau karakter apa pun yang tidak digunakan dalam skrip). Dalam kasus khusus ;ini hanya nama variabel - dan tidak memiliki arti "pop and discard". Dalam GolfScript hampir semua token adalah variabel lagian, dan menggunakan simbol yang telah ditentukan adalah cara yang bagus untuk membuat skrip bahkan lebih tidak dapat dibaca oleh orang luar ;-).)
Howard
Solusi 13-char lainnya::a{]a.@--,(},
Ilmari Karonen
7

J, 12 karakter

Setelah memasukkan jawaban Perl yang valid, inilah jawaban (bahasa yang tidak ada dalam TIOBE top 20) tidak valid.

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

Pemakaian:

   a 'helloworld'
llool

Mendeklarasikan kata kerja ayang hanya menghasilkan item yang tidak unik.

Gareth
sumber
5

GolfScript (14 karakter)

:x{{=}+x\,,(},

Demo online

Mungkin tidak memenuhi syarat untuk menang, tetapi berguna untuk memiliki tolok ukur.

Peter Taylor
sumber
4

Ruby 46 40 36

gets.chars{|c|$><<c if$_.count(c)>1}
Steven Rumbalski
sumber
Anda dapat menyimpan 4 karakter jika Anda sebaris sdan menggunakan $_untuk penampilan kedua (ruang sebelumnya kemudian dapat dibuang).
Howard
@ Howard: Tangkapan bagus. Terima kasih. Saya memiliki sekitar nol pengalaman dengan Ruby.
Steven Rumbalski
2

Perl 44

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

Eksekusi:

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

K, 18

{x@&x in&~1=#:'=x}
tmartin
sumber
Anda dapat menyimpan byte menggunakan 1<#bukan~1=#
J. Sendra
2

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

Saya tidak berharap itu terlalu pendek.

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(): simpan input sebagai string ( input()= eval(raw_input()))
(Python 3.0: input()telah diubah menjadi raw_input())

filter(lambda x:a.count(x)>1,a): Saring melalui semua karakter di dalamnya ajika ditemukan alebih dari satu kali ( a.count(x)>1).

beary605
sumber
Jika Anda menggunakan python 3 sebagai gantinya, Anda dapat menggunakan input()daripada raw_input(). Meskipun Anda harus menambahkan satu karakter untuk braket penutup, karena printini adalah fungsi dalam python 3.
Strigoides
@Strigoides: Saya telah menambahkan potongan kode Python 3 untuk jawaban saya.
beary605
Filter Python 3 mengembalikan iterator ... Anda harus melakukannya''.join(...)
JBernardo
@JBernardo: :( Dang. Terima kasih sudah memberi tahu saya. Seperti yang Anda lihat, saya tidak menggunakan 3.0.
beary605
2

sed dan coreutils (128)

Memang ini bukan bagian dari daftar TIOBE, tapi ini menyenangkan (-:

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

Versi de-golf:

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)

Penjelasan

Sed pertama mengkonversi input menjadi satu karakter per baris. Sed kedua menemukan karakter yang hanya muncul sekali. Sed ketiga menulis skrip sed yang menghapus karakter unik. Sed terakhir mengeksekusi skrip yang dihasilkan.

Thor
sumber
2

Brachylog (v2), 8 byte

⊇.oḅlⁿ1∧

Cobalah online!

Pengiriman fungsi. Secara teknis tidak bersaing karena pertanyaannya memiliki batasan pada bahasa apa yang diizinkan untuk bersaing (namun, beberapa jawaban lain telah mengabaikan batasan tersebut).

Penjelasan

⊇.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.
ais523
sumber
Mengapa Anda CW semua solusi Anda?
Shaggy
1
@Shaggy: a) karena saya baik-baik saja dengan orang lain yang mengeditnya, b) untuk menghindari mendapatkan reputasi jika mereka di-upgrade. Secara umum saya pikir gamififcation dari Stack Exchange sangat merugikan situs - kadang-kadang ada korelasi negatif antara tindakan yang dapat Anda lakukan untuk meningkatkan rep dan tindakan yang dapat Anda lakukan untuk benar-benar meningkatkan situs. Selain itu, berada di reputasi dengan reputasi tinggi menyebalkan; situs terus mengomel Anda untuk melakukan tugas-tugas admin, dan semua yang Anda lakukan adalah instrumen tumpul (misalnya ketika Anda berada di rep rendah Anda dapat menyarankan edit, di rep tinggi itu hanya dipaksa melalui).
ais523
2

Japt , 6 5 byte

ÆèX É

-1 byte terima kasih kepada @Oliver

Cobalah online!

Quintec
sumber
2
Selamat Datang di Japt! Sebenarnya ada jalan pintas untuk o@:Æ
Oliver
@Oliver Pintasan lain yang saya lewatkan, keren, terima kasih :)
Quintec
@Oliver, pertanyaan yang lebih baik adalah bagaimana sih aku melewatkannya ?! : \
Shaggy
1

Python (56)

Berikut ini alternatif (beberapa karakter lagi) dengan Python:

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

Jika Anda menerima output sebagai daftar (mis. ['l', 'l', 'o', 'o', 'l']), Maka kami dapat mengubahnya menjadi 49 karakter:

a=raw_input();print[c for c in a if a.count(c)>1]
arshajii
sumber
Hei, >1itu ide yang bagus! Bolehkah saya memasukkan itu ke dalam solusi saya?
beary605
@ beary605 Tentu tidak ada masalah sama sekali - cara mudah untuk memotong karakter: D
arshajii
1

Mathematica 72 63

Oke, Mathematica bukan di antara 20 bahasa teratas, tetapi saya memutuskan untuk tetap bergabung dengan pesta itu.

x adalah string input.

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

Perl (55)

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

Baca dari stdin.

QuasarDonkey
sumber
1

C # - 77 karakter

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

Jika Anda menerima output sebagai larik, maka akan berkurang hingga 65 karakter:

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

Ocaml, 139 133

Menggunakan ExtString.String ExtLib

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

Versi non-golf

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

Fungsi gmengembalikan jumlah kemunculan c dalam string s. Fungsi fmenggantikan semua karakter baik oleh string kosong atau string yang berisi karakter tergantung pada jumlah kejadian. Sunting: Saya mempersingkat kode dengan 6 karakter dengan menyalahgunakan representasi internal bools :-)

Oh, dan ocaml adalah 0 pada indeks TIOBE ;-)

ReyCharles
sumber
f *** indeks TIOBE.
ixtmixilix
Saya setuju. Juga, terima kasih atas upvotenya. Sekarang saya bisa berkomentar :-)
ReyCharles
1

PHP - 70

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

dengan asumsi $ s = 'helloworld'.

hengky mulyono
sumber
1

Java 8, 90 byte

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

Penjelasan:

Cobalah online.

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
Kevin Cruijssen
sumber
1

PowerShell , 59 byte

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

Cobalah online!

Kurang golf:

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

Catatan: $repeatedCharsadalah array. Secara default, Powershell bergabung dengan elemen array dengan spasi sambil mengubah array menjadi string. Jadi, regexp berisi spasi (Dalam contoh ini, [^l o]). Spasi tidak mempengaruhi hasil karena string input hanya berisi huruf.

mazzy
sumber
1

APL (Dyalog Extended) , 8 byte SBCS

Fungsi awalan diam-diam anonim.

∊⊢⊆⍨1<⍧⍨

Cobalah online!

⍧⍨ count-in selfie (hitung kejadian elemen argumen dalam argumen itu sendiri)

1< Topeng Boolean di mana seseorang kurang dari itu

⊢⊆⍨ mempartisi argumen dengan topeng itu (memulai partisi baru di 1s dan menghapus 0s)

ϵ daftar (ratakan)

Adm
sumber
1

JavaScript, 45 byte

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

R , 70 byte

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

Cobalah online!

Upaya yang buruk, bahkan dari 20 bahasa teratas TIOBE. Saya tahu sesuatu dapat dilakukan tentang babak kedua, tetapi pada saat ini, golf apa pun lolos dari saya.

Sumner18
sumber
1

JavaScript (Node.js) , 82 byte

p=>[...p].map((v,i,a)=>a.filter(f=>f==v).length).reduce((a,c,i)=>c>1?a+=p[i]:a,[])

Cobalah online!

Kamil Naja
sumber
1
Anda bisa menggunakan .join``bukan .join("").
rekursif
0

PHP - 137

Kode

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

Kode Normal

$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;
Wahyu Kristianto
sumber
0

PHP - 83 78

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

Versi yang ditingkatkan:

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

Tentu saja ini perlu pemberitahuan untuk dimatikan

Sunting: Peningkatan yang diilhami oleh @hengky mulyono

Saya sangat buruk di codegolf :)

milo5b
sumber
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;

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;
}
zelcon
sumber