Elementi non unici


24

Scrivi un programma che trova gli elementi non univoci di una matrice di numeri interi con segno. L'array risultante può essere in qualsiasi ordine.

La tua risposta potrebbe essere uno snippet che presuppone che l'input sia archiviato in una variabile ( ddiciamo) e valuta il risultato corretto.

Casi test

Ogni caso di test è una singola riga nel formato input => output. Si noti che sono valide anche altre permutazioni dell'output.

[]                        => []
[-1, 0, 1]                => []
[1, 1]                    => [1]
[3, 0, 0, 1, 1, 0, 5, 3]  => [3, 0, 1]
[-34, 0, 1, -34, 4, 8, 4] => [-34, 4]

L'ordine degli elementi non ha importanza.

Questo è il golf del codice, quindi vince la risposta più breve (in byte).



1
poiché questo è per array di numeri interi sarebbe diverso. Penso molto più breve. Questo è per una stringa.
garg10may

1
È consentito accettare input come righe anziché come array? Ad esempio, invece di [-1, 0, 1], possiamo ingresso (sostituire \ n con ritorni a capo): "-1\n0\n1"?
Addison Crump,

1
L'output deve essere un elenco o un set sarebbe accettabile?
Dennis,

E deve produrre in quel formato?
Addison Crump,

Risposte:


16

K5 , 5 byte

Supponendo che l'input sia già in una variabile chiamata d,

?d^?d

Prendi gli elementi distinti ( ?) di d tranne ( d^) gli elementi distinti di d ( ?d). Piacevolmente simmetrico, no? Questo funziona perché l'operatore "tranne" rimuove solo la prima occorrenza dell'argomento destro dall'argomento sinistro.

Più generalmente,

nu: {?x^?x}

In azione:

  nu'(();-1 0 1;1 1;3 0 0 1 1 0 5 3;-34 0 1 -34 4 8 4)
(()
 ()
 ,1
 0 1 3
 -34 4)

Modificare:

Se volessimo preservare l'ordine della prima occorrenza di elementi non univoci, potremmo invertire l'elenco di sorgenti prima e dopo aver rimosso gli elementi univoci tramite, tranne al costo di 4 byte extra:

  nu: {?|(|x)^?x}
  nu'(();-1 0 1;1 1;3 0 0 1 1 0 5 3;-34 0 1 -34 4 8 4)
(()
 ()
 ,1
 3 0 1
 -34 4)

10

CJam, 10

Supponendo che l'array sia già nella variabile D (sulla base di questo commento ):

D{De=(},_&

Provalo online

Spiegazione:

D{…},   filter items of D based on the block
  De=   count occurrences in D
  (     decrement (resulting in true/false for duplicate/unique)
_&      remove duplicates from the results

Nota: aggiungere a pse si desidera una stampa carina, altrimenti la matrice risultante viene stampata senza delimitatori per impostazione predefinita. Ciò è accettabile poiché la domanda specifica che lo snippet deve solo "valutare il risultato corretto".

Versione input / output standard, 13:

q~_{1$e=(},&p

Provalo online

Spiegazione:

q~      read and evaluate the input array
_       duplicate the array
{…},    filter items based on the block
  1$    copy the array
  e=    count occurrences
  (     decrement (resulting in true/false for duplicate/unique)
&       set intersection with the initial array (removes duplicates)
p       pretty print

1
13:q~$e`{((<~}%p
Sp3000,

3
@ Sp3000 Ho trovato un'altra versione da 13 byte prima di leggere il tuo commento :) Conserva anche l'ordine.
aditsu,

9

Haskell - 32

import Data.List;f l=nub$l\\nub l

Abbastanza corto, anche con l'importazione. a \\ brimuove la prima occorrenza di ogni elemento di bda ae nubrende unici tutti gli elementi di un elenco.


7

Pyth, 7 byte

S{.-Q{Q

Provalo online.

Come funziona

Pyth memorizza automaticamente l'input valutato Qe stampa tutti i valori di ritorno inutilizzati.

     {Q  Convert Q into a set. This removes duplicates.
  .-Q    Perform "bagwise" difference of Q and set(Q).
         This removes the first occurrence of all elements in Q.
 {       Convert to set to deduplicate.
S        Sort. Returns a list.

7

SQL, 44 42 byte

SELECT*FROM D GROUP BY I HAVING COUNT(*)>1

Spero sia OK supporre che i numeri interi siano memorizzati nella tabella D? Questo funzionerà sia in SQL Server, PostgreSQL e possibilmente in altri. Grazie a @manatwork dai 2 byte.


Supponendo che i sia l'unico campo nella tabella d, in PostgreSQL è possibile ridurlo a select*from d group by 1having count(*)>1. (Anche il parser di MySQL e SQLite gestirà la select*fromparte non separata , ma non capiscono 1having.)
manatwork

@manatwork applaude per questo, SQL Server capisce anche il select*from. Non gli piace 1havingperò .. lo lascerò comeI having
MickyT

6

Mathematica, 29 26 byte

Supponendo che l'input sia archiviato in d:

Select[d⋃d,d~Count~#>1&]

Altrimenti, è 29 byte come una funzione senza nome:

Cases[#⋃#,n_/;#~Count~n>1]&

Qui, d⋃d(o #⋃#) è un trucco da golf per rimuovere i duplicati: prendendo l'unione dell'insieme con se stesso, Mathematica interpreta l'elenco come un insieme, rimuovendo automaticamente i duplicati, mentre l'unione effettiva non fa nulla.

Successivamente, entrambi i metodi filtrano semplicemente quegli elementi che compaiono nell'elenco originale almeno due volte.


6

JavaScript (ES6), 37 byte

Esegui questo nella console JavaScript:

e={};d.filter(x=>(e[x]=1+e[x]||0)==1)

E 'generalmente accettato che JavaScript ha bisogno di un qualche tipo di funzione esplicita "Uscita / print" (come ad esempio console.log, alert, ecc) per essere considerata completa. Se una sfida dice "scrivere un programma o una funzione", anche la funzione restituisce è sufficiente. A parte ciò, soluzione molto efficiente!
Mwr247,

1
@ Mwr247 La domanda afferma che la risposta può essere uno snippet che valuta il risultato corretto .
Cristian Lupascu,

1
Sembra che io abbia frainteso quel paragrafo.
Mi scuso

@ Mwr247 Nessun problema! :)
Cristian Lupascu,

6

Matlab / Octave, 40

Suppongo che i valori di input siano reali (non complessi). L'input è in una variabile d.

unique(d(sum(triu(bsxfun(@eq,d,d')))>1))

Provalo online in Octave.


Non è necessario inserire, puoi assumere i dati nella variabile 'd'
garg10may

1
@ garg10may Grazie. Aggiornato. Dovresti specificarlo nel tuo post
Luis Mendo,

L'output non è corretto quando d = [3, 0, 0, 1, 1, 0, 5, 3]. Ci sono due 0secondi.
alephalpha,

@alephalpha Grazie! corretto (altri 8 byte)
Luis Mendo,

Shorter: d(sum(triu(bsxfun(@eq,d,d')))==2). O in Ottava:d(sum(triu(d==d'))==2)
alephalpha,

6

Python 3.5, 30

[x for x in{*d}if~-d.count(x)]

Utilizza il disimballaggio impostato di Python 3.5. I ~-sottrae 1, che prende un conteggio di 1 a 0 che è Falsy.

Questo dà un elenco. Se dare un set è OK, allora usiamo una comprensione di set, salvando 1 carattere e senza la versione 3.5:

{x for x in d if~-d.count(x)}

SyntaxError: invalid syntaxper Python 3 è valido solo per 3.5? Quando python ha iniziato a diventare esoterico.
garg10may

@ garg10may Aspetta di vedere cosa ha in serbo il 3.6 ...
Sp3000,

1
@ Sp3000 Fantastico. Sembra lo stesso set-up di Scala. Infinitamente più leggibile di più alternative.
Carcigenicato,

6

PowerShell, 31 29 byte

($d|group|?{$_.Count-1}).Name

Presuppone che $dsia già popolato (come indicato), ad esempio $d=@(-34,0,1,-34,4,8,4).

Instrada l'array nel Group-Objectcmdlet, che raggruppa elementi simili e sputa fuori un oggetto che è essenzialmente un array di array. Lo instradiamo a un Where-Object(l' ?operatore) che ha Countpiù di uno (cioè, ci sono duplicati) e produciamo l'output .Namedi quegli elementi. Ha anche un vantaggio secondario nel preservare l'ordinamento iniziale.

Modifica: salvato due byte grazie a Danko Durbić


1
Penso che tu possa sostituire $_.Count-gt1con il $_.Count-1quale sarebbe vero per qualsiasi Countmaggiore di uno.
Danko Durbić,

@ DankoDurbić Eccellente!
AdmBorkBork,

6

APL (Dyalog Unicode) , 13 9 byte SBCS

Funzione prefisso tacito anonimo.

∊(⊂1↓⊣¨)⌸

Provalo online!

(... )⌸ per ciascun elemento univoco (argomento sinistro) e gli indici in cui si verifica (argomento destro), applica la seguente funzione tacita:

⊣¨ uno a sinistra (l'elemento unico) per ciascuno a destra (gli indici)

1↓ rilasciarne uno

 racchiudi (impedisce al riempimento con zeri di creare una matrice non sfilacciata)

ϵ nlist (appiattisci)


5

Julia, 30 29 byte

∪(d[find(sum(d.==d',1)-1)])

d.==d'crea una matrice simmetrica con il valore di i,jessere vero se d[i]==d[j]e falso altrimenti. summing in una dimensione e quindi sottraendo 1 produrrà zero se c'è solo uno dell'elemento e diverso da zero se ce n'è più di uno. findotterrà gli indici degli elementi diversi da zero, che verranno quindi utilizzati per indicizzare l'array dstesso. (unione) si comporta come uniquese usato in questo modo, rimuovendo le ripetizioni.

Vecchia soluzione:

∪(filter(i->sum(d.==i)>1,d))

Semplice: per ogni voce controlla se ce ne sono più di una nell'array. Quelli per i quali ce ne sono più di uno vengono restituiti da "filtro", e quindi (unione) si comporta come uniquese usato in questo modo, rimuovendo le ripetizioni.

Nota: originariamente lo aveva come funzione, ma la domanda consente all'array di essere memorizzato in una variabile, per la quale ho scelto dcome suggerito nella domanda.


5

Python 2.7, 36 42

list(set(filter(lambda x:d.count(x)>1,d)))

modifica : racchiude l'espressione con la lista (..) per conformarsi al formato richiesto nella domanda


questo non genererà un elenco
garg10may

Quindi devo circondare il mio frammento con una chiamata all'elenco (...)?
Dieter,

Sì, l'output dovrebbe essere solo un array.
garg10may


5

R, 31 24 byte

Grazie a flodel per i 7 byte.

Supponendo che l'ingresso sia già in d.

codice:

unique(d[duplicated(d)])

modifica: ora emette correttamente se ci sono più di 2 duplicati come indicato da aditsu .


2
Sembra bellissimo! Ma il quarto caso di test non sembra essere corretto ...
aditsu

1
È possibile rimuovere whichpoiché [accetta anche un argomento logico.
flodel

5

Python 3 - 33 30 byte

{_ for _ in d if d.count(_)>1}

Uscita Repl, d come input.



4

Pyth, 7 byte

ft/QT{Q

Spiegazione:

ft/QT{Q
           Q = eval(input())
     {Q    set(Q) - deduplicate
f          filter - with T as the filter variable.
  /QT      count in Q of T
 t         minus 1.

Il filtro rimuove tutti gli elementi che appaiono esattamente una volta dal set di elementi.


4

LINQ, 62 54 byte

Un po 'nuovo qui, ma qui non va niente.

d.GroupBy(c=>c).Where(g=>g.Count()>1).Select(g=>g.Key)

Benvenuti nel sito! Non conosco LINQ, ma c'è qualche spazio bianco che probabilmente puoi rimuovere da questo per migliorare il tuo punteggio.
DLosc,

4

K (oK) , 7 byte

Soluzione:

&1<#:'=

Provalo online!

Spiegazione:

&1<#:'= / the solution
      = / group, key => value (index)
   #:'  / count length of each group
 1<     / 1 less than 
&       / keys where true

3

Shell + GNU coreutils, 12

sort|uniq -d

Uscita di prova:

$ printf "%s\n" -34 0 1 -34 4 8 4 | ./nonuniq.sh 
-34
4
$ 

3

Mathematica, 23 byte

Con input archiviato in d:

Pick[#,#2>1]&@@@Tally@d

Come funzione, 24 byte:

Pick[#,#2>1]&@@@Tally@#&

per esempio, con

d = {3, 0, 0, 1, 1, 0, 5, 3}
Tally@d

restituisce questo:

   {{3, 2},
    {0, 3},
    {1, 2},
    {5, 1}}

(il primo elemento di ciascun elenco secondario è l'elemento, il secondo è la frequenza di occorrenza). L'applicazione a questo elenco lo Pick[#,#2>1]&@@@trasforma in

{Pick[3,2>1], Pick[0,3>1], Pick[1,2>1], Pick[5,1>1]}

E dove il secondo argomento di Pickrestituisce Trueviene restituito il primo argomento.


3

K (non K5), 10 byte

x@&1<#:'=x

Presuppone che sia inserito x. Ho pensato che sarebbe stato divertente dare una risposta diversa da K5!


3

Perl 6, 16 byte

Supponendo che l'elenco sia archiviato, $_è possibile utilizzare uno dei seguenti frammenti.
(che è stato specificamente consentito)

(--«.BagHash).Set.keys # 23 bytes
keys .Bag (-) .Set # 18 bytes
# U+2216 SET MINUS
keys .Bag∖.Set # 16 bytes in utf8

Se non ti importa di ottenere una borsa, potresti lasciarla keys .

$_ = [3, 0, 0, 1, 1, 0, 5, 3];
.Bag∖.Set  3 # True
.Bag∖.Set  5 # False

Nessuno di questi ha il limite di lavorare solo su numeri interi con segno, o anche solo numeri per quella materia.

say keys .Bag∖.Set given |(<a b c d a a c>), 1/3, 2/3 - 1/3;
# (a c 0.333333)



2

Lisp comune, 57 byte

(remove-duplicates(remove-if(lambda(x)(<(count x d)2))d))

2

Ottava, 33 byte

[~,a]=unique(d);d(a)=[];unique(d)
  • Trova gli indici della prima occorrenza di ogni intero univoco,
  • rimuove tali occorrenze e
  • trova gli elementi univoci dell'array rimanente.

Eccolo su ideone . Ho racchiuso lo snippet in una funzione in modo da poterlo chiamare usando tutti gli input di esempio.


2

Java 8, 80 byte

x.stream().filter(i->x.indexOf(i)!=x.lastIndexOf(i)).collect(Collectors.toSet())

Supponendo che x contenga l'input Elenco di numeri.


2

PHP, 35 37 byte

Abbastanza diretto:

array_diff_key($a,array_unique($a))

Come nota: non ho aggiunto il ;alla fine della riga, come afferma la domanda:

La tua risposta potrebbe essere uno snippet che presuppone che l'input sia archiviato in una variabile (d, diciamo) e valuta il risultato corretto

Quindi questo frammento può essere utilizzato in questo modo e valuta il risultato corretto:

print implode(' ', array_diff_key($a,array_unique($a)));

Un'altra nota

Il codice sopra riportato funziona per tutti i casi di test forniti nella sfida. In quelli tutti i personaggi non unici sono al massimo duplicati. Se un elemento può verificarsi più di due volte, ne array_unique()sarebbe necessario un altro , che aumenta la lunghezza a 49 byte :

array_unique(array_diff_key($a,array_unique($a)))

Le modifiche

  • Salvato 2 byte sostituendo array_diff_assoccon array_diff_key. Grazie a Jörg Hülsermann .

1
array_diff_keyinvecearray_diff_assoc
Jörg Hülsermann

@ JörgHülsermann Buona cattura. Grazie. Daremo un'occhiata ai tuoi altri suggerimenti entro i prossimi giorni.
insertusernamehere
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.