Bir dizeden tekrarlanan kelimeleri kaldırma


12

Girilen bir cümledeki tüm tekrar eden kelimeleri kaldırın.

Girdi böyle bir şey olacaktır cat dog cat dog bird dog Snake snake Snakeve çıktı da olmalıdır cat dog bird Snake snake. Her zaman kelimeleri ayıran tek bir boşluk olacaktır.

Çıktı sırası, giriş ile aynı olmalıdır. (Örneğe bakın)

Noktalama işaretlerini kullanmanıza gerek yoktur, ancak büyük harf kullanımı gerekir.


13
En az birkaç gün cevap kabul etmenizi bekliyorum. Daha kısa bir çözüm gelebilir.
Alex

1
Uniqchars için benzer çözümler bekliyoruz , ancak bu kopyaları kaldıran yerleşik yasaklamıyor.
xnor

2
Örneği görünce, özel büyük harf kullanımı yoktur: Snakeve snakesadece farklı muamele
görürler

@AlexA .: Aslında zaten bir tane var. codegolf.stackexchange.com/questions/62044/…
ev3commander

Yanıtlar:


1

gs2 , 3 bayt

,É-

CP437 ile kodlanmıştır .

STDIN, program başlangıcında itilir. ,onu boşluklara böler. Éolduğu uniqçiftleri filtreler olan. -boşluklarla birleşir.


10

CJam, 7 karakter

qS/_&S*

Muhtemelen çok daha kısa olabilir ... ama neredeyse hiç CJam kullanmadım. ^. ^

qgirdiyi okur S/, boşluklara ayırır, _&çoğaltır ve belirli bir AND (böylece yinelenenlerden kurtulmak) uygular ve S*uzaya yeniden birleşir.

Çevrimiçi tercüman bağlantısı


1
7'den nasıl daha kısa olabilirsiniz? lol
Cruncher

Bazıları yaptı.
Alien G

8

Haskell, 34 bayt

import Data.List
unwords.nub.words

Kullanım örneği: (unwords.nub.words) "cat dog cat dog bird dog Snake snake Snake"-> "cat dog bird Snake snake".


8

APL, 22 20 bayt

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

Bu, sağdaki bir dizeyi kabul eden ve bir dize döndüren adsız bir monadic işlevi oluşturur.

Açıklama:

               ' ',⍵}    ⍝ 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

Çevrimiçi deneyin

Dennis sayesinde 2 bayt tasarruf!


3
Ezoterik olmayan, golf dışı bir dil kullanan herhangi bir cevabı seviyorum.
Darth Egregious


7

JavaScript (ES6) 33

( bu cevaba bakınız )

Aşağıdaki snippet'i EcmaScript 6 uyumlu bir tarayıcıda çalıştırmayı test edin (Set, yayma operatörü, şablon dizeleri ve ok işlevlerini uygulama - Firefox kullanıyorum).

Not: Set'e dönüştürme işlemi tüm kopyaları bırakır ve Set orijinal sıralamayı korur.

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>


Vay vay vay ... Düşündüğüm herhangi bir çözümü% 25 veya daha fazla azaltma yeteneğiniz beni sürekli büyülüyor. +1
ETHproductions

1
Soruna baktım ve hemen Set'leri düşündüm ... sadece bunu zaten yapmış olduğunun farkına varmak için = P çok güzel!
Mwr247

orijinal siparişi nasıl koruyabilirim?
njzk2

@ njzk2 dilin geliştiricilerine sor. Bu olabilir be: bir dizi dahili olarak bir Array ve her takıldığı anda çiftleri reddetmek için bir kontrol yoktur. Yine de bir uygulama detayı
edc65

@ njzk2 nasıl bilmiyorum, bu gerçeğin dil tarafından belirtildiğini biliyorum: Set nesneleri değerler koleksiyonları, ekleme sırasında öğelerini yineleyebilirsiniz . Kümedeki bir değer yalnızca bir kez oluşabilir; Set koleksiyonunda benzersizdir. ( developer.mozilla.org/it/docs/Web/JavaScript/Reference/… )
edc65

6

TeaScript , 12 bayt

TeaScript golf için JavaScript'tir.

xs` `u()j` `

Bu oldukça kısa. Her alana ayrılır, kopyaları filtreler, sonra yeniden birleşir.

Çevrimiçi deneyin


Öyle mi tee-a scriptyoksa tee script?

@MathiasFoster "tee-script" olurdu
Downgoat

TeaScript'te değişken adları için ayrılmış harfler var mı? Çoğu yerleşik özellikler için kısayollar gibi görünüyor.
intrepidcoder

@intrepidcoder evet bunların tümü: cdfghijklmnopstuvwdeğişkenler için ayrılmıştır, hepsi 0 bolarak önceden başlatılmıştır. değişken adı için de ayrılmıştır, boş bir dizeye önceden başlatılmıştır
Downgoat

6

