Entfernen Sie wiederholte Wörter aus einer Zeichenfolge

12

Entfernen Sie alle sich wiederholenden Wörter aus einem eingegebenen Satz.

Die Eingabe wird ungefähr so ​​sein cat dog cat dog bird dog Snake snake Snakeund die Ausgabe sollte so sein cat dog bird Snake snake. Es wird immer ein einzelnes Leerzeichen geben, das die Wörter voneinander trennt.

Die Ausgabereihenfolge muss mit der Eingabereihenfolge übereinstimmen. (Siehe Beispiel)

Sie müssen nicht mit Interpunktion umgehen, aber Sie müssen mit Großbuchstaben umgehen.

Alien G
quelle
13
Ich empfehle, einige Tage zu warten, bis eine Antwort vorliegt. Eine kürzere Lösung könnte noch kommen.
Alex A.
1
Ich erwarte ähnliche Lösungen wie bei uniqchars , mit der Ausnahme, dass dies keine integrierten Funktionen verbietet, mit denen Duplikate entfernt werden.
Xnor
2
Sehen Sie das Beispiel gibt es keine speziellen Großbuchstaben Umgang: Snakeund snakewerden einfach als unterschiedlich behandelt
edc65
@AlexA .: Tatsächlich gibt es schon einen. codegolf.stackexchange.com/questions/62044/…
ev3commander

Antworten:

1

gs2 , 3 bytes

,É-

In CP437 codiert .

STDIN wird beim Programmstart gedrückt. ,teilt es über Leerzeichen auf. Éist uniq, was Duplikate filtert. -verbindet durch Leerzeichen.

Lynn
quelle
10

CJam, 7 Zeichen

qS/_&S*

Kann wahrscheinlich viel kürzer sein ... aber was auch immer ich CJam fast nie benutzt habe. ^. ^

qLiest Eingaben, S/teilt Leerzeichen auf, _&dupliziert und wendet ein eindeutiges UND an (daher werden Duplikate entfernt) und verbindet sich S*wieder mit dem Leerzeichen.

Online-Dolmetscher-Link

Türknauf
quelle
1
Wie kann man noch viel kürzer als 7 werden? lol
Cruncher
Jemand hat es gerade getan.
Alien G
8

Haskell, 34 Bytes

import Data.List
unwords.nub.words

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

nimi
quelle
8

APL, 22 bis 20 Bytes

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

Dadurch wird eine unbenannte monadische Funktion erstellt, die eine Zeichenfolge auf der rechten Seite akzeptiert und eine Zeichenfolge zurückgibt.

Erläuterung:

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

Probieren Sie es online aus

2 Bytes gespart dank Dennis!

Alex A.
quelle
3
Ich liebe jede Antwort, die eine nicht-esoterische, nicht-Golf-Sprache verwendet.
Darth Egregious
7

Rubin, 21 Zeichen

->s{s.split.uniq*' '}
Türknauf
quelle
7

JavaScript (ES6) 33

(siehe diese Antwort )

Testen Sie das folgende Snippet in einem EcmaScript 6-kompatiblen Browser (Implementierung von Set-, Spread-Operator-, Template-Strings- und Pfeilfunktionen - ich verwende Firefox).

Hinweis: Bei der Konvertierung in Set werden alle Duplikate gelöscht, und Set behält die ursprüngliche Reihenfolge bei.

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
quelle
Wow wow wow ... Ich bin immer wieder erstaunt über Ihre Fähigkeit, jede Lösung, die mir einfällt, um 25% oder mehr zu reduzieren. +1
ETHproductions
1
Sah das Problem an und dachte sofort an Sets ... nur um festzustellen, dass du es schon getan hattest = P sehr nett!
Mwr247,
Wie kann die ursprüngliche Bestellung beibehalten werden?
njzk2
@ njzk2 Fragen Sie die Entwickler der Sprache. Es könnte sein: Eine Menge ist intern ein Array, und bei jeder Einfügung wird überprüft, ob Duplikate abgelehnt werden. Es ist sowieso ein Implementierungsdetail
edc65
@ njzk2 Obwohl ich nicht weiß, wie , weiß ich, dass diese Tatsache durch die Sprache spezifiziert ist: Set-Objekte sind Sammlungen von Werten. Sie können ihre Elemente in der Reihenfolge ihrer Einfügung durchlaufen . Ein Wert im Set darf nur einmal vorkommen. es ist einzigartig in der Sammlung des Sets. ( developer.mozilla.org/it/docs/Web/JavaScript/Reference/… )
edc65
6

