Hapus kata yang diulang dari string


12

Hapus semua kata berulang dari kalimat yang dimasukkan.

Input akan berupa sesuatu cat dog cat dog bird dog Snake snake Snakedan output harus cat dog bird Snake snake. Akan selalu ada satu ruang yang memisahkan kata-kata.

Urutan output harus sama dengan input. (Lihat contoh)

Anda tidak perlu menangani tanda baca tetapi penanganan huruf kapital diperlukan.


13
Saya sarankan menunggu untuk menerima jawaban setidaknya selama beberapa hari. Solusi yang lebih pendek mungkin masih datang.
Alex A.

1
Saya mengharapkan solusi yang mirip dengan uniqchars , kecuali bahwa ini tidak melarang built-in yang menghapus duplikat.
xnor

2
Melihat contoh, tidak ada penanganan huruf kapital khusus: Snakedan snakediperlakukan hanya sebagai berbeda
edc65

@AlexA .: Faktanya, sudah ada satu. codegolf.stackexchange.com/questions/62044/…
ev3commander

Jawaban:


1

gs2 , 3 byte

,É-

Dikodekan dalam CP437 .

STDIN didorong pada awal program. ,membaginya di atas spasi. Éadalah uniq, yang memfilter duplikat. -bergabung dengan spasi.


10

CJam, 7 karakter

qS/_&S*

Mungkin bisa jauh lebih pendek ... tapi apa pun yang saya hampir tidak pernah menggunakan CJam. ^. ^

qmembaca input, S/membagi pada spasi, _&duplikat dan menerapkan setwise AND (karena itu menghilangkan duplikat), dan S*bergabung kembali pada spasi.

Tautan penerjemah online


1
Bagaimana Anda bisa mendapatkan yang lebih pendek dari 7? lol
Cruncher

Seseorang baru saja melakukannya.
Alien G

8

Haskell, 34 byte

import Data.List
unwords.nub.words

Contoh penggunaan: (unwords.nub.words) "cat dog cat dog bird dog Snake snake Snake"-> "cat dog bird Snake snake".


8

APL, 22 20 byte

{1↓∊∪(∊∘' '⊂⊢)' ',⍵}

Ini menciptakan fungsi monadik tanpa nama yang menerima string di sebelah kanan dan mengembalikan string.

Penjelasan:

               ' ',⍵}    ⍝ Prepend a space to the input string
     (∊∘' '⊂⊢)          ⍝ Split the string on spaces using a fork
    ∪                    ⍝ Select the unique elements
{1↓∊                     ⍝ Join into a string and drop the leading space

Cobalah online

Disimpan 2 byte berkat Dennis!


3
Saya suka jawaban apa pun yang menggunakan bahasa non-esoterik, non-golf.
Darth Egregious


7

JavaScript (ES6) 33

(lihat jawaban ini )

Tes menjalankan cuplikan di bawah ini di peramban yang mendukung EcmaScript 6 (mengimplementasikan Set, spread operator, string templat dan fungsi panah - saya menggunakan Firefox).

Catatan: konversi ke Tetapkan jatuhkan semua duplikat dan Tetapkan mempertahankan urutan asli.

f=s=>[...Set(s.split` `)].join` `

function test() { O.innerHTML=f(I.value) }

test()
#I { width: 70% }
<input id=I value="cat dog cat dog bird dog Snake snake Snake"/><button onclick="test()">-></button>
<pre id=O></pre>


Wow wow wow ... Saya terus kagum dengan kemampuan Anda untuk memotong solusi apa pun yang saya pikirkan hingga 25% atau lebih. +1
ETHproduk

1
Melihat masalah dan langsung memikirkan Sets ... hanya untuk menyadari bahwa Anda sudah melakukannya = P sangat bagus!
Mwr247

bagaimana cara mengatur mempertahankan pemesanan asli?
njzk2

@ njzk2 tanyakan pada pengembang bahasa. Itu bisa berupa: satu set internal Array, dan pada setiap penyisipan ada cek untuk menolak duplikat. Ini detail implementasi
edc65

@ njzk2 sementara saya tidak tahu caranya , saya tahu bahwa fakta ini ditentukan oleh bahasa: Set objek adalah kumpulan nilai, Anda dapat mengulangi elemen-elemennya dalam urutan penyisipan . Nilai dalam Set hanya dapat terjadi sekali; itu unik dalam koleksi Set. ( developer.mozilla.org/it/docs/Web/JavaScript/Reference/… )
edc65

6

TeaScript , 12 byte

TeaScript adalah JavaScript untuk bermain golf.

xs` `u()j` `

Ini sangat singkat. Itu terbagi pada setiap ruang, menyaring duplikat, lalu bergabung kembali.

Cobalah online


Apakah itu tee-a scriptatau tee script?

@MathiasFoster itu akan menjadi "tee-script"
Downgoat

Apakah TeaScript memiliki huruf yang dicadangkan untuk nama variabel? Sebagian besar dari mereka tampaknya menjadi singkatan untuk properti bawaan.
intrepidcoder

@intrepidcoder ya semua ini: cdfghijklmnopstuvwdicadangkan untuk variabel, mereka semua diinisialisasi ke 0. bjuga dicadangkan untuk nama variabel, ini diinisialisasi ke string kosong
Downgoat

6

PowerShell, 15 Bytes

$args|select -u

Whoa, entri aktual di mana PowerShell agak kompetitif? Itu tidak mungkin!

Mengambil string sebagai argumen input, pipa ke Select-Objectdengan -Uniquebendera. Meludahkan serangkaian string, menjaga ketertiban, dan penggunaan huruf besar seperti yang diminta.

Pemakaian:

PS C:\Tools\Scripts\golfing> .\remove-repeated-words-from-string.ps1 cat dog cat dog bird dog Snake snake Snake
cat
dog
bird
Snake
snake

Jika ini terlalu "cheaty" dalam asumsi input dapat sebagai argumen baris perintah, kemudian pergi untuk yang berikut ini, di 24 21 Bytes (disimpan beberapa byte berkat blabb ) . Menariknya, menggunakan operator unary dalam arah ini juga berfungsi jika string input dibatasi dengan tanda kutip atau sebagai argumen individual, karena defaultnya -splitadalah spasi. Bonus.

-split$args|select -u

Mengandalkan perilaku lingkungan menyuapi kode dengan input yang siap dibagi ...?
manatwork

@manatwork Saya telah menambahkan klarifikasi jika penggunaan pertama dianggap terlalu "curang" - karena tidak jelas persis bagaimana input ditentukan, kami akan menyerahkannya kepada OP.
AdmBorkBork

Dan sekarang jelas bagaimana efisiensi adalah fitur PowerShell sendiri. 24 itu benar-benar layak mendapat dukungan.
manatwork

@timmyD Anda dapat memotong 3 byte ke uncheaty ?? versi dengan menggunakan unary split dan tidak perlu untuk "" 'di baris perintah juga: \> ls-l split.ps1 & ketik split.ps1 & echo. & powershell -nologo -f split.ps1 kucing anjing kucing anjing burung anjing Snake snake Snake -rw-rw-rw- 1 Admin 0 21 2015-11-02 19:06 split.ps1 -split $ args | select -u cat dog bird Snake snake
blabb

4

Julia, 29 byte

s->join(unique(split(s))," ")

Ini menciptakan fungsi tanpa nama yang memisahkan string menjadi vektor pada spasi, hanya menyimpan elemen unik (mempertahankan urutan), dan menggabungkan array kembali ke string dengan spasi.


4

R, 22 byte

cat(unique(scan(,"")))

Ini membaca string dari STDIN dan membaginya menjadi vektor pada spasi menggunakan scan(,""), hanya memilih elemen unik, kemudian menggabungkannya menjadi string dan mencetaknya ke STDOUT menggunakan cat.


4

Retina , 22 byte

 (\w+)\b(?<=\b\1\b.+)

Simpan file dengan trafeed linefeed dan jalankan dengan -sflag.

Ini cukup lurus ke depan karena cocok dengan satu kata, dan lihat di belakang memeriksa apakah kata yang sama telah muncul dalam string sebelumnya. Linefeed trailing menyebabkan Retina bekerja dalam mode Ganti dengan string pengganti kosong, menghapus semua kecocokan.


4

Mathematica, 43 39 byte

StringRiffle@*Keys@*Counts@*StringSplit

Kudos untuk menggunakan StringRiffle[].
Michael Stern

bisa menggunakan Keys@CountsbukannyaDeleteDuplicates
branislav

@ branislav Apakah Keys@Countsmempertahankan pesanan?
LegionMammal978

@ LegionMammal978 Counts[list]memberikan asosiasi yang kuncinya berada dalam urutan yang sama seperti yang pertama kali terjadi sebagai elemen daftar.
branislav


3

C ++ 11, 291 byte

#include<iostream>
#include<string>
#include<list>
#include<sstream>
#include<algorithm>
using namespace std;main(){string s;getline(cin,s);list<string>m;stringstream b(s);while(getline(b,s,' '))if(find(m.begin(),m.end(),s)==m.end())m.push_back(s);for(auto a:m)cout<<a<<' ';cout<<endl;}

Saya tidak melihat banyak jawaban C ++ dibandingkan dengan bahasa golf, jadi mengapa tidak. Perhatikan bahwa ini menggunakan fitur C ++ 11, dan jika kompiler Anda terjebak dalam zaman yang cukup tua, Anda mungkin perlu melewati sakelar kompilasi khusus untuk membuatnya menggunakan standar C ++ 11. Sebab g++, itu -std=c++11(hanya diperlukan untuk versi <5.2). Cobalah online


Jika Anda membandingkan jumlah byte dengan bahasa lain, Anda akan melihat mengapa tidak ada yang menggunakan C ++.
CroCo

3
@CroCo Jika Anda menyadari inti dari situs ini adalah untuk menemukan solusi terpendek dalam setiap bahasa, Anda akan melihat mengapa saya memposting jawaban ini.
Mego

maaf saya tidak menyadarinya.
CroCo

1
Mengapa tidak menggunakan a set? Itu tidak memungkinkan duplikat oleh desain. Dorong saja ke dalamnya.
edmz

1
@black A settidak dijamin memiliki barang dalam urutan yang sama seperti saat ditambahkan
Mego

3

K5, 9 byte

" "/?" "\

FYI, ini adalah fungsi.

Penjelasan

     " "\    Split the input on spaces
    ?        Find all the unique elements
" "/         Join them back together

2

Matlab: 18 Bytes

unique(d,'stable')

di mana dadalah d = {'cat','dog','cat','dog','bird','dog','Snake','snake','Snake'}.

Hasilnya adalah 'cat' 'dog' 'bird' 'Snake' 'snake'


4
Selamat Datang di Programming Puzzles dan Code Golf! Kiriman di sini harus berupa program lengkap yang membaca dari STDIN dan menulis ke STDOUT, atau fungsi yang menerima input dan mengembalikan output. Seperti berdiri, ini hanyalah cuplikan; itu mengasumsikan variabel dsudah ditugaskan. Anda dapat memperbaikinya dengan menggunakan gagang fungsi:, @(d)unique(d,'stable')dengan biaya 4 byte.
Alex A.

2

Python 3, 55

l=[]
for x in input().split():l+=[x][x in l:]
print(*l)

Ya, ini panjang. Sayangnya, Python settidak mematuhi urutan unsur-unsurnya, jadi kita harus mengerjakannya sendiri. Kami beralih melalui kata-kata input, menyimpan daftar lelemen yang belum masuk l. Kemudian, kami mencetak isi yang ldipisahkan ruang.

Versi string ltidak akan berfungsi jika beberapa kata adalah substring dari kata lain.


2

C #, 38 byte

String.Join(" ",s.Split().Distinct());

2
Saya tidak yakin Anda dapat menganggap input sudah diisi s, saya pikir Anda harus mendapatkannya sebagai argumen.
Jacob

3
Selamat datang di PPCG! Silakan lihat format jawaban default kami . Jawaban harus berupa program atau fungsi lengkap. Fungsi yang tidak disebutkan namanya (seperti lambda literal) baik-baik saja, tetapi potongan yang mengharapkan kode sudah ada di beberapa variabel / pada stack dll. Atau memerlukan lingkungan REPL umumnya tidak diizinkan kecuali OP secara eksplisit mengizinkannya.
Martin Ender

2

Perl 6, 14 byte

Secara keseluruhan, satu-satunya cara Anda menulisnya adalah 21 byte

say $*IN.words.unique # 21 bytes

Sebagai ungkapan lambda, yang terpendek adalah 14 byte

*.words.unique # 14 bytes
say ( *.words.unique ).('cat dog cat dog bird dog Snake snake Snake')

my &foo = *.words.unique;
say foo $*IN;

Sementara output adalah Daftar, jika Anda memasukkannya ke dalam konteks pengerasan, ia akan menempatkan spasi di antara elemen-elemen. Jika itu persyaratan untuk mengembalikan string, Anda bisa menambahkan a ~ke depan ~*.words.unique.


Jika cuplikan diizinkan, Anda dapat mempersingkatnya menjadi 13 byte dengan menghapus *.

$_ = 'cat dog cat dog bird dog Snake snake Snake';

say .words.unique

1

Python 3, 87 80 byte

ternyata versi program lengkap lebih pendek

s=input().split(' ')
print(' '.join(e for i,e in enumerate(s)if e not in s[:i]))

Melakukannya tanpa regex, saya senang

Cobalah online


1

Lua, 94 byte

function c(a)l={}return a:gsub("%S+",function(b)if l[b]then return""else l[b]=true end end)end

Seorang pengguna anonim disarankan untuk mengganti ... return""else l[b]=true end end...dengan ...return""end l[b]=""end....
Jonathan Frech

1

awk, 25

BEGIN{RS=ORS=" "}!c[$0]++

Keluaran:

$ printf "cat dog cat dog bird dog Snake snake Snake" | awk 'BEGIN{RS=ORS=" "}!c[$0]++'
cat dog bird Snake snake $ 
$ 

1

JavaScript, 106 102 100 byte

function(s){o={};s.split(' ').map(function(w){o[w]=1});a=[];for(w in o)a.push(w);return a.join(' ')}

// terlalu lama untuk JS :(


Coba gunakan fungsi panah 6 JS (alias ECMAScript) , yang seharusnya menghemat 6 byte. Juga, saya sudah bisa melihat porting ini ke CoffeeScript akan menghemat setidaknya 30 byte.
kirbyfan64sos

Jawaban ini ada dalam JavaScript asli (ECMA5), ada edc65 untuk es6.
Yakub

1

Hassium , 91 byte

func main(){d=[]foreach(w in input().split(' '))if(!(d.contains(w))){d.add(w)print(w+" ")}}

Jalankan online dan lihat diperluas di sini


1

PHP 64 59 byte

function r($i){echo join(" ",array_unique(split(" ",$i)));}

explode()split(), implode()join()?
manatwork

Terima kasih! Saran yang bagus Tampaknya splitsedang diasingkan, tapi coba tebak itu tidak masalah untuk codegolving.
Jeroen

1

AppleScript, 162 byte

Menariknya, ini hampir identik dengan karakter karakter yang tidak berulang.

atur x ke (tampilkan dialog "" jawaban default "") kata-kata yang dikembalikan
setel ke ""
ulangi dengan i in x
mempertimbangkan kasus
jika tidak i ada di o maka atur o ke o & i & ""
akhir
akhir
Hai

Saya sebenarnya tidak tahu kata kunci yang mempertimbangkan sebelum ini. semakin banyak Anda tahu ...


1

Burlesque, 6 byte

blsq ) "cat dog cat dog bird dog Snake snake Snake"wdNBwD
cat dog bird Snake snake

Agak sederhana: pisahkan kata-kata, nub (nub = hapus duplikat), konversikan kembali ke kata-kata.


1

Gema, 21 karakter

*\S=${$0;$0}@set{$0;}

(Sangat mirip dengan solusi karakter unik , karena tidak ada array di Gema, sehingga memungkinkan fungsi unik bawaan tidak banyak membantu kita.)

Contoh dijalankan:

bash-4.3$ gema '*\S=${$0;$0}@set{$0;}' <<< 'cat dog cat dog bird dog Snake snake Snake'
cat dog bird Snake snake 

1

Scala, 44 47 byte

(s:String)=>s.split(" ").distinct.mkString(" ")

EDIT : menggunakan toSetmungkin tidak mempertahankan pesanan, jadi saya sekarang menggunakan berbeda // yang hanya menghabiskan 3 byte :(


0

PHP, 37 Bytes

Dengan asumsi $sadalah string input.

print_r(array_flip(explode(' ',$s)));
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.