Не унікальні елементи


24

Напишіть програму, яка знаходить не унікальні елементи масиву підписаних цілих чисел. Отриманий масив може бути в будь-якому порядку.

Ваша відповідь може бути фрагментом, який передбачає, що вхід зберігається у змінній ( dскажімо) та оцінює правильний результат.

Випробування

Кожен тестовий випадок - це один рядок у форматі input => 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]

Порядок елементів не має значення.

Це кодовий гольф, тому найкоротша відповідь (у байтах) виграє.



1
так як це для масиву цілих чисел код буде іншим. Я думаю набагато коротше. Тобто для струни.
garg10 травня

1
Чи дозволяється нам приймати введення як рядки, а не як масив? Наприклад, замість того [-1, 0, 1], чи можемо ми ввести (замінити \ n новими рядками) "-1\n0\n1":?
Аддісон Кримп

1
Чи повинен виводити список чи буде прийнятний набір?
Денніс

І чи має воно виводитись у такому форматі?
Аддісон Кримп

Відповіді:


16

К5 , 5 байт

Припустимо, що вхід вже в змінній, званій d,

?d^?d

Візьміть чіткі елементи ( ?) d, за винятком ( d^) відмінних елементів d ( ?d). Приємно симетрично, ні? Це працює, тому що оператор «крім» видаляє лише перший аргумент правого аргументу з лівого аргументу.

Більш загально,

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
 0 1 3
 -34 4)

Редагувати:

Якби ми хотіли зберегти порядок першого появи не унікальних елементів, ми могли б змінити список джерел до та після того, як вилучимо унікальні елементи за допомогою, за винятком вартості 4 зайвих байтів:

  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

Припустимо, що масив вже знаходиться в змінній D (на основі цього коментаря ):

D{De=(},_&

Спробуйте в Інтернеті

Пояснення:

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

Примітка: додайте, pякщо ви хочете гарненько друкувати, інакше отриманий масив просто надрукується без роздільників за замовчуванням. Це прийнятно, оскільки питання вказує, що фрагмент потрібно лише "оцінити до правильного результату".

Стандартна версія вводу / виводу, 13:

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

Спробуйте в Інтернеті

Пояснення:

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 Я знайшов ще одну 13-байтну версію, перш ніж прочитати ваш коментар :) Він також зберігає замовлення.
адіцу

9

Хаскелл - 32

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

Досить короткий, навіть із імпортом. a \\ bвидаляє перше виникнення кожного елемента bз aі nubробить усі елементи списку унікальними.


7

Pyth, 7 байт