TeaScript , 12 Bytes

TeaScript ist JavaScript zum Golfen.

xs` `u()j` `

Das ist ziemlich kurz. Es teilt sich auf jedes Feld auf, filtert Duplikate heraus und fügt sich dann wieder zusammen.

Probieren Sie es online aus

Downgoat
quelle
Ist es tee-a scriptoder tee script?
@ MathiasFoster wäre es "tee-script"
Downgoat
Hat TeaScript Buchstaben, die für Variablennamen reserviert sind? Die meisten von ihnen scheinen Abkürzungen für eingebaute Eigenschaften zu sein.
intrepidcoder
@intrepidcoder ja alle diese: cdfghijklmnopstuvwsind für Variablen reserviert, sie sind alle auf 0 b
vorinitialisiert. Ist
6

PowerShell, 15 Bytes

$args|select -u

Whoa, ein Eintrag, bei dem PowerShell etwas wettbewerbsfähig ist? Das ist unmöglich!

Nimmt die Zeichenfolge als Eingabeargumente und leitet sie Select-Objectmit dem -UniqueFlag weiter. Spuckt eine Reihe von Zeichenfolgen aus, wobei die angeforderte Reihenfolge und Großschreibung beibehalten wird.

Verwendung:

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

Wenn dies zu "betrügerisch" ist, wenn angenommen wird, dass die Eingabe als Befehlszeilenargument erfolgen kann, gehen Sie wie folgt vor: 24 21 Bytes (einige Bytes werden dank blabb gespeichert ) . Interessanterweise funktioniert die Verwendung des unären Operators in dieser Richtung auch, wenn die Eingabezeichenfolge in Anführungszeichen oder als einzelne Argumente angegeben wird, da die Standardeinstellung -splitLeerzeichen enthält. Bonus.

-split$args|select -u
AdmBorkBork
quelle
Sich auf das Verhalten der Umgebung stützen, den Code mit leicht aufgeteilten Eingaben zu füttern…?
Manatwork
@manatwork Ich habe eine Klarstellung hinzugefügt, wenn die erste Verwendung als zu "betrügerisch" eingestuft wird - da nicht klar ist, wie der Eingang genau angegeben wird, überlassen wir dies dem OP.
AdmBorkBork
Und jetzt ist klar, wie effizient die PowerShell-eigenen Funktionen sind. Diese 24 verdient wirklich eine Aufwertung.
Manatwork
@timmyD Kannst du 3 Bytes auf die Uncheaty abhacken ?? Version mit dem unären Split und ohne "" "in den Kommandozeilenargumenten: \> ls -l split.ps1 & type split.ps1 & echo. & powershell -nologo -f split.ps1 cat dog cat dog bird dog Schlange Schlange Schlange -rw-rw-rw- 1 Admin 0 21 2015-11-02 19:06 split.ps1 -split $ args | select -u Katze Hund Vogel Schlange Schlange
blabb
4

Julia, 29 Bytes

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

Dadurch wird eine unbenannte Funktion erstellt, die die Zeichenfolge in Leerzeichen in einen Vektor aufteilt, nur die eindeutigen Elemente beibehält (Reihenfolge beibehalten) und das Array wieder zu einer Zeichenfolge mit Leerzeichen zusammenfügt.

Alex A.
quelle
4

R, 22 Bytes

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

Dies liest einen String aus STDIN und teilt ihn mit in einen Vektor auf scan(,""), wählt nur eindeutige Elemente aus, verknüpft sie dann zu einem String und druckt ihn mit in STDOUT cat.

Alex A.
quelle
4

Netzhaut , 22 Bytes

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

Speichern Sie die Datei mit einem nachfolgenden Zeilenumbruch und führen Sie sie mit dem -sFlag aus.

Dies ist ziemlich einfach, da es mit einem einzelnen Wort übereinstimmt und der Lookbehind prüft, ob dasselbe Wort zuvor in der Zeichenfolge vorgekommen ist. Der nachfolgende Zeilenvorschub bewirkt, dass Retina im Ersetzungsmodus mit einer leeren Ersetzungszeichenfolge arbeitet und alle Übereinstimmungen entfernt.

