Remova palavras repetidas de uma string

12

Remova todas as palavras repetidas de uma frase inserida.

A entrada será algo parecido cat dog cat dog bird dog Snake snake Snakee a saída deve ser cat dog bird Snake snake. Sempre haverá um único espaço separando as palavras.

A ordem de saída deve ser igual à entrada. (Consulte o exemplo)

Você não precisa lidar com pontuação, mas é necessário o tratamento de letras maiúsculas.

Alien G
fonte
13
Eu recomendo aguardar para aceitar uma resposta por pelo menos alguns dias. Uma solução mais curta ainda pode vir.
Alex A.
1
Espero soluções semelhantes ao uniqchars , exceto que isso não proíbe os embutidos que removem duplicatas.
Xnor
2
Vendo o exemplo, não há tratamento especial letra maiúscula: Snakee snakesão tratados simplesmente como diferente
edc65
@AlexA .: De fato, já existe um. codegolf.stackexchange.com/questions/62044/…
ev3commander

Respostas:

1

gs2 , 3 bytes

,É-

Codificado no CP437 .

STDIN é pressionado no início do programa. ,divide sobre espaços. Éé uniq, que filtra duplicatas. -junta-se por espaços.

Lynn
fonte
10

CJam, 7 caracteres

qS/_&S*

Provavelmente pode ser muito mais curto ... mas seja o que for que eu quase nunca usei o CJam. ^. ^

qlê entrada, S/divide em espaços, _&duplica e aplica um AND setwise (portanto, se livra das duplicatas) e S*se junta novamente ao espaço.

Link de intérprete online

Maçaneta da porta
fonte
1
Como você pode ficar muito menor que 7? lol
Cruncher
Alguém acabou de fazer.
Estrangeiro G
8

Haskell, 34 bytes

import Data.List
unwords.nub.words

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

nimi
fonte
8

APL, 22 20 bytes

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

Isso cria uma função monádica sem nome que aceita uma string à direita e retorna uma string.

Explicação:

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

Experimente online

Economizou 2 bytes graças a Dennis!

Alex A.
fonte
3
Adoro qualquer resposta que use uma linguagem não esotérica e não-golfe.
Darth Egrégio
7

Ruby, 21 caracteres

->s{s.split.uniq*' '}
Maçaneta da porta
fonte
7

JavaScript (ES6) 33

(veja esta resposta )

Teste a execução do snippet abaixo em um navegador compatível com EcmaScript 6 (implementando Set, spread spread, strings de modelo e funções de seta - eu uso o Firefox).

Nota: a conversão para Set elimina todas as duplicatas e Set mantém a ordem 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
fonte
Uau uau uau ... Estou continuamente impressionado com a sua capacidade de cortar qualquer solução que eu penso em 25% ou mais. +1
ETHproductions
1
Olhou para o problema e imediatamente pensou em Sets ... apenas para perceber que você já tinha feito isso = P muito bom!
Mwr247
como o conjunto pode manter a ordem original?
Njzk2 31/10/2015
@ njzk2 pergunte aos desenvolvedores da linguagem. Ele poderia ser: um conjunto é internamente um Array, e em cada inserção não é um cheque para rejeitar duplicatas. É um detalhe de implementação de qualquer maneira
edc65
@ njzk2 enquanto não sei como , sei que esse fato é especificado pelo idioma: Set objects são coleções de valores, você pode iterar seus elementos na ordem de inserção . Um valor no conjunto pode ocorrer apenas uma vez; é único na coleção do conjunto. ( developer.mozilla.org/it/docs/Web/JavaScript/Reference/… )
edc65
6

TeaScript , 12 bytes

TeaScript é JavaScript para jogar golfe.

xs` `u()j` `

Isso é bem curto. Ele se divide em cada espaço, filtra as duplicatas e depois se junta novamente.

Experimente online

Downgoat
fonte
É tee-a scriptou tee script?
@MathiasFoster seria "tee-script"
Downgoat
O TeaScript tem letras reservadas para nomes de variáveis? A maioria deles parece ser uma abreviação de propriedades internas.
Intrepidcoder #
@intrepidcoder sim todos estes: cdfghijklmnopstuvwsão reservados para variáveis, todos eles são pré-inicializado com 0. btambém é reservado para um nome de variável, é pré-inicializada para uma seqüência vazia
Downgoat
6

PowerShell, 15 bytes

$args|select -u

Whoa, uma entrada real em que o PowerShell é um pouco competitivo? Isso é impossível!