S{.-Q{Q

Спробуйте в Інтернеті.

Як це працює

Pyth автоматично зберігає оцінений вхід Qі друкує всі невикористані значення повернення.

     {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 байти

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

Я сподіваюся, що це нормально, якщо цілі числа зберігаються в таблиці D? Це буде працювати як у SQLServer, PostgreSQL, так і, можливо, в інших. Завдяки @manatwork з 2-х байт.


Припустимо, що я - єдине поле в таблиці d, у PostgreSQL ви можете зменшити його select*from d group by 1having count(*)>1. (Аналізатор MySQL та SQLite також буде працювати з нерозділеною select*fromчастиною, але вони не розуміють 1having.)
манатура

@manatwork вітає це, сервер sql також розуміє select*from. Не подобається, 1havingхоча .. залишить це якI having
MickyT

6

Математика, 29 26 байт

Якщо вхід зберігається в d:

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

В іншому випадку це 29 байт як неназвана функція:

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

Тут d⋃d(або #⋃#) є гольф-трюк для видалення дублікатів - забираючи заданий союз із собою, Mathematica інтерпретує список як набір, видаляючи дублікати автоматично, в той час як власне об'єднання нічого не робить.

Після цього обидва способи просто фільтрують ті елементи, які відображаються у вихідному списку хоча б двічі.


6

JavaScript (ES6), 37 байт

Запустіть це в консолі JavaScript:

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

Це загальновизнано , що JavaScript необхідний якийсь - то явна функція «вихід / друку» (наприклад console.log, alertі т.д.) , щоб вважатися повним. Якщо у виклику сказано "написати програму або функцію", то повернення функції також достатньо. Окрім цього, дуже ефективне рішення!
Mwr247

1
@ Mwr247 У запитанні зазначено, що анвер може бути фрагментом, який оцінює правильний результат .
Крістіан Лупаску

1
Здається, я неправильно трактував цей абзац. Вибачення тоді =)
Mwr247

@ Mwr247 Немає проблем! :)
Крістіан Лупаску

6

Матлаб / Октава, 40

Я припускаю, що вхідні значення реальні (не складні). Вхід є змінною d.

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

Спробуйте його онлайн в Octave.


Не потрібно вводити дані, ви можете припустити дані у змінній 'd'
garg10may

1
@ garg10may Дякую Оновлено. Ви повинні вказати це у своєму дописі
Луїс Мендо

Вихід невірний, коли d = [3, 0, 0, 1, 1, 0, 5, 3]. Є два 0с.
алефальфа

@alephalpha Дякую! виправлено (ще 8 байт)
Луїс Мендо

Коротше: d(sum(triu(bsxfun(@eq,d,d')))==2). Або в Октаві:d(sum(triu(d==d'))==2)
алефальфа

6

Пітон 3,5, 30

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

Використовує розпакування набору Python 3.5. У ~-віднімає 1, який приймає відлік від 1 до 0 , який є Falsy.

Це дає список. Якщо встановити набір добре, ми використовуємо розуміння набору, зберігаючи 1 знак і не потребуючи версії 3.5:

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

SyntaxError: invalid syntaxдля Python 3 чи правда лише 3,5? Коли пітон почав набувати езотерики.
garg10may

@ garg10may Зачекайте, поки ви не побачите, що 3.6 має в магазині ...
Sp3000

1
@ Sp3000 Чудовий. Виглядає так само, як і Scala. Нескінченно легше читати, ніж більше альтернатив.
Carcigenicate

6

PowerShell, 31 29 байт

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

Передбачається , що $dвже заселена (як зазначено) - наприклад, $d=@(-34,0,1,-34,4,8,4).

З’єднує масив у Group-Objectкомандлет, який об'єднує однотипні елементи разом і виділяє об'єкт, який по суті є масивом масивів. Ми передаємо це Where-Object( ?оператору), у якого Countбільше одного (тобто є дублікати), і виводимо висновки .Nameцих елементів. Також є боковий бонус за збереження початкового замовлення.

Редагувати - збережено два байти завдяки Данко Дурбичу


1
Я думаю, ви можете замінити, $_.Count-gt1на $_.Count-1що було б справедливо будь-який Countбільший, ніж один.
Данько Дурбич

@ DankoDurbić Відмінно!
AdmBorkBork

6

APL (Dyalog Unicode) , 13 9 байт SBCS

Функція анонімного негласного префікса.

∊(⊂1↓⊣¨)⌸

Спробуйте в Інтернеті!

()⌸  Для кожного унікального елемента (лівий аргумент) та індексів, де він виникає (правий аргумент), застосуйте таку негласну функцію:

⊣¨ один зліва (унікальний елемент) для кожного праворуч (індекси)

1↓ скинути один

 укласти (запобігає прокладці нулями для створення не рваної матриці)

ϵ список (згладити)


5

Джулія, 30 29 байт

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

d.==d'створює симетричну матрицю, значення якої i,jє істинним, якщо d[i]==d[j]і неправдивим інакше. summing в одному вимірі, а потім віднімання 1 призведе до нуля, якщо є лише один елемент, а ненульовий, якщо є більше одного. findотримають індекси ненульових елементів, які потім використовуються для індексації самого масиву d. (союз) діє якunique коли використовується таким чином, видаляючи повтори.

Старе рішення:

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

Простий - для кожного запису він перевіряє, чи є в масиві більше одного. Ті, для яких є більше одного, повертаються «фільтром», а потім (об'єднання) діє такunique при використанні таким чином, видаляючи повтори.

Примітка: спочатку він мав його як функцію, але питання дозволяє масиву зберігатись у змінній, для якої я обрав dяк запропонований у питанні.


5

Пітон 2.7, 36 42

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

редагувати : оточив вираз списком (..), щоб відповідати формату, необхідному у запитанні


це буде встановити не список
garg10may

Тож чи повинен я оточити свій фрагмент закликом до списку (...)?
дітер

Так, вихід повинен бути лише масивом.
garg10 травня


5

R, 31 24 байт

Завдяки флоделі за 7 байт.

Припустимо, що вхід уже входить d.

код:

unique(d[duplicated(d)])

редагувати: тепер він виводить правильно, якщо є більше двох дублікатів, як вказано на aditsu .


2
Це красиво виглядає! Але 4 тестовий вигляд здається
невірним

1
Ви можете видалити, whichоскільки [також приймає логічний аргумент.
флодель



4

Pyth, 7 байт

ft/QT{Q

Пояснення:

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.

Фільтр видаляє всі елементи, які з’являються рівно один раз із набору елементів.


4

LINQ, 62 54 байти

Тут щось нове, але тут нічого не йде.

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

Ласкаво просимо на сайт! Я не знаю LINQ, але є деякий пробіл, який ви, ймовірно, можете видалити з цього, щоб покращити свою оцінку.
DLosc



3

Математика, 23 байти

З входом, збереженим у d:

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

Як функція, 24 байти:

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

наприклад, с

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

повертає це:

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

(перший елемент кожного списку - це елемент, другий - частота появи). Застосування до цього списку Pick[#,#2>1]&@@@перетворює його на

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

І там, де повертається другий аргумент Pickоцінки, до Trueпершого аргументу.


3

K (не K5), 10 байт

x@&1<#:'=x

Припускає, що вхід є в x. Я подумав, що було б весело зробити відповідь, що не K5!


3

Perl 6, 16 байт

Якщо припустити, що список зберігається у $_вас, ви можете використовувати будь-який із наведених нижче фрагментів.
(що було дозволено спеціально)

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

Якщо вам не байдуже, що ви отримаєте Сумку, ви можете піти keys .

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

Жодне з них не має обмеження працювати лише над підписаними цілими числами або навіть просто числами з цього питання.

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



2

Лист звичайний, 57 байт

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

2

Октава, 33 байти

[~,a]=unique(d);d(a)=[];unique(d)
  • Знаходить показники першого виникнення кожного унікального цілого числа,
  • видаляє ці події та
  • знаходить унікальні елементи масиву, що залишився.

Ось це на ideone . Я завернув фрагмент у функцію, щоб я міг викликати його, використовуючи всі зразки даних.


2

Java 8, 80 байт

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

Припускаючи, що x містить вхідний Список чисел.


2

PHP, 35 37 байт

Досить прямо вперед:

array_diff_key($a,array_unique($a))

Як зауваження: я не додав ;кінець рядка, як зазначено в запитаннях:

Ваша відповідь може бути фрагментом, який передбачає, що вхід зберігається в змінній (d, скажімо) і оцінює правильний результат

Тож цей фрагмент можна використовувати так і оцінює правильний результат:

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

Ще одна примітка

Наведений вище код працює для всіх тестових випадків, передбачених у виклику. У них усі не унікальні символи є максимум дублікатами. Якщо елемент може виникнути більше ніж у два рази, array_unique()знадобиться інший , який збільшує довжину до 49 байт :

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

Правки


1
array_diff_keyнатомістьarray_diff_assoc
Йорг Гюльсерманн

@ JörgHülsermann Хороший улов. Спасибі. Перегляньте ваші інші пропозиції протягом наступних днів.
Вставтекористувач туди
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.