PowerShell, 15 Bayt

$args|select -u

Whoa, PowerShell'in biraz rekabetçi olduğu gerçek bir giriş mi? Bu mümkün değil!

Giriş argümanlar, boruların olarak dizeyi Alır Select-Objectile -Uniquebayrak. İstendiği gibi düzeni ve büyük harf kullanımını koruyarak bir dizi dizge verir.

Kullanımı:

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

Bu, girişin komut satırı bağımsız değişkenleri olabileceğini varsayarak çok "ucuz" ise, 24 21 Bayt'ta (blabb sayesinde bazı baytlar kaydedildi ) aşağıdakileri yapın . İlginç bir şekilde, giriş dizgisi tırnak işaretleri veya bağımsız değişkenler olarak ayrılırsa, bu şekilde tekli operatörün kullanılması da varsayılan olarak boşluklara göre yapılır. Bonus.-split

-split$args|select -u

Kodun kolayca bölünmüş girdi ile ortamın kaşık besleme davranışına dayanarak…?
manatwork

@manatwork İlk kullanım çok "ucuz" olarak kabul edilirse bir açıklama ekledim - girişin tam olarak nasıl belirtildiği net olmadığından, OP'ye bırakacağız.
AdmBorkBork

Ve şimdi PowerShell'in kendi özelliklerinin ne kadar verimli olduğu açık. Bu 24 gerçekten bir oylamayı hak ediyor.
manatwork

@ timmyD uncheaty 3 bayt kesebilir ?? sürümü kullanarak unary split ve gerek "" '' için komut satırında da argümanlar: \> ls -l split.ps1 & type split.ps1 & echo. & powershell -nologo -f split.ps1 kedi köpek kedi köpek kuş köpek Snake snake Snake -rw-rw-rw- 1 Admin 0 21 2015-11-02 19:06 split.ps1 -split $ args | select -u kedi köpek kuş Yılan yılan
blabb 2:15

4

Julia, 29 bayt

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

Bu, dizeyi boşluklardaki bir vektöre ayıran, yalnızca benzersiz öğeleri (koruma sırası) tutan ve diziyi boşluklu bir dizeye ekleyen adsız bir işlev oluşturur.


4

R, 22 bayt

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

Bu, STDIN'den bir dize okur ve bunu kullanarak boşluklardaki bir vektöre böler scan(,""), yalnızca benzersiz öğeleri seçer, sonra bunları bir dizeye birleştirir ve kullanarak STDOUT'a yazdırır cat.


4

Retina , 22 bayt

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

Dosyayı sondaki satır beslemesi ile kaydedin ve -sbayrakla çalıştırın .

Bu, tek bir sözcükle eşleşmesi açısından oldukça basittir ve lookbehind, aynı sözcüğün daha önce dizede görünüp görünmediğini kontrol eder. Sondaki satır besleme, Retina'nın boş bir değiştirme dizesiyle Değiştirme modunda çalışmasına neden olarak tüm eşleşmeleri kaldırır.


4

Mathematica, 43 39 bayt

StringRiffle@*Keys@*Counts@*StringSplit

Kullanmak için şeref StringRiffle[].
Michael Stern

Keys@Countsyerine kullanabilirsinizDeleteDuplicates
branislav

@branislav Keys@CountsSiparişi koruyor mu ?
LegionMammal978

@ LegionMammal978 Counts[list], anahtarları ilk olarak liste öğeleriyle aynı sırada olan bir ilişkilendirme sağlar.
branislav


3

C ++ 11,292 bayt

#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;}

Golf dillerine kıyasla çok fazla C ++ yanıtı görmüyorum, neden olmasın. Bunun C ++ 11 özelliklerini kullandığını ve bu nedenle derleyiciniz yeterince eski yaşlarda yeterince sıkışmışsa , C ++ 11 standardını kullanması için özel bir derleme anahtarını geçmeniz gerekebilir. İçin g++, bu oluyor -std=c++11(sadece sürüm <5.2 için gerekli). Çevrimiçi deneyin


Bayt sayısını diğer dillerle karşılaştırırsanız, neden kimsenin C ++ kullanmadığını göreceksiniz.
CroCo

3
@CroCo Bu sitenin amacının her dilde en kısa çözümü bulmak olduğunu fark ederseniz, neden bu cevabı gönderdiğimi göreceksiniz.
Mego

üzgünüm farkında değilim.
CroCo

1
Neden a kullanmıyorsunuz set? Tasarım ile çoğaltılmasına izin vermez. Sadece içine it.
edmz

1
@siyah A'nın setöğelerin eklendikleri sırayla olması garanti edilmez.
Mego

3

K5, 9 bayt

" "/?" "\

Bilginize, bu bir işlev.

açıklama

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

2

Matlab: 18 Bayt

unique(d,'stable')

nerede dolduğunu d = {'cat','dog','cat','dog','bird','dog','Snake','snake','Snake'}.