Leva a string como argumentos de entrada, passa para Select-Objecta -Uniquebandeira. Cospe uma matriz de strings, preservando a ordem e a capitalização conforme 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

Se isso for muito "barato", assumindo que a entrada possa ser como argumentos da linha de comando, siga o seguinte, em 24 21 Bytes (salvou alguns bytes graças ao blabb ) . Curiosamente, o uso do operador unário nessa direção também funcionará se a sequência de entrada for demarcada com aspas ou como argumentos individuais, pois o padrão -splité por espaços. Bônus.

-split$args|select -u
AdmBorkBork
fonte
Confiar no comportamento do ambiente de dar uma colher no código com entradas prontamente divididas ...?
manatwork
@manatwork Adicionei um esclarecimento se o primeiro uso for considerado "muito barato" - já que não está claro exatamente como a entrada é especificada, vamos deixar para o OP.
AdmBorkBork
E agora está claro quão eficazes são os próprios recursos do PowerShell. Que 24 realmente merece um voto positivo.
manatwork
@timmyD você pode cortar 3 bytes para o impasse ?? versão usando a divisão unária e também não é necessário "" '' na linha de comando args: \> ls -l split.ps1 & digite split.ps1 & echo. & powershell -nologo -f split.ps1 cão gato gato cachorro pássaro cachorro cobra cobra cobra--rw-rw rw 1 admin 0 21 2015/11/02 19:06 split.ps1 -split $ args | selecionar -u pássaro cão gato cobra cobra
blabb
4

Julia, 29 bytes

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

Isso cria uma função sem nome que divide a string em um vetor em espaços, mantém apenas os elementos exclusivos (ordem de preservação) e junta a matriz novamente a uma string com espaços.

Alex A.
fonte
4

R, 22 bytes

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

Isso lê uma string de STDIN e a divide em um vetor em espaços usando scan(,""), seleciona apenas elementos exclusivos, concatena-os em uma string e imprime-a em STDOUT usando cat.

Alex A.
fonte
4

Retina , 22 bytes

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

Salve o arquivo com um avanço de linha à direita e execute-o com o -ssinalizador.

Isso é bastante direto, pois corresponde a uma única palavra, e o lookbehind verifica se a mesma palavra já apareceu na string anteriormente. O avanço de linha à direita faz com que o Retina funcione no modo Substituir por uma sequência de substituição vazia, removendo todas as correspondências.

Martin Ender
fonte
4

Mathematica, 43 39 bytes

StringRiffle@*Keys@*Counts@*StringSplit
LegionMammal978
fonte
Parabéns pelo uso StringRiffle[].
Michael Stern
poderia usar em Keys@Countsvez deDeleteDuplicates
branislav
@branislav Keys@CountsPreserva a ordem?
usar o seguinte
@ LegionMammal978 Counts[list]fornece uma associação cujas chaves estão na mesma ordem em que ocorrem pela primeira vez como elementos da lista.
Branislav
3

Pitão - 9 bytes

Bem, é por isso que todos estamos esperando pelo Pyth5, poderia ter sido de 5 bytes.

jdoxzN{cz

Experimente online aqui .

Maltysen
fonte
Por que Pyth5 não é válido? Parece estar implementado .
lirtosiast
@ThomasKwa Eu não acho que está terminado. Ainda não houve uma versão com versão.
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;}

Não vejo muitas respostas em C ++ em comparação com as linguagens de golfe, por que não? Observe que isso usa os recursos do C ++ 11 e, portanto, se o seu compilador estiver preso na idade das trevas com idade suficiente, talvez seja necessário passar por uma opção de compilação especial para que ele use o padrão C ++ 11. Pois g++é -std=c++11(é necessário apenas para versões <5.2). Experimente online

Mego
fonte
Se você comparar o número de bytes com outros idiomas, verá por que ninguém está usando C ++.
CroCo 29/10
3
@CroCo Se você entende que o objetivo deste site é encontrar a solução mais curta em cada idioma, você verá por que eu publiquei esta resposta.
Mego
desculpe, eu não estou ciente disso.
CroCo 29/10
1
Por que não usar um set? Ele não permite duplicatas por design. Apenas empurre para dentro.
Edmz
1
Não seté garantido que o @ A preto tenha os itens na mesma ordem em que foram adicionados.
Mego
3

K5, 9 bytes

" "/?" "\

Para sua informação, esta é uma função.

Explicação

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

Matlab: 18 bytes

unique(d,'stable')

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

O resultado é 'cat' 'dog' 'bird' 'Snake' 'snake'

