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

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.


+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/:;{;\-,;,(<},

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.


5

GolfScript (14 karakter)

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

Demo online

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


4

Ruby 46 40 36

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

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


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


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.


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.

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!


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]

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], #] &]

1

Perl (55)

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

Baca dari stdin.


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();

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


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


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

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.


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)


1

JavaScript, 45 byte

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

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.




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;

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


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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.