Sonuç 'cat' 'dog' 'bird' 'Snake' 'snake'


4
Programlama Bulmacaları ve Kod Golf hoş geldiniz! Buradaki gönderimlerin STDIN'den okuyan ve STDOUT'a yazılan tam programlar veya giriş ve dönüş çıktısını kabul eden işlevler olması gerekir. Haliyle, bu sadece bir parçacıktır; değişkenin dzaten atanmış olduğunu varsayar . Bunu @(d)unique(d,'stable')4 baytlık maliyetle bir işlev tanıtıcısı: kullanarak düzeltebilirsiniz .
Alex

2

Python 3, 55

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

Yeesh, bu uzun. Ne yazık ki, Python's setelementlerin sırasını tutmaz, bu yüzden işi kendimiz yapmak zorundayız. Henüz girilmemiş löğelerin bir listesini tutarak giriş sözcüklerini yineliyoruz l. Ardından, lboşlukla ayrılmış içerikleri yazdırıyoruz .

lBazı kelimelerin diğer kelimelerin alt dizeleri olması durumunda dizesinin sürümü çalışmaz.


2

C #, 38 bayt

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

2
Girdinin zaten doldurulduğunu varsayabileceğinizden emin değilim s, bence bunu bir argüman olarak almalısınız.
Jacob

3
PPCG'ye Hoşgeldiniz! Lütfen varsayılan cevap biçimlerimize bir göz atın . Yanıtlar ya tam programlar ya da işlevler olmalıdır. Adsız işlevler (lambda değişmez değerleri gibi) iyidir, ancak kodun bazı değişkenlerde / yığında vb. Var olmasını bekleyen veya bir REPL ortamı gerektiren parçacıklar, OP açıkça izin vermedikçe genellikle izin verilmez.
Martin Ender

2

Perl 6, 14 bayt

Bütün bir program olarak yazmanın tek yolu 21 bayt uzunluğundadır.

say $*IN.words.unique # 21 bytes

Lambda ifadesi olarak en kısa olanı 14 bayttır

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

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

Çıktı bir Liste olsa da, onu bir dizgi bağlama bağlamına koyarsanız, öğeler arasında boşluk bırakacaktır. Bir dize döndürmek için bir gereksinim olsaydı, sadece ~önüne bir ekleyebilirsiniz ~*.words.unique.


Parçacıklara izin verildiyse, simgesini kaldırarak 13 bayta kısaltabilirsiniz *.

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

say .words.unique

1

Python 3, 87 80 bayt

tam program sürümü daha kısa çıkıyor

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

Regex olmadan yaptım, mutluyum

Çevrimiçi deneyin


1

Lua, 94 bayt

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

Anonim bir kullanıcı yerine önerilen ... return""else l[b]=true end end...ile ...return""end l[b]=""end....
Jonathan Frech

1

awk, 25

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

Çıktı:

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

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

// JS için çok uzun :(


6 bayt kaydetmesi gereken JS (diğer adıyla ECMAScript) 6 ok işlevini kullanmayı deneyin . Ayrıca, bunu CoffeeScript'e taşımanın en az 30 bayt tasarruf edeceğini görebiliyorum.
kirbyfan64sos

Bu cevap yerel JavaScript (ECMA5) dilinde, es6 için edc65 bir tane var.
Jacob

1

Hassium , 91 bayt

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

Çevrimiçi çalışın ve burada genişletin


1

PHP 64 59 bayt

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

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

Teşekkürler! İyi öneriler. Görünüşe göre splitgörünüşte, ama kod çözme için önemli değil sanırım.
Jeroen

1

AppleScript, 162 bayt

İlginçtir ki, bu tekrar etmeyen karakterlerle neredeyse aynıdır.

x değerini ("" varsayılan yanıt "" iletişim kutusunu görüntüle) döndürülen metni döndürür
o değerini "" olarak ayarla
x içinde i ile tekrar et
dava dikkate alınarak
eğer ben o'da değilse o'yu o & i & "" olarak ayarlayın
son
son
Ö

Aslında bundan önce düşünülen anahtar kelimeyi bilmiyordum. Daha fazla bilirsen...


1

Burlesque, 6 bayt

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

Oldukça basit: bölünmüş kelimeler, nub (nub = yinelenenleri kaldır), kelimelere geri dönüş.


1

Gema, 21 karakter

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

( Eşsiz karakter çözümüne çok benzer , çünkü Gema'da diziler yoktur, bu nedenle yerleşik benzersiz işlevlere izin vermek bize çok yardımcı olmaz.)

Örnek çalışma:

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 bayt

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

EDIT : kullanarak toSetsipariş korumak olmayabilir, bu yüzden şimdi sadece 3 bayt maliyeti bu farklı // kullanıyorum :(


0

PHP, 37 Bayt

Varsayım $s, giriş dizesidir.

print_r(array_flip(explode(' ',$s)));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.