Martin Ender
quelle
4

Mathematica, 43 39 Bytes

StringRiffle@*Keys@*Counts@*StringSplit
LegionMammal978
quelle
Ein dickes Lob für die Verwendung StringRiffle[].
Michael Stern
könnte Keys@Countsanstelle von verwendenDeleteDuplicates
branislav
@branislav Erhält Keys@CountsOrdnung?
LegionMammal978
@ LegionMammal978 Counts[list]gibt eine Assoziation an, deren Schlüssel in derselben Reihenfolge sind, in der sie zuerst als Elemente der Liste vorkommen.
Branislav
3

Pyth - 9 Bytes

Nun, deshalb warten wir alle auf Pyth5, es könnten 5 Bytes sein.

jdoxzN{cz

Probieren Sie es hier online aus .

Maltysen
quelle
Warum ist Pyth5 nicht gültig? Es scheint umgesetzt zu sein .
Lirtosiast
@ ThomasKwa Ich glaube nicht, dass es fertig ist. Es gibt noch keine versionierte Version.
Alex A.
3

C ++ 11, 291 Bytes

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

Ich sehe nicht viele C ++ - Antworten im Vergleich zu Golfsprachen. Warum also nicht? Beachten Sie, dass dies C ++ 11-Funktionen verwendet. Wenn Ihr Compiler also im Dunkeln steckt und alt genug ist, müssen Sie möglicherweise einen speziellen Kompilierungsschalter übergeben, damit er den C ++ 11-Standard verwendet. Für g++ist es -std=c++11(nur für Versionen <5.2 erforderlich). Probieren Sie es online aus

Mego
quelle
Wenn Sie die Anzahl der Bytes mit anderen Sprachen vergleichen, werden Sie feststellen, warum niemand C ++ verwendet.
CroCo
3
@ CroCo Wenn Sie erkennen, dass es auf dieser Website darum geht, die kürzeste Lösung in jeder Sprache zu finden, werden Sie sehen, warum ich diese Antwort gepostet habe.
Mego
Es tut mir leid, ich bin mir dessen nicht bewusst.
CroCo
1
Warum nicht ein verwenden set? Es sind keine Duplikate zulässig. Einfach hineinschieben.
Edmz
1
Bei @black A setwird nicht garantiert, dass die Artikel in der Reihenfolge sind, in der sie hinzugefügt wurden.
Mego
3

K5, 9 Bytes

" "/?" "\

Zu Ihrer Information, dies ist eine Funktion.

Erläuterung

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

Matlab: 18 Bytes

unique(d,'stable')

wo d ist d = {'cat','dog','cat','dog','bird','dog','Snake','snake','Snake'}.

Das Ergebnis ist 'cat' 'dog' 'bird' 'Snake' 'snake'

CroCo
quelle
4
Willkommen bei Programming Puzzles und Code Golf! Eingaben müssen entweder vollständige Programme sein, die aus STDIN lesen und in STDOUT schreiben, oder Funktionen, die Eingaben akzeptieren und Ausgaben zurückgeben. So wie es aussieht, ist dies nur ein Ausschnitt. Es wird davon ausgegangen, dass die Variable dbereits zugewiesen ist. Sie können dies korrigieren, indem Sie ein Funktionshandle: @(d)unique(d,'stable')zum Preis von 4 Byte verwenden.
Alex A.
2

Python 3, 55

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

Ja, das ist lang. Leider setbehält Python die Reihenfolge der Elemente nicht bei, sodass wir die Arbeit selbst erledigen müssen. Wir durchlaufen die eingegebenen Wörter und führen eine Liste lder Elemente, die noch nicht enthalten sind l. Dann drucken wir den Inhalt von lLeerzeichen getrennt.

Eine String-Version von lwürde nicht funktionieren, wenn einige Wörter Teilfolgen anderer Wörter sind.

xnor
quelle
2

C #, 38 Bytes

String.Join(" ",s.Split().Distinct());
Patzer
quelle
2
Ich bin nicht sicher, ob Sie davon ausgehen können, dass die Eingabe bereits ausgefüllt sist. Ich denke, Sie sollten sie als Argument verwenden.
Jacob
3
Willkommen bei PPCG! Bitte werfen Sie einen Blick auf unsere Standardantwortformate . Die Antworten sollten entweder vollständige Programme oder Funktionen sein. Unbenannte Funktionen (wie Lambda-Literale) sind in Ordnung, aber Snippets, die erwarten, dass der Code bereits in einer Variablen / auf dem Stack usw. vorhanden ist oder eine REPL-Umgebung erfordert, sind im Allgemeinen nicht zulässig, es sei denn, das OP lässt dies ausdrücklich zu.
Martin Ender
2

Perl 6, 14 Bytes

Als ganzes Programm ist die einzige Möglichkeit, wie Sie es schreiben würden, 21 Bytes lang

say $*IN.words.unique # 21 bytes

Als Lambda-Ausdruck beträgt der kürzeste 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;

Während es sich bei der Ausgabe um eine Liste handelt, wird zwischen den Elementen ein Leerzeichen eingefügt, wenn Sie sie in einen stringierenden Kontext stellen. Wenn eine Zeichenfolge zurückgegeben werden muss, können Sie ~der Vorderseite einfach ein hinzufügen ~*.words.unique.


Wenn Ausschnitte zulässig wären, könnten Sie sie durch Entfernen des Befehls auf 13 Byte verkürzen *.

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

say .words.unique
Brad Gilbert b2gills
quelle
1

Python 3, 87 80 Bytes

stellt sich heraus, dass die Vollversion kürzer ist

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

Habe es ohne Regex gemacht, ich bin glücklich

Probieren Sie es online aus

Mego
quelle
1

Lua, 94 Bytes

function c(a)l={}return a:gsub("%S+",function(b)if l[b]then return""else l[b]=true end end)end
Digital Veer
quelle
Ein anonymer Benutzer vorgeschlagen zu ersetzen ... return""else l[b]=true end end...mit ...return""end l[b]=""end....
Jonathan Frech
1

awk, 25

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

Ausgabe:

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

JavaScript, 106 102 100 Bytes

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

// viel zu lang für JS :(

Jacob
quelle
Probieren Sie die 6- Pfeil-Funktionen von JS (auch bekannt als ECMAScript) aus , mit denen Sie 6 Bytes sparen sollten. Außerdem kann ich bereits erkennen, dass durch die Portierung nach CoffeeScript mindestens 30 Byte eingespart werden.
kirbyfan64sos
Diese Antwort ist in nativem JavaScript (ECMA5), für es6 gibt es eine von edc65.
Jacob
1

Hassium , 91 Bytes

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

Online laufen und hier erweitert sehen

Jacob Misirian
quelle
1

PHP 64 59 Bytes

function r($i){echo join(" ",array_unique(split(" ",$i)));}
Jeroen
quelle
explode()split(), implode()join()?
Manatwork
Vielen Dank! Gute Vorschläge. Scheint splitzwar entzogen zu sein, aber das spielt wohl keine Rolle für das Codegolving.
Jeroen
1

AppleScript, 162 Byte

Interessanterweise ist dies fast identisch mit der nicht wiederholenden Charaktersache.

setze x auf (zeige den Dialog "" Standardantwort "")
setze o auf ""
wiederhole mit i in x
in Betracht ziehen
Wenn nicht, bin ich in o, dann setze o auf o & i & ""
Ende
Ende
Ö

Ich kannte das Keyword, über das ich nachgedacht habe, vorher nicht. je mehr du weisst...

Addison Crump
quelle
1

Burlesque, 6 Bytes

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

Ganz einfach: Wörter teilen, Nub (Nub = Duplikate entfernen), zurück in Wörter konvertieren.

mroman
quelle
1

Gema, 21 Zeichen

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

(Sehr ähnlich wie bei der Lösung für eindeutige Zeichen , da es in Gema keine Arrays gibt. Daher hilft es uns nicht viel, integrierte eindeutige Funktionen zuzulassen.)

Probelauf:

bash-4.3$ gema '*\S=${$0;$0}@set{$0;}' <<< 'cat dog cat dog bird dog Snake snake Snake'
cat dog bird Snake snake 
Mann bei der Arbeit
quelle
1

Scala, 44 47 Bytes

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

BEARBEITEN : mit wird toSetdie Reihenfolge möglicherweise nicht beibehalten, daher verwende ich jetzt ein bestimmtes //, das mich nur 3 Byte gekostet hat :(

Jakob
quelle
0

PHP, 37 Bytes

Angenommen, es $shandelt sich um die Eingabezeichenfolge.

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