Usuń powtarzające się słowa z łańcucha

12

Usuń wszystkie powtarzające się słowa z wprowadzonego zdania.

Dane wejściowe będą podobne, cat dog cat dog bird dog Snake snake Snakea dane wyjściowe powinny cat dog bird Snake snake. Zawsze będzie pojedyncza spacja oddzielająca słowa.

Kolejność wyjściowa musi być taka sama jak wejściowa. (Patrz przykład)

Nie musisz obsługiwać znaków interpunkcyjnych, ale wymagana jest obsługa wielkich liter.

Alien G.
źródło
13
Zalecam czekanie na odpowiedź przez co najmniej kilka dni. Nadal może pojawić się krótsze rozwiązanie.
Alex A.
1
Oczekuję podobnych rozwiązań do uniqchars , z tym wyjątkiem, że nie zabrania to wbudowanych programów usuwających duplikaty.
xnor
2
Widząc na przykład, nie ma specjalnego traktowania literą: Snakei snakesą traktowane po prostu jako innego
edc65
@AlexA .: W rzeczywistości już istnieje. codegolf.stackexchange.com/questions/62044/…
ev3commander

Odpowiedzi:

1

gs2 , 3 bajty

,É-

Zakodowane w CP437 .

STDIN jest wypychany na początku programu. ,dzieli go na spacje. Éto uniq, który filtruje duplikaty. -łączy spacjami.

Lynn
źródło
10

CJam, 7 znaków

qS/_&S*

Prawdopodobnie może być znacznie krótszy ... ale cokolwiek prawie nigdy nie użyłem CJam. ^. ^

qodczytuje dane wejściowe, S/dzieli się na spacje, _&duplikuje i stosuje ustalone ORAZ (pozbywając się duplikatów) i S*ponownie łączy się w spację.

Link do tłumacza online

Klamka
źródło
1
Jak możesz stać się znacznie krótszy niż 7? lol
Cruncher
Ktoś właśnie to zrobił.
Alien G
8

Haskell, 34 bajty

import Data.List
unwords.nub.words

Przykład użycia: (unwords.nub.words) "cat dog cat dog bird dog Snake snake Snake"-> "cat dog bird Snake snake".

nimi
źródło
8

APL, 22 20 bajtów

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

Tworzy to nienazwaną funkcję monadyczną, która akceptuje ciąg po prawej stronie i zwraca ciąg.

Wyjaśnienie:

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

Wypróbuj online

Zaoszczędzono 2 bajty dzięki Dennisowi!

Alex A.
źródło
3
Uwielbiam każdą odpowiedź, która używa nie-ezoterycznego, nie golfowego języka.
Darth Egregious
7

Ruby, 21 znaków

->s{s.split.uniq*' '}
Klamka
źródło
7

JavaScript (ES6) 33

(zobacz tę odpowiedź )

Przetestuj poniższy fragment kodu w przeglądarce zgodnej z EcmaScript 6 (implementując operatora Set, spread, ciągi szablonów i funkcje strzałek - używam Firefox).

Uwaga: konwersja do Set upuszcza wszystkie duplikaty, a Set zachowuje oryginalne zamówienie.

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
źródło
Wow wow wow ... Ciągle jestem zdumiony twoją zdolnością do cięcia dowolnego rozwiązania, które wymyślę o 25% lub więcej. +1
ETHprodukcje
1
Spojrzałem na problem i od razu pomyślałem o Setach ... tylko po to, aby zdać sobie sprawę, że już to zrobiłeś = P bardzo fajnie!
Mwr247,
jak ustawić utrzymanie oryginalnego zamówienia?
njzk2
@ njzk2 zapytaj twórców języka. Może to być: zestaw jest wewnętrznie tablicą, a przy każdym wstawieniu jest sprawdzane, aby odrzucić duplikaty. W każdym razie jest to szczegół implementacji
edc65
@ njzk2, chociaż nie wiem jak , wiem, że ten fakt jest określony przez język: obiekty Set to zbiory wartości, możesz iterować jego elementy w kolejności wstawiania . Wartość w zestawie może wystąpić tylko raz; jest wyjątkowy w kolekcji zestawu. ( developer.mozilla.org/it/docs/Web/JavaScript/Reference/… )
edc65
6