CroCo
fonte
4
Bem-vindo à Programação de Puzzles e Code Golf! Os envios aqui precisam ser programas completos que leem de STDIN e gravam em STDOUT ou funções que aceitam entrada e saída. Tal como está, isso é apenas um trecho; assume que a variável djá está atribuída. Você pode corrigir isso usando um identificador de função:, @(d)unique(d,'stable')ao custo de 4 bytes.
Alex A.
2

Python 3, 55

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

Sim, isso é longo. Infelizmente, o Python setnão mantém a ordem dos elementos, por isso temos que fazer o trabalho sozinhos. Repetimos as palavras de entrada, mantendo uma lista lde elementos que ainda não estão inseridos l. Em seguida, imprimimos o conteúdo do lespaço separado.

Uma versão em cadeia de caracteres lnão funcionaria se algumas palavras fossem substrings de outras palavras.

xnor
fonte
2

C #, 38 bytes

String.Join(" ",s.Split().Distinct());
Patzer
fonte
2
Não tenho certeza de que você possa assumir que a entrada já esteja preenchida s, acho que você deve obtê-la como argumento.
29415 Jacob
3
Bem-vindo ao PPCG! Veja nossos formatos de resposta padrão . As respostas devem ser programas ou funções completos. Funções sem nome (como lambda literais) são boas, mas trechos que esperam que o código já exista em alguma variável / pilha etc. ou exijam um ambiente REPL geralmente não são permitidos, a menos que o OP permita explicitamente.
Martin Ender
2

Perl 6, 14 bytes

Como um programa inteiro, a única maneira de escrever é de 21 bytes

say $*IN.words.unique # 21 bytes

Como uma expressão lambda, o menor é 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;

Enquanto a saída for uma Lista, se você a colocar em um contexto de stringing, ela colocará um espaço entre os elementos. Se fosse necessário retornar uma string, você poderia simplesmente adicionar ~a na frente ~*.words.unique.


Se snippets forem permitidos, você poderá reduzi-lo para 13 bytes removendo o *.

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

say .words.unique
Brad Gilbert b2gills
fonte
1

Python 3, 87 80 bytes

Acontece que a versão completa do programa é mais curta

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

Fiz isso sem regex, estou feliz

Experimente online

Mego
fonte
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
fonte
Um usuário anônimo sugeriu substituir ... return""else l[b]=true end end...por ...return""end l[b]=""end....
11138 Jonathan Frech
1

awk, 25

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

Resultado:

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

// tempo demais para JS :(

Jacob
fonte
Tente usar as funções de seta JS (também conhecidas como ECMAScript) , que devem economizar 6 bytes. Além disso, já vejo que a portabilidade para o CoffeeScript economizará pelo menos 30 bytes.
Kirbyfan64sos
Esta resposta está em JavaScript nativo (ECMA5); existe a do edc65 para o es6.
27415 Jacob
1

Hássio , 91 bytes

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

Execute on-line e veja expandido aqui

Jacob Misirian
fonte
1

PHP 64 59 bytes

function r($i){echo join(" ",array_unique(split(" ",$i)));}
Jeroen
fonte
explode()split(), implode()join()?
manatwork
Obrigado! Boas sugestões. Parece que splitestá sendo privado, mas acho que isso não importa para a codificação.
Jeroen
1

AppleScript, 162 bytes

Curiosamente, isso é quase idêntico ao dos personagens que não se repetem.

defina x como texto da caixa de diálogo "" resposta padrão "")
defina o como ""
repita com i em x
considerando caso
caso contrário, i está em o e defina o como o & i & ""
fim
fim
o

Na verdade, eu não conhecia a palavra-chave considerando antes disso. quanto mais você sabe...

Addison Crump
fonte
1

Burlesco, 6 bytes

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

Bastante simples: divida as palavras, nub (nub = remove duplicatas), converta novamente em palavras.

mroman
fonte
1

Gema, 21 caracteres

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

(Muito semelhante à solução de caractere exclusivo , como não há matrizes no Gema, portanto, permitir funções exclusivas incorporadas não nos ajuda muito.)

Exemplo de execução:

bash-4.3$ gema '*\S=${$0;$0}@set{$0;}' <<< 'cat dog cat dog bird dog Snake snake Snake'
cat dog bird Snake snake 
homem a trabalhar
fonte
1

Scala, 44 47 bytes

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

EDIT : usando toSetpode não preservar a ordem, então agora estou usando // distintos que me custam apenas 3 bytes :(

Jacob
fonte
0

PHP, 37 bytes

Assumindo $sé a sequência de entrada.

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