Eliminar palabras repetidas de una cadena

12

Eliminar todas las palabras que se repiten de una oración ingresada.

La entrada será algo así cat dog cat dog bird dog Snake snake Snakey la salida debería ser cat dog bird Snake snake. Siempre habrá un solo espacio para separar las palabras.

El orden de salida debe ser el mismo que el de entrada. (Consulte el ejemplo)

No es necesario que maneje la puntuación, pero se requiere el manejo de mayúsculas.

Alien G
fuente
13
Recomiendo esperar para aceptar una respuesta durante al menos unos días. Todavía puede venir una solución más corta.
Alex A.
1
Espero soluciones similares a los uniqchars , excepto que esto no prohíbe los complementos que eliminan los duplicados.
xnor
2
Al ver el ejemplo, no hay un manejo especial de mayúsculas: Snakey snakeson tratados simplemente como diferentes
edc65
@AlexA .: De hecho, ya hay uno. codegolf.stackexchange.com/questions/62044/…
ev3commander

Respuestas:

1

gs2 , 3 bytes

,É-

Codificado en CP437 .

STDIN se empuja al inicio del programa. ,lo divide en espacios. Ées decir uniq, que filtra los duplicados. -se une por espacios.

Lynn
fuente
10

CJam, 7 caracteres

qS/_&S*

Probablemente puede ser mucho más corto ... pero lo que sea que casi nunca he usado CJam. ^. ^

qlee entradas, se S/divide en espacios, _&duplica y aplica un AND setwise (por lo tanto, elimina los duplicados) y S*vuelve a unirse en el espacio.

Enlace de intérprete en línea

Pomo de la puerta
fuente
1
¿Cómo puedes ser mucho más corto que 7? lol
Cruncher
Alguien acaba de hacerlo.
Alien G
8

Haskell, 34 bytes

import Data.List
unwords.nub.words

Ejemplo de uso: (unwords.nub.words) "cat dog cat dog bird dog Snake snake Snake"-> "cat dog bird Snake snake".

nimi
fuente
8

APL, 22 20 bytes

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

Esto crea una función monádica sin nombre que acepta una cadena a la derecha y devuelve una cadena.

Explicación:

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

Pruébalo en línea

¡Ahorré 2 bytes gracias a Dennis!

Alex A.
fuente
3
Me encanta cualquier respuesta que use un lenguaje no esotérico ni de golf.
Darth Egregious
7

Ruby, 21 caracteres

->s{s.split.uniq*' '}
Pomo de la puerta
fuente
7

JavaScript (ES6) 33

(ver esta respuesta )

Pruebe a ejecutar el fragmento a continuación en un navegador compatible con EcmaScript 6 (implementando Set, operador de propagación, cadenas de plantilla y funciones de flecha: uso Firefox).

Nota: la conversión a Establecer descarta todos los duplicados y Establecer mantiene el orden original.

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
fuente
Wow wow wow ... Continuamente me sorprende tu habilidad para reducir cualquier solución que pienso en un 25% o más. +1
ETHproductions
1
Observé el problema e inmediatamente pensé en Conjuntos ... solo para darme cuenta de que ya lo había hecho = P muy agradable!
Mwr247
¿Cómo se puede mantener el orden original?
njzk2
@ njzk2 pregunta a los desarrolladores del lenguaje. Se podría ser: un conjunto es internamente una matriz, y en cada inserción se realiza un control de rechazar duplicados. Es un detalle de implementación de todos modos
edc65
@ njzk2 aunque no sé cómo , sé que este hecho está especificado por el lenguaje: los objetos de conjunto son colecciones de valores, puede iterar sus elementos en orden de inserción . Un valor en el conjunto solo puede aparecer una vez; Es único en la colección del Set. ( developer.mozilla.org/it/docs/Web/JavaScript/Reference/… )
edc65
6

TeaScript , 12 bytes

TeaScript es JavaScript para jugar al golf.

xs` `u()j` `

Esto es bastante corto. Se divide en cada espacio, filtra los duplicados y luego vuelve a unirse.

Pruébalo en línea

Downgoat
fuente
Es tee-a scripto tee script?
@MathiasFoster sería "tee-script"
Downgoat
¿TeaScript tiene letras reservadas para nombres de variables? La mayoría de ellos parecen ser shorthands para propiedades incorporadas.
intrepidcoder
@intrepidcoder sí, todo esto: cdfghijklmnopstuvwestán reservados para variables, todos están preinicializados a 0. btambién están reservados para un nombre de variable, se preinicializan a una cadena vacía
Downgoat
6

PowerShell, 15 bytes

$args|select -u

Whoa, una entrada real donde PowerShell es algo competitivo? Eso es imposible!