TeaScript , 12 bajtów

TeaScript to JavaScript do gry w golfa.

xs` `u()j` `

To jest dość krótkie. Dzieli się na każdym miejscu, odfiltrowuje duplikaty, a następnie dołącza ponownie.

Wypróbuj online

Downgoat
źródło
Czy to tee-a scriptczy tee script?
@MathiasFoster będzie to „tee-script”
Downgoat,
Czy TeaScript ma litery zarezerwowane dla nazw zmiennych? Większość z nich wydaje się być skrótem dla wbudowanych właściwości.
intrepidcoder
@intrepidcoder tak wszystkie: cdfghijklmnopstuvwsą zarezerwowane dla zmiennych, wszystkie są wstępnie zainicjowane na 0. bjest również zarezerwowane dla nazwy zmiennej, jest wstępnie zainicjowane na pusty ciąg znaków
Downgoat
6

PowerShell, 15 bajtów

$args|select -u

Whoa, prawdziwy wpis, w którym PowerShell jest nieco konkurencyjny? To niemożliwe!

Przyjmuje ciąg jako argumenty wejściowe, do rur Select-Objectz -Uniqueflagą. Wydziela tablicę ciągów, zachowując porządek i wielkie litery zgodnie z żądaniem.

Stosowanie:

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

Jeśli jest to zbyt „oszukańcze”, zakładając, że dane wejściowe mogą być argumentami wiersza poleceń, przejdź do następujących, w 24 21 bajtach (zapisano niektóre bajty dzięki blabb ) . Co ciekawe, użycie jednoargumentowego operatora w tym kierunku działa również, jeśli ciąg wejściowy jest wyznaczony cudzysłowami lub jako pojedyncze argumenty, ponieważ domyślnie -splitsą to spacje. Premia.

-split$args|select -u
AdmBorkBork
źródło
Opierasz się na zachowaniu środowiska podczas karmienia łyżką kodu z łatwo dzielonym wejściem…?
manatwork
@manatwork Dodałem wyjaśnienie, jeśli pierwsze użycie jest uważane za zbyt „oszukiwane” - ponieważ nie jest jasne, w jaki sposób określono dane wejściowe, pozostawimy to OP.
AdmBorkBork
A teraz jest jasne, jak efektywne są własne funkcje PowerShell. To 24 naprawdę zasługuje na aprobatę.
manatwork
@ TimmyD można odciąć 3 bajty do niechlujny? wersja za pomocą unarnego podziału i nie ma potrzeby używania „” w wierszu poleceń, args: \> ls -l split.ps1 i wpisz split.ps1 & echo. & powershell -nologo -f split.ps1 kot pies kot pies ptak pies Snake snake Snake -rw-rw-rw- 1 Administrator 0 21 2015-11-02 19:06 split.ps1 -split $ args | select -u kot pies ptak Snake snake
blabb
4

Julia, 29 bajtów

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

Tworzy to nienazwaną funkcję, która dzieli ciąg na wektor na spacje, zachowuje tylko unikalne elementy (zachowując porządek) i ponownie łączy tablicę w ciąg ze spacjami.

Alex A.
źródło
4

R, 22 bajty

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

Odczytuje ciąg ze STDIN i dzieli go na wektor na spacje za pomocą scan(,""), wybiera tylko unikalne elementy, a następnie łączy je w ciąg i drukuje za pomocą STDOUT cat.

Alex A.
źródło
4

Siatkówka , 22 bajty

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

Zapisz plik z końcowym podawaniem linii i uruchom go z -sflagą.

Jest to dość proste, ponieważ pasuje do jednego słowa, a lookbehind sprawdza, czy to samo słowo pojawiło się wcześniej w ciągu. Końcowe podawanie linii powoduje, że siatkówka działa w trybie zamiany z pustym ciągiem zastępującym, usuwając wszystkie dopasowania.

Martin Ender
źródło
4

Mathematica, 43 39 bajtów

