Rimuovi parole ripetute da una stringa


12

Rimuovi tutte le parole ripetute da una frase inserita.

L'input sarà qualcosa di simile cat dog cat dog bird dog Snake snake Snakee l'output dovrebbe essere cat dog bird Snake snake. Ci sarà sempre un unico spazio che separa le parole.

L'ordine di uscita deve essere uguale all'input. (Fare riferimento all'esempio)

Non è necessario gestire la punteggiatura ma è necessaria la gestione delle lettere maiuscole.


13
Consiglio di attendere una risposta per almeno alcuni giorni. Una soluzione più breve potrebbe ancora arrivare.
Alex A.

1
Mi aspetto soluzioni simili a uniqchars , tranne per il fatto che ciò non vieta i built-in che rimuovono i duplicati.
xnor

2
Vedendo l'esempio, non esiste una speciale gestione delle lettere maiuscole: Snakee snakesono trattati semplicemente come diversi
edc65

@AlexA .: In effetti ce n'è già uno. codegolf.stackexchange.com/questions/62044/…
ev3commander

Risposte:


1

gs2 , 3 byte

,É-

Codificato in CP437 .

STDIN viene premuto all'inizio del programma. ,lo divide su spazi. Éè uniq, che filtra i duplicati. -si unisce per spazi.


10

CJam, 7 caratteri

qS/_&S*

Probabilmente può essere molto più breve ... ma qualunque cosa non abbia quasi mai usato CJam. ^. ^

qlegge l'input, si S/divide in spazi, _&duplica e applica una E (quindi eliminando i duplicati) e S*si ricollega allo spazio.

Link dell'interprete online


1
Come puoi anche diventare molto più corto di 7? lol
Cruncher,

Qualcuno l'ha appena fatto.
Alien G

8

Haskell, 34 byte

import Data.List
unwords.nub.words

Esempio di utilizzo: (unwords.nub.words) "cat dog cat dog bird dog Snake snake Snake"-> "cat dog bird Snake snake".


8

APL, 22 20 byte

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

Questo crea una funzione monadica senza nome che accetta una stringa a destra e restituisce una stringa.

Spiegazione:

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

Provalo online

Salvato 2 byte grazie a Dennis!


3
Adoro qualsiasi risposta che usi un linguaggio non esoterico, non golf.
Darth Egregious,


7

JavaScript (ES6) 33

(vedi questa risposta )

Prova a eseguire lo snippet di seguito in un browser conforme a EcmaScript 6 (implementando Set, operatore di diffusione, stringhe di modelli e funzioni freccia - utilizzo Firefox).

Nota: la conversione in Set elimina tutti i duplicati e Set mantiene l'ordine originale.

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>


Eeeek !!! Eeeek !!! Eeeek !!! Sono continuamente stupito dalla tua capacità di tagliare qualsiasi soluzione che io abbia pensato del 25% o più. +1
ETHproductions

1
Ho esaminato il problema e ho pensato subito ai set ... solo per rendermi conto che l'avevi già fatto = P molto bello!
Mwr247,

come può impostare mantenere l'ordine originale?
njzk2,

@ njzk2 chiedi agli sviluppatori della lingua. Esso potrebbe essere: un insieme è internamente una matrice, e ad ogni inserzione c'è un controllo rifiutare duplicati. È comunque un dettaglio di implementazione
edc65,

@ njzk2 mentre non so come , so che questo fatto è specificato dalla lingua: gli oggetti impostati sono raccolte di valori, puoi iterare i suoi elementi in ordine di inserimento . Un valore nell'insieme può verificarsi una sola volta; è unico nella collezione del Set. ( developer.mozilla.org/it/docs/Web/JavaScript/Reference/… )
edc65

6

TeaScript , 12 byte

TeaScript è JavaScript per il golf.

xs` `u()j` `

Questo è piuttosto breve. Si divide su ogni spazio, filtra i duplicati, quindi si ricongiunge.

Provalo online


È tee-a scripto tee script?

@MathiasFoster sarebbe "tee-script"
Downgoat,

TeaScript ha lettere riservate ai nomi delle variabili? La maggior parte di essi sembra essere una scorciatoia per le proprietà integrate.
intrepidcoder

@intrepidcoder sì tutti questi: cdfghijklmnopstuvwsono riservati per le variabili, sono tutti pre-inizializzati su 0. bè anche riservato per un nome di variabile, è pre-inizializzato su una stringa vuota
Downgoat

6

PowerShell, 15 byte

$args|select -u

Whoa, una voce reale in cui PowerShell è in qualche modo competitivo? È impossibile!

Prende la stringa come argomenti di input, pipe Select-Objectcon il -Uniqueflag. Sputa una serie di stringhe, preservando l'ordine e le maiuscole come richiesto.

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 questo è troppo "economico" supponendo che l'input possa essere come argomento da riga di comando, allora procedi come segue, a 24 21 byte (salvati alcuni byte grazie a blabb ) . È interessante notare che l'utilizzo dell'operatore unario in questa direzione funziona anche se la stringa di input è delimitata da virgolette o come singoli argomenti, poiché l'impostazione predefinita -splitè per spazi. Bonus.

-split$args|select -u

Affidarsi al comportamento dell'ambiente di nutrire il codice con input prontamente suddivisi ...?
arte

@manatwork Ho aggiunto un chiarimento se il primo utilizzo è considerato troppo "economico" - poiché non è chiaro esattamente come viene specificato l'input, lo lasceremo all'OP.
AdmBorkBork,

E ora è chiaro quanto siano efficienti le funzionalità di PowerShell. Quel 24 merita davvero un voto.
arte

@timmyD puoi tagliare 3 byte alla uncheaty ?? versione usando la divisione unaria e non c'è bisogno di "" '' anche nella riga di comando: \> ls -l split.ps1 e digita split.ps1 & echo. & powershell -nologo -f split.ps1 gatto cane gatto cane uccello cane cane Serpente Serpente Serpente -rw-rw-rw- 1 Admin 0 21 2015-11-02 19:06 split.ps1 -split $ args | select -u cat dog bird Serpente serpente
blabb

4

Julia, 29 byte

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

Ciò crea una funzione senza nome che divide la stringa in un vettore su spazi, mantiene solo gli elementi univoci (preservando l'ordine) e unisce nuovamente l'array in una stringa con spazi.


4

R, 22 byte

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

Questo legge una stringa da STDIN e la divide in un vettore su spazi usando scan(,""), seleziona solo elementi univoci, quindi li concatena in una stringa e la stampa su STDOUT usando cat.


4

Retina , 22 byte

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

Salvare il file con un avanzamento riga finale ed eseguirlo con il -sflag.

Questo è abbastanza semplice in quanto corrisponde a una singola parola e il lookbehind controlla se quella stessa parola è apparsa nella stringa prima. L'alimentazione di riga finale fa sì che Retina funzioni in modalità Sostituisci con una stringa di sostituzione vuota, rimuovendo tutte le corrispondenze.


4

Mathematica, 43 39 byte

StringRiffle@*Keys@*Counts@*StringSplit

Complimenti per l'utilizzo StringRiffle[].
Michael Stern,

potrebbe usare Keys@Countsinvece diDeleteDuplicates
branislav il

@branislav Keys@CountsConserva l'ordine?
LegionMammal978,

@ LegionMammal978 Counts[list]fornisce un'associazione le cui chiavi sono nello stesso ordine in cui si presentano per la prima volta come elementi dell'elenco.
branislav,

3

Pyth - 9 byte

Bene, questo è il motivo per cui stiamo tutti aspettando Pyth5, potrebbero essere stati 5 byte.

jdoxzN{cz

Provalo online qui .


Perché Pyth5 non è valido? Sembra essere implementato .
lirtosiast

@ThomasKwa Non penso che sia finito. Non è stata ancora rilasciata una versione.
Alex A.

3

C ++ 11, 291 byte

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

Non vedo molte risposte in C ++ rispetto ai linguaggi del golf, quindi perché no. Nota che questo utilizza le funzionalità di C ++ 11 e quindi se il tuo compilatore è bloccato nei periodi bui abbastanza vecchi, potrebbe essere necessario passare uno speciale interruttore di compilazione per farlo usare lo standard C ++ 11. Per g++, è -std=c++11(necessario solo per le versioni <5.2). Provalo online


Se confronti il ​​numero di byte con altre lingue, vedrai perché nessuno usa C ++.
CroCo,

3
@CroCo Se ti rendi conto che il punto di questo sito è trovare la soluzione più breve in ogni lingua, vedrai perché ho pubblicato questa risposta.
Mego

scusa non ne sono consapevole.
CroCo,

1
Perché non usare un set? Non consente duplicati in base alla progettazione. Basta spingerci dentro.
edmz,

1
Non setè garantito che @black A abbia gli articoli nello stesso ordine in cui sono stati aggiunti.
Mego

3

K5, 9 byte

" "/?" "\

Cordiali saluti, questa è una funzione.

Spiegazione

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

2

Matlab: 18 byte

unique(d,'stable')

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

Il risultato è 'cat' 'dog' 'bird' 'Snake' 'snake'


4
Benvenuto in Puzzle di programmazione e Code Golf! Gli invii qui devono essere programmi completi che leggono da STDIN e scrivono su STDOUT o funzioni che accettano input e output di ritorno. Allo stato attuale, questo è solo uno snippet; presuppone che la variabile dsia già stata assegnata. È possibile correggere ciò utilizzando un handle di funzione:, @(d)unique(d,'stable')al costo di 4 byte.
Alex A.

2

Python 3, 55

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

Sì, questo è lungo. Sfortunatamente, Python's setnon mantiene l'ordine degli elementi, quindi dobbiamo fare il lavoro da soli. Esaminiamo le parole di input, mantenendo un elenco ldi elementi che non sono ancora presenti l. Quindi, stampiamo il contenuto di lspazio separato.

Una versione stringa di lnon funzionerebbe se alcune parole sono sottostringhe di altre parole.


2

C #, 38 byte

String.Join(" ",s.Split().Distinct());

2
Non sono sicuro che tu possa presumere che l'input sia già popolato s, penso che dovresti prenderlo come argomento.
Jacob,

3
Benvenuti in PPCG! Dai un'occhiata ai nostri formati di risposta predefiniti . Le risposte dovrebbero essere programmi o funzioni completi. Le funzioni senza nome (come i letterali lambda) vanno bene, ma gli snippet che prevedono che il codice esista già in alcune variabili / nello stack ecc. O che richiedono un ambiente REPL sono generalmente vietati a meno che l'OP non li consenta esplicitamente.
Martin Ender,

2

Perl 6, 14 byte

Nel suo complesso, l'unico modo per scriverlo è lungo 21 byte

say $*IN.words.unique # 21 bytes

Come espressione lambda il più breve è di 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;

Mentre l'output è un elenco, se lo si inserisce in un contesto stringente, verrà inserito uno spazio tra gli elementi. Se fosse necessario restituire una stringa, basta aggiungere un carattere ~in primo piano ~*.words.unique.


Se fossero consentiti frammenti, è possibile accorciarlo a 13 byte rimuovendo il *.

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

say .words.unique

1

Python 3, 87 80 byte

risulta che la versione completa del programma è più breve

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

L'ho fatto senza regex, sono felice

Provalo online


1

Lua, 94 byte

function c(a)l={}return a:gsub("%S+",function(b)if l[b]then return""else l[b]=true end end)end

Un utente anonimo ha suggerito di sostituirlo ... return""else l[b]=true end end...con ...return""end l[b]=""end....
Jonathan Frech,

1

awk, 25

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

Produzione:

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

1

JavaScript, 106 102 100 byte

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

// troppo a lungo per JS :(


Prova a utilizzare le funzioni freccia JS (aka ECMAScript) 6 , che dovrebbero risparmiare 6 byte. Inoltre, posso già vedere che il porting di questo su CoffeeScript farà risparmiare almeno 30 byte.
Kirbyfan64sos,

Questa risposta è in JavaScript nativo (ECMA5), c'è quella di edc65 per es6.
Jacob,

1

Hassium , 91 byte

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

Corri online e vedi espanso qui


1

PHP 64 59 byte

function r($i){echo join(" ",array_unique(split(" ",$i)));}

explode()split(), implode()join()?
arte

Grazie! Buoni suggerimenti. Sembra splitessere deprivato però, ma suppongo che non abbia importanza per il codegolving.
Jeroen,

1

AppleScript, 162 byte

È interessante notare che questo è quasi identico alla cosa dei personaggi che non si ripetono.

imposta x su (visualizza la finestra di dialogo "" risposta predefinita "") il testo restituito dalle parole
impostare o su ""
ripeti con i in x
considerando il caso
in caso contrario sono in o quindi imposta o su o & i & ""
fine
fine
o

In realtà non conoscevo la parola chiave considerata prima di questo. più si conosce...


1

Burlesque, 6 byte

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

Piuttosto semplice: dividi parole, nub (nub = rimuovi duplicati), converti in parole.


1

Gema, 21 personaggi

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

(Molto simile alla soluzione di carattere unico , in quanto non ci sono array in Gema, quindi consentire funzioni uniche integrate non ci aiuta molto.)

Esecuzione di esempio:

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

1

Scala, 44 47 byte

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

EDIT : l'utilizzo toSetpotrebbe non conservare l'ordine, quindi ora sto usando distinti // che mi costano solo 3 byte :(


0

PHP, 37 byte

Supponendo che $ssia la stringa di input.

print_r(array_flip(explode(' ',$s)));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.