Toma la cadena como argumentos de entrada, canaliza Select-Objectcon la -Uniquebandera. Escupe una serie de cadenas, preservando el orden y las mayúsculas según lo solicitado.

Uso:

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 esto es demasiado "engañoso" al suponer que la entrada puede ser como argumentos de línea de comandos, vaya a lo siguiente, a 24 21 Bytes (guardado algunos bytes gracias a blabb ) . Curiosamente, el uso del operador unario en esta dirección también funciona si la cadena de entrada se delimita con comillas o como argumentos individuales, ya que el valor predeterminado -splites por espacios. Prima.

-split$args|select -u
AdmBorkBork
fuente
¿Confiando en el comportamiento del entorno de alimentar el código con cuchara con una entrada fácilmente dividida ...?
manatwork
@manatwork He agregado una aclaración si el primer uso se considera demasiado "engañoso", ya que no está claro exactamente cómo se especifica la entrada, lo dejaremos en manos del OP.
AdmBorkBork
Y ahora está claro cuán eficientes son las características propias de PowerShell. Ese 24 realmente merece un voto a favor.
manatwork
@timmyD, ¿puedes cortar 3 bytes para el unataty? versión utilizando la división unaria y sin necesidad de "" '' en los argumentos de la línea de comandos: \> ls -l split.ps1 y tipo split.ps1 & echo. & powershell -nologo -f split.ps1 gato perro gato perro perro pájaro 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 bytes

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

Esto crea una función sin nombre que divide la cadena en un vector en espacios, mantiene solo los elementos únicos (preservando el orden) y une la matriz nuevamente en una cadena con espacios.

Alex A.
fuente
4

R, 22 bytes

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

Esto lee una cadena de STDIN y la divide en un vector en espacios usando scan(,""), selecciona solo elementos únicos, luego los concatena en una cadena e imprime en STDOUT usando cat.

Alex A.
fuente
4

Retina , 22 bytes

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

Guarde el archivo con un salto de línea final y ejecútelo con la -sbandera.

Esto es bastante sencillo en el sentido de que coincide con una sola palabra, y el análisis posterior verifica si esa misma palabra ha aparecido anteriormente en la cadena. El avance de línea final hace que Retina funcione en modo Reemplazar con una cadena de reemplazo vacía, eliminando todas las coincidencias.

Martin Ender
fuente
4

Mathematica, 43 39 bytes

StringRiffle@*Keys@*Counts@*StringSplit
LegionMammal978
fuente
Felicitaciones por el uso StringRiffle[].
Michael Stern
podría usar en Keys@Countslugar deDeleteDuplicates
branislav
@branislav ¿ Keys@CountsPreserva el orden?
LegionMammal978
@ LegionMammal978 Counts[list]proporciona una asociación cuyas claves están en el mismo orden en que aparecen por primera vez como elementos de la lista.
branislav
3

Pyth - 9 bytes

Bueno, esta es la razón por la que todos estamos esperando Pyth5, podría haber sido de 5 bytes.

jdoxzN{cz

Pruébelo en línea aquí .

Maltysen
fuente
¿Por qué no es válido Pyth5? Parece estar implementado .
lirtosiast
@ThomasKwa No creo que esté terminado. No ha habido un lanzamiento versionado todavía.
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;}

No veo muchas respuestas de C ++ en comparación con los lenguajes de golf, entonces, ¿por qué no? Tenga en cuenta que esto usa las características de C ++ 11 y, por lo tanto, si su compilador está atascado en las edades oscuras lo suficientemente viejo, es posible que deba pasar un interruptor de compilación especial para que use el estándar C ++ 11. Para g++, es -std=c++11(solo necesario para versiones <5.2). Pruébalo en línea

Mego
fuente
Si compara la cantidad de bytes con otros lenguajes, verá por qué nadie está usando C ++.
CroCo
3
@CroCo Si se da cuenta de que el objetivo de este sitio es encontrar la solución más corta en cada idioma, verá por qué publiqué esta respuesta.
Mego
Lo siento, no estoy al tanto.
CroCo
1
¿Por qué no usar a set? No permite duplicados por diseño. Solo empújalo.
edmz
1
No setse garantiza que @black A tenga los artículos en el mismo orden en que se agregaron.
Mego
3

K5, 9 bytes

" "/?" "\

FYI, esta es una función.

Explicación

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

Matlab: 18 bytes

unique(d,'stable')

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

El resultado es 'cat' 'dog' 'bird' 'Snake' 'snake'

CroCo
fuente
44
¡Bienvenido a Programming Puzzles y Code Golf! Las presentaciones aquí deben ser programas completos que leen desde STDIN y escriben en STDOUT, o funciones que aceptan entrada y salida de retorno. Tal como está, esto es simplemente un fragmento; se supone que la variable dya está asignada. Puede rectificar esto utilizando un controlador de función:, @(d)unique(d,'stable')a un costo de 4 bytes.
Alex A.
2

Pitón 3, 55

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

Sí, esto es largo. Desafortunadamente, Python setno mantiene el orden de los elementos, por lo que tenemos que hacer el trabajo nosotros mismos. Repetimos las palabras de entrada, manteniendo una lista lde elementos que aún no están incluidos l. Luego, imprimimos el contenido de lespacios separados.

Una versión de cadena de lno funcionaría si algunas palabras son subcadenas de otras palabras.

xnor
fuente
2

C #, 38 bytes

String.Join(" ",s.Split().Distinct());
Patzer
fuente
2
No estoy seguro de que pueda asumir que la entrada ya está poblada s, creo que debería obtenerla como argumento.
Jacob
3
Bienvenido a PPCG! Eche un vistazo a nuestros formatos de respuesta predeterminados . Las respuestas deben ser programas completos o funciones. Las funciones sin nombre (como los literales lambda) están bien, pero los fragmentos que esperan que el código ya exista en alguna variable / en la pila, etc. o requieran un entorno REPL generalmente no se permiten a menos que el OP lo permita explícitamente.
Martin Ender
2

Perl 6, 14 bytes

Como programa completo, la única forma en que lo escribiría es de 21 bytes de longitud

say $*IN.words.unique # 21 bytes

Como expresión lambda, el más corto es 14 bytes

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

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

Si bien el resultado es una Lista, si lo coloca en un contexto de cadena, colocará un espacio entre los elementos. Si fuera un requisito devolver una cadena, simplemente podría agregar una ~al frente ~*.words.unique.


Si se permitieran fragmentos, podría acortarlo a 13 bytes quitando el *.

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

say .words.unique
Brad Gilbert b2gills
fuente
1

Python 3, 87 80 bytes

Resulta que la versión completa del programa es más corta

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

Lo hice sin expresiones regulares, estoy feliz

Pruébalo en línea

Mego
fuente
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
Veer digital
fuente
Un usuario anónimo sugirió reemplazar ... return""else l[b]=true end end...con ...return""end l[b]=""end....
Jonathan Frech
1

awk, 25

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

Salida:

$ printf "cat dog cat dog bird dog Snake snake Snake" | awk 'BEGIN{RS=ORS=" "}!c[$0]++'
cat dog bird Snake snake $ 
$ 
Trauma digital
fuente
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(' ')}

// demasiado tiempo para JS :(

Jacob
fuente
Intente utilizar JS (también conocido como ECMAScript) 6 funciones de flecha , que deberían ahorrar 6 bytes. Además, ya puedo ver que portar esto a CoffeeScript ahorrará al menos 30 bytes.
kirbyfan64sos
Esta respuesta está en JavaScript nativo (ECMA5), hay una edc65 para es6.
Jacob
1

Hassium , 91 bytes

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

Ejecute en línea y vea expandido aquí

Jacob Misirian
fuente
1

PHP 64 59 bytes

function r($i){echo join(" ",array_unique(split(" ",$i)));}
Jeroen
fuente
explode()split(), implode()join()?
manatwork
¡Gracias! Buenas sugerencias splitSin embargo, parece que se está depicando, pero supongo que eso no importa para codegolving.
Jeroen
1

AppleScript, 162 bytes

Curiosamente, esto es casi idéntico al de los personajes que no se repiten.

establezca x en (mostrar diálogo "" respuesta predeterminada "") el texto devuelto las palabras
establecer o en ""
repite con i en x
considerando el caso
si no, estoy en o, establezca o en o & i & ""
final
final
o

En realidad no conocía la palabra clave de consideración antes de esto. cuanto más sepas ...

Addison Crump
fuente
1

Burlesque, 6 bytes

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

Más bien simple: dividir palabras, nub (nub = eliminar duplicados), convertir de nuevo a palabras.

mroman
fuente
1

Gema, 21 personajes

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

(Muy similar a la solución de caracteres únicos , ya que no hay matrices en Gema, por lo que permitir funciones únicas incorporadas no nos ayuda mucho).

Ejecución de muestra:

bash-4.3$ gema '*\S=${$0;$0}@set{$0;}' <<< 'cat dog cat dog bird dog Snake snake Snake'
cat dog bird Snake snake 
hombre trabajando
fuente
1

Scala, 44 47 bytes

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

EDITAR : el uso toSetpodría no preservar el orden, por lo que ahora estoy usando distintos // que solo me costaron 3 bytes :(

Jacob
fuente
0

PHP, 37 bytes

Asumiendo $ses la cadena de entrada.

print_r(array_flip(explode(' ',$s)));
MonoZeus
fuente