StringRiffle@*Keys@*Counts@*StringSplit
LegionMammal978
źródło
Wyrazy uznania za korzystanie StringRiffle[].
Michael Stern
mógłby użyć Keys@CountszamiastDeleteDuplicates
branislav
@branislav Czy Keys@Countszachowuje porządek?
LegionMammal978
@ LegionMammal978 Counts[list] podaje skojarzenie, którego klucze są w tej samej kolejności, w jakiej występują po raz pierwszy jako elementy listy.
branislav
3

Pyth - 9 bajtów

Właśnie dlatego wszyscy czekamy na Pyth5, może być 5 bajtów.

jdoxzN{cz

Wypróbuj online tutaj .

Maltysen
źródło
Dlaczego Pyth5 nie jest prawidłowy? Wygląda na to, że został wdrożony .
lirtosiast
@ThomasKwa Nie sądzę, że jest skończony. Nie było jeszcze wersji z wersją.
Alex A.,
3

C ++ 11, 291 bajtów

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

Nie widzę wielu odpowiedzi w C ++ w porównaniu do języków golfowych, więc dlaczego nie. Zauważ, że używa to funkcji C ++ 11, więc jeśli twój kompilator utknie w dostatecznie starym wieku , konieczne może być przekazanie specjalnego przełącznika kompilacji, aby mógł używać standardu C ++ 11. Ponieważ g++jest -std=c++11(potrzebny tylko dla wersji <5.2). Wypróbuj online

Mego
źródło
Jeśli porównasz liczbę bajtów z innymi językami, zobaczysz, dlaczego nikt nie używa C ++.
CroCo
3
@CroCo Jeśli zdajesz sobie sprawę, że celem tej strony jest znalezienie najkrótszego rozwiązania w każdym języku, zobaczysz, dlaczego opublikowałem tę odpowiedź.
Mego,
przepraszam, nie jestem tego świadomy.
CroCo
1
Dlaczego nie użyć set? To nie pozwala na duplikaty według projektu. Po prostu wepchnij się w to.
edmz
1
@black A setnie ma gwarancji, że elementy będą w tej samej kolejności, w jakiej zostały dodane.
Mego
3

K5, 9 bajtów

" "/?" "\

Do Twojej wiadomości, to jest funkcja.

Wyjaśnienie

     " "\    Split the input on spaces
    ?        Find all the unique elements
" "/         Join them back together
kirbyfan64sos
źródło
2

Matlab: 18 bajtów

unique(d,'stable')

gdzie djest d = {'cat','dog','cat','dog','bird','dog','Snake','snake','Snake'}.

Wynik to 'cat' 'dog' 'bird' 'Snake' 'snake'

CroCo
źródło
4
Witamy w Programowaniu zagadek i Code Golf! Zgłoszenia tutaj muszą być albo pełnymi programami, które odczytują ze STDIN i zapisują do STDOUT, albo funkcjami, które akceptują wejście i wyjście. W obecnej formie jest to tylko fragment; zakłada, że ​​zmienna djest już przypisana. Możesz to naprawić za pomocą uchwytu funkcji: @(d)unique(d,'stable')kosztem 4 bajtów.
Alex A.,
2

Python 3, 55

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

Tak, to długo. Niestety, Python setnie zachowuje kolejności elementów, więc musimy wykonać pracę sami. Powtarzamy słowa wejściowe, zachowując listę lelementów, których jeszcze nie ma l. Następnie drukujemy zawartość lrozdzieloną spacjami.

Wersja łańcuchowa lnie działałaby, jeśli niektóre słowa są podciągami innych słów.

xnor
źródło
2

C #, 38 bajtów

String.Join(" ",s.Split().Distinct());
Patzer
źródło
2
Nie jestem pewien, czy możesz założyć, że dane wejściowe są już wypełnione s, myślę, że powinieneś wziąć je jako argument.
Jacob
3
Witamy w PPCG! Zobacz nasze domyślne formaty odpowiedzi . Odpowiedzi powinny być pełnymi programami lub funkcjami. Funkcje nienazwane (takie jak literały lambda) są w porządku, ale fragmenty, które oczekują, że kod już istnieje w jakiejś zmiennej / na stosie itp. Lub wymagają środowiska REPL, są ogólnie niedozwolone, chyba że OP wyraźnie na to zezwala.
Martin Ender
2

Perl 6, 14 bajtów

Jako cały program jedynym sposobem na napisanie tego jest 21 bajtów

say $*IN.words.unique # 21 bytes

Jako wyrażenie lambda najkrótszy ma 14 bajtów

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

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

Mimo że wynikiem jest lista, umieszczenie jej w kontekście strunkującym spowoduje umieszczenie spacji między elementami. Jeśli wymagane było zwrócenie ciągu, można po prostu dodać znak ~z przodu ~*.words.unique.


Jeśli fragmenty byłyby dozwolone, możesz skrócić je do 13 bajtów, usuwając plik *.

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

say .words.unique
Brad Gilbert b2gills
źródło
1

Python 3, 87 80 bajtów

okazuje się, że pełna wersja programu jest krótsza

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

Zrobiłem to bez wyrażenia regularnego, jestem szczęśliwy

Wypróbuj online

Mego
źródło
1

Lua, 94 bajty

function c(a)l={}return a:gsub("%S+",function(b)if l[b]then return""else l[b]=true end end)end
Digital Veer
źródło
Anonimowy użytkownik zasugerował, aby zastąpić ... return""else l[b]=true end end...z ...return""end l[b]=""end....
Jonathan Frech,
1

awk, 25

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

Wynik:

$ printf "cat dog cat dog bird dog Snake snake Snake" | awk 'BEGIN{RS=ORS=" "}!c[$0]++'
cat dog bird Snake snake $ 
$ 
Cyfrowa trauma
źródło
1

JavaScript, 106 102 100 bajtów

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

// zdecydowanie za długo dla JS :(

Jakub
źródło
Spróbuj użyć funkcji strzałek JS (aka ECMAScript) 6 , które powinny oszczędzić 6 bajtów. Widzę też, że przeniesienie tego do CoffeeScript pozwoli zaoszczędzić co najmniej 30 bajtów.
kirbyfan64sos
Ta odpowiedź jest w natywnym JavaScript (ECMA5), istnieje edc65 dla es6.
Jacob
1

Has , 91 bajtów

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

Uruchom online i zobacz rozwinięty tutaj

Jacob Misirian
źródło
1

PHP 64 59 bajtów

function r($i){echo join(" ",array_unique(split(" ",$i)));}
Jeroen
źródło
explode()split(), implode()join()?
manatwork
Dzięki! Dobre sugestie. Wydaje splitsię, że jest deprecjonowany, ale zgadnij, że to nie ma znaczenia dla kodowania.
Jeroen
1

AppleScript, 162 bajty

Co ciekawe, jest to prawie identyczne jak w przypadku postaci bez powtarzania.

ustaw x na (wyświetl okno dialogowe „domyślna odpowiedź” ”) słowa zwrócone
ustaw o na „”
powtórz z i w x
rozważanie przypadku
jeśli nie, ja jest w to ustaw o na o & i & ""
koniec
koniec
o

Wcześniej nie znałem rozważanego słowa kluczowego. im więcej wiesz...

Addison Crump
źródło
1

Burleska, 6 bajtów

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

Raczej proste: dzielenie słów, nub (nub = usuń duplikaty), konwersja z powrotem na słowa.

mroman
źródło
1

Gema, 21 znaków

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

(Bardzo podobny do unikalnego rozwiązania postaci , ponieważ w Gema nie ma tablic, więc umożliwienie wbudowanych unikalnych funkcji niewiele nam pomoże.)

Przykładowy przebieg:

bash-4.3$ gema '*\S=${$0;$0}@set{$0;}' <<< 'cat dog cat dog bird dog Snake snake Snake'
cat dog bird Snake snake 
człowiek w pracy
źródło
1

Scala, 44 47 bajtów

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

EDYCJA : używanie toSetmoże nie zachowywać porządku, więc teraz używam odrębnego //, który kosztuje mnie tylko 3 bajty :(

Jakub
źródło
0

PHP, 37 bajtów

Zakładając, że $sjest łańcuchem wejściowym.

print_r(array_flip(explode(' ',$s)));
MonkeyZeus
źródło