Supprimer les mots répétés d'une chaîne

12

Supprimez tous les mots répétitifs d'une phrase entrée.

L'entrée sera quelque chose comme cat dog cat dog bird dog Snake snake Snakeet la sortie devrait l'être cat dog bird Snake snake. Il y aura toujours un seul espace séparant les mots.

L'ordre de sortie doit être le même que l'entrée. (Reportez-vous à l'exemple)

Vous n'avez pas besoin de gérer la ponctuation, mais la gestion des majuscules est requise.

Alien G
la source
13
Je recommande d'attendre d'accepter une réponse pendant au moins quelques jours. Une solution plus courte peut encore venir.
Alex A.
1
J'attends des solutions similaires à uniqchars , sauf que cela n'interdit pas les intégrés qui suppriment les doublons.
xnor
2
En voyant l'exemple, il n'y a pas de traitement spécial des majuscules: Snakeet snakesont traités simplement comme différents
edc65
@AlexA .: En fait, il y en a déjà un. codegolf.stackexchange.com/questions/62044/…
ev3commander

Réponses:

1

gs2 , 3 octets

,É-

Encodé en CP437 .

STDIN est poussé au début du programme. ,le divise en espaces. Éest uniq, qui filtre les doublons. -joint par des espaces.

Lynn
la source
10

CJam, 7 caractères

qS/_&S*

Peut probablement être beaucoup plus court ... mais quoi que je n'aie presque jamais utilisé CJam. ^. ^

qlit l'entrée, S/se divise en espaces, en _&double et applique un ET setwise (donc se débarrasser des doublons), et S*se joint à nouveau sur l'espace.

Lien interprète en ligne

Poignée de porte
la source
1
Comment pouvez-vous même obtenir beaucoup plus court que 7? lol
Cruncher
Quelqu'un vient de le faire.
Alien G
8

Haskell, 34 octets

import Data.List
unwords.nub.words

Exemple d'utilisation: (unwords.nub.words) "cat dog cat dog bird dog Snake snake Snake"-> "cat dog bird Snake snake".

nimi
la source
8

APL, 22 20 octets

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

Cela crée une fonction monadique sans nom qui accepte une chaîne à droite et renvoie une chaîne.

Explication:

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

Essayez-le en ligne

Enregistré 2 octets grâce à Dennis!

Alex A.
la source
3
J'aime toute réponse qui utilise un langage non ésotérique et non golfique.
Dark Egregious
7

Rubis, 21 caractères

->s{s.split.uniq*' '}
Poignée de porte
la source
7

JavaScript (ES6) 33

(voir cette réponse )

Testez l'exécution de l'extrait ci-dessous dans un navigateur compatible EcmaScript 6 (implémentation de Set, de l'opérateur de diffusion, des chaînes de modèle et des fonctions de flèche - j'utilise Firefox).

Remarque: la conversion en Set supprime tous les doublons et Set conserve l'ordre d'origine.

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
la source
Wow wow wow ... Je suis toujours étonné par votre capacité à réduire de 25% ou plus toute solution que je pense. +1
ETHproductions
1
J'ai regardé le problème et j'ai immédiatement pensé aux Sets ... seulement pour réaliser que tu l'avais déjà fait = P très sympa!
Mwr247
comment définir le maintien de la commande d'origine?
njzk2
@ njzk2 demandez aux développeurs du langage. Cela pourrait être: un ensemble est en interne un tableau, et à chaque insertion, il y a une vérification pour rejeter les doublons. C'est quand même un détail d'implémentation
edc65
@ njzk2 alors que je ne sais pas comment , je sais que ce fait est spécifié par le langage: les objets set sont des collections de valeurs, vous pouvez itérer ses éléments dans l'ordre d'insertion . Une valeur dans l'ensemble ne peut apparaître qu'une seule fois; il est unique dans la collection Set. ( developer.mozilla.org/it/docs/Web/JavaScript/Reference/… )
edc65
6

TeaScript , 12 octets

TeaScript est JavaScript pour le golf.

xs` `u()j` `

C'est assez court. Il se divise sur chaque espace, filtre les doublons, puis rejoint.

Essayez-le en ligne

Downgoat
la source
C'est tee-a scriptou tee script?
@MathiasFoster ce serait "tee-script"
Downgoat
TeaScript a-t-il des lettres réservées aux noms de variables? La plupart d'entre eux semblent être des raccourcis pour les propriétés intégrées.
intrepidcoder
@intrepidcoder oui tous ces éléments: cdfghijklmnopstuvwsont réservés aux variables, ils sont tous pré-initialisés à 0. best également réservé au nom d'une variable, il est pré-initialisé à une chaîne vide
Downgoat
6

PowerShell, 15 octets

$args|select -u

Whoa, une entrée réelle où PowerShell est quelque peu compétitif? C'est impossible!

Prend la chaîne comme arguments d'entrée, redirige vers Select-Objectavec l' -Uniqueindicateur. Crache un tableau de chaînes, préservant l'ordre et la capitalisation comme demandé.

Usage:

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

Si c'est trop "tricheur" en supposant que l'entrée peut être sous forme d'arguments de ligne de commande, alors optez pour ce qui suit, à 24 21 octets (enregistré quelques octets grâce à blabb ) . Fait intéressant, l'utilisation de l'opérateur unaire dans cette direction s'avère également fonctionner si la chaîne d'entrée est délimitée par des guillemets ou comme arguments individuels, car la valeur -splitpar défaut est constituée d'espaces. Prime.

-split$args|select -u
AdmBorkBork
la source
S'appuyer sur le comportement de l'environnement consistant à alimenter le code à la cuillère avec une entrée facilement divisée…?
manatwork
@manatwork J'ai ajouté une clarification si la première utilisation est considérée comme trop "tricheuse" - car on ne sait pas exactement comment l'entrée est spécifiée, nous laissons le soin à l'OP.
AdmBorkBork
Et maintenant, les efficients sont les propres fonctionnalités de PowerShell. Cela mérite vraiment un vote positif.
manatwork
@timmyD, vous pouvez couper 3 octets à l'incroyable ?? la version en utilisant le split unaire et pas besoin de "" '' dans les arguments de la ligne de commande aussi: \> ls -l split.ps1 & type split.ps1 & echo. & powershell -nologo -f split.ps1 chat chien chat chien chien oiseau chien 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 octets

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

Cela crée une fonction sans nom qui divise la chaîne en un vecteur sur les espaces, ne conserve que les éléments uniques (en préservant l'ordre) et joint à nouveau le tableau en une chaîne avec des espaces.

Alex A.
la source
4

R, 22 octets

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

Cela lit une chaîne de STDIN et la divise en un vecteur sur les espaces en utilisant scan(,""), sélectionne uniquement les éléments uniques, puis les concatène en une chaîne et l'imprime dans STDOUT en utilisant cat.

Alex A.
la source
4

Rétine , 22 octets

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

Enregistrez le fichier avec un saut de ligne de fin et exécutez-le avec l' -sindicateur.

C'est assez simple en ce qu'il correspond à un seul mot, et le lookbehind vérifie si ce même mot est apparu dans la chaîne auparavant. Le saut de ligne arrière fait que Retina fonctionne en mode Remplacer avec une chaîne de remplacement vide, supprimant toutes les correspondances.

Martin Ender
la source
4

Mathematica, 43 39 octets

StringRiffle@*Keys@*Counts@*StringSplit
LegionMammal978
la source
Bravo pour l'utilisation StringRiffle[].
Michael Stern
pourrait utiliser à la Keys@Countsplace deDeleteDuplicates
branislav
@branislav Keys@CountsPréserve l'ordre?
LegionMammal978
@ LegionMammal978 Counts[list]donne une association dont les clés sont dans le même ordre qu'elles apparaissent en premier comme éléments de liste.
branislav
3

Pyth - 9 octets

Eh bien, c'est pourquoi nous attendons tous Pyth5, aurait pu être de 5 octets.

jdoxzN{cz

Essayez-le en ligne ici .

Maltysen
la source
Pourquoi Pyth5 n'est-il pas valide? Il semble être mis en œuvre .
lirtosiast
@ThomasKwa Je ne pense pas que ce soit fini. Il n'y a pas encore de version versionnée.
Alex A.
3

C ++ 11, 291 octets

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

Je ne vois pas beaucoup de réponses C ++ par rapport aux langages de golf, alors pourquoi pas. Notez que cela utilise des fonctionnalités C ++ 11, et donc si votre compilateur est coincé dans les âges sombres suffisamment vieux, vous devrez peut-être passer un commutateur de compilation spécial pour lui faire utiliser la norme C ++ 11. Pour g++, c'est -std=c++11(seulement nécessaire pour les versions <5.2). Essayez-le en ligne

Mego
la source
Si vous comparez le nombre d'octets avec d'autres langages, vous verrez pourquoi personne n'utilise C ++.
CroCo
3
@CroCo Si vous réalisez que l'intérêt de ce site est de trouver la solution la plus courte dans chaque langue, vous comprendrez pourquoi j'ai posté cette réponse.
Mego
désolé, je ne suis pas au courant.
CroCo
1
Pourquoi ne pas utiliser un set? Il n'autorise aucun doublon par conception. Poussez-y.
edmz
1
@black A setn'est pas garanti d'avoir les articles dans le même ordre qu'ils ont été ajoutés.
Mego
3

K5, 9 octets

" "/?" "\

Pour info, c'est une fonction.

Explication

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

Matlab: 18 octets

unique(d,'stable')

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

Le résultat est 'cat' 'dog' 'bird' 'Snake' 'snake'

CroCo
la source
4
Bienvenue dans Programmation d'énigmes et Code Golf! Les soumissions ici doivent être soit des programmes complets qui lisent depuis STDIN et écrivent vers STDOUT, soit des fonctions qui acceptent les entrées et les sorties de retour. En l'état, ce n'est qu'un extrait de code; il suppose que la variable dest déjà affectée. Vous pouvez corriger cela en utilisant un descripteur de fonction:, @(d)unique(d,'stable')au prix de 4 octets.
Alex A.
2

Python 3, 55

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

Yeesh, c'est long. Malheureusement, Python setne conserve pas l'ordre des éléments, nous devons donc faire le travail nous-mêmes. Nous parcourons les mots d'entrée, en conservant une liste ld'éléments qui ne sont pas encore inclus l. Ensuite, nous imprimons le contenu de l' lespace séparé.

Une version chaîne de lne fonctionnerait pas si certains mots sont des sous-chaînes d'autres mots.

xnor
la source
2

C #, 38 octets

String.Join(" ",s.Split().Distinct());
Patzer
la source
2
Je ne suis pas sûr que vous puissiez supposer que l'entrée est déjà remplie s, je pense que vous devriez l'obtenir comme argument.
Jacob
3
Bienvenue chez PPCG! Veuillez consulter nos formats de réponse par défaut . Les réponses doivent être soit des programmes complets soit des fonctions. Les fonctions sans nom (comme les littéraux lambda) sont très bien, mais les extraits qui s'attendent à ce que le code existe déjà dans une variable / sur la pile, etc. ou nécessitent un environnement REPL sont généralement interdits, sauf si l'OP les autorise explicitement.
Martin Ender
2

Perl 6, 14 octets

Dans l'ensemble, la seule façon d'écrire est de 21 octets

say $*IN.words.unique # 21 bytes

En tant qu'expression lambda, la plus courte est de 14 octets

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

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

Bien que la sortie soit une liste, si vous la placez dans un contexte de chaîne, elle mettra un espace entre les éléments. S'il était nécessaire de renvoyer une chaîne, vous pouvez simplement ajouter un ~à l'avant ~*.words.unique.


Si des extraits étaient autorisés, vous pouvez le raccourcir à 13 octets en supprimant le *.

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

say .words.unique
Brad Gilbert b2gills
la source
1

Python 3, 87 80 octets

il s'avère que la version complète du programme est plus courte

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

Je l'ai fait sans regex, je suis heureux

Essayez-le en ligne

Mego
la source
1

Lua, 94 octets

function c(a)l={}return a:gsub("%S+",function(b)if l[b]then return""else l[b]=true end end)end
Digital Veer
la source
Un utilisateur anonyme a suggéré de remplacer ... return""else l[b]=true end end...par ...return""end l[b]=""end....
Jonathan Frech
1

awk, 25

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

Production:

$ printf "cat dog cat dog bird dog Snake snake Snake" | awk 'BEGIN{RS=ORS=" "}!c[$0]++'
cat dog bird Snake snake $ 
$ 
Traumatisme numérique
la source
1

JavaScript, 106 102 100 octets

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

// beaucoup trop long pour JS :(

Jacob
la source
Essayez d'utiliser les fonctions fléchées JS (aka ECMAScript) 6 , qui devraient économiser 6 octets. De plus, je peux déjà voir que le portage de ceci sur CoffeeScript permettra d'économiser au moins 30 octets.
kirbyfan64sos
Cette réponse est en JavaScript natif (ECMA5), il y a celle d'edc65 pour es6.
Jacob
1

Hassium , 91 octets

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

Exécuter en ligne et voir développé ici

Jacob Misirian
la source
1

PHP 64 59 octets

function r($i){echo join(" ",array_unique(split(" ",$i)));}
Jeroen
la source
explode()split(), implode()join()?
manatwork
Merci! Bonnes suggestions. Semble splitêtre en train d'être privé, mais devinez que cela n'a pas d'importance pour le codegolving.
Jeroen
1

AppleScript, 162 octets

Fait intéressant, cela est presque identique à la chose des caractères non répétitifs.

mettre x à (afficher la boîte de dialogue "" réponse par défaut "")
mettre o à ""
répéter avec i en x
considérant le cas
si ce n'est pas le cas, je suis sur o, puis mettez o sur o & i & ""
fin
fin
o

Je ne connaissais pas vraiment le mot-clé considéré avant cela. plus vous en savez...

Addison Crump
la source
1

Burlesque, 6 octets

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

Assez simple: fractionner les mots, nub (nub = supprimer les doublons), reconvertir en mots.

mroman
la source
1

Gema, 21 personnages

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

(Très similaire à la solution de caractère unique , car il n'y a pas de tableaux dans Gema, donc permettre des fonctions uniques intégrées ne nous aide pas beaucoup.)

Exemple d'exécution:

bash-4.3$ gema '*\S=${$0;$0}@set{$0;}' <<< 'cat dog cat dog bird dog Snake snake Snake'
cat dog bird Snake snake 
homme au travail
la source
1

Scala, 44 47 octets

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

EDIT : l'utilisation toSetpourrait ne pas préserver l'ordre, donc j'utilise maintenant distinct // qui me coûte juste 3 octets :(

Jacob
la source
0

PHP, 37 octets

En supposant que $sc'est la chaîne d'entrée.

print_r(array_flip(explode(' ',$s)));
MonkeyZeus
la source