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.

Alien G
sumber
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.

Lynn
sumber
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

Gagang pintu
sumber
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".

nimi
sumber
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!

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

Ruby, 21 karakter

->s{s.split.uniq*' '}
Gagang pintu
sumber
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>

edc65
sumber
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

Downgoat
sumber
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
AdmBorkBork
sumber
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.

Alex A.
sumber
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.

Alex A.
sumber
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.

Martin Ender
sumber
4

Mathematica, 43 39 byte

StringRiffle@*Keys@*Counts@*StringSplit
LegionMammal978
sumber
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

Pyth - 9 byte

Nah inilah mengapa kita semua menunggu Pyth5, bisa jadi 5 byte.

jdoxzN{cz

Cobalah online di sini .

Maltysen
sumber
Mengapa Pyth5 tidak valid? Tampaknya diimplementasikan .
lirtosiast
@ ThomasKwa saya tidak berpikir itu selesai. Belum ada rilis versi.
Alex A.
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

Mego
sumber
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
kirbyfan64sos
sumber
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'

CroCo
sumber
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.

Tidak
sumber
2

C #, 38 byte

String.Join(" ",s.Split().Distinct());
Patzer
sumber
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
Brad Gilbert b2gills
sumber
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

Mego
sumber
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
Digital Veer
sumber
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 $ 
$ 
Trauma Digital
sumber
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 :(

Yakub
sumber
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

Yakub Misirian
sumber
1

PHP 64 59 byte

function r($i){echo join(" ",array_unique(split(" ",$i)));}
Jeroen
sumber
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 ...

Addison Crump
sumber
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.

mroman
sumber
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 
manatwork
sumber
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 :(

Yakub
sumber
0

PHP, 37 Bytes

Dengan asumsi $sadalah string input.

print_r(array_flip(explode(' ',$s)));
MonkeyZeus
sumber