Порахуйте повтори масиву


20

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

[234, 2, 12, 234, 5, 10, 1000, 2, 99, 234]

Це поверне 2, так як кожен з 234і 2більш ніж один раз.

[234, 2, 12, 234]
[2, 12, 234, 5, 10, 1000, 2]

Список ніколи не буде більше 100 к цілих чисел, а цілі числа у списку завжди будуть знаходитись у межах від -100k до 100k.

Цілі числа слід рахувати, якщо вони зустрічаються більше одного разу, тому якщо ціле число трапляється 3 рази, то воно все одно буде рахуватися лише як одне повторне ціле число.

Тестові кейси

[1, 10, 16, 4, 8, 10, 9, 19, 2, 15, 18, 19, 10, 9, 17, 15, 19, 5, 13, 20]  = 4
[11, 8, 6, 15, 9, 19, 2, 2, 4, 19, 14, 19, 13, 12, 16, 13, 0, 5, 0, 8]     = 5
[9, 7, 8, 16, 3, 9, 20, 19, 15, 6, 8, 4, 18, 14, 19, 12, 12, 16, 11, 19]   = 5
[10, 17, 17, 7, 2, 18, 7, 13, 3, 10, 1, 5, 15, 4, 6, 0, 19, 4, 17, 0]      = 5
[12, 7, 17, 13, 5, 3, 4, 15, 20, 15, 5, 18, 18, 18, 4, 8, 15, 13, 11, 13]  = 5
[0, 3, 6, 1, 5, 2, 16, 1, 6, 3, 12, 1, 16, 5, 4, 5, 6, 17, 4, 8]           = 6
[11, 19, 2, 3, 11, 15, 19, 8, 2, 12, 12, 20, 13, 18, 1, 11, 19, 7, 11, 2]  = 4
[6, 4, 11, 14, 17, 3, 17, 11, 2, 16, 14, 1, 2, 1, 15, 15, 12, 10, 11, 13]  = 6
[0, 19, 2, 0, 10, 10, 16, 9, 19, 9, 15, 0, 10, 18, 0, 17, 18, 18, 0, 9]    = 5
[1, 19, 17, 17, 0, 2, 14, 10, 10, 12, 5, 14, 16, 7, 15, 15, 18, 11, 17, 7] = 5

Що ви маєте на увазі під Once it counts the repetition, don't count again? Крім того, оскільки ми хочемо знайти повторення певного цілого числа, як би ми знали, яке ціле число шукати, якщо нам це не дано? Нарешті, тестові випадки трохи заплутані; які вихідні та які вхідні?
Втілення Невідомості

4
Я відредагував це, щоб спробувати зробити його трохи зрозумілішим. Це те, що ви задумали? Крім того, будь ласка, введіть відповіді для цих тестових випадків.
Rɪᴋᴇʀ

1
Я додав кілька відповідей до тестових випадків, вибачте, якщо я пішов їх неправильно
MickyT

1
Я проголосував за те, щоб закрити це питання, поки ви не підтвердите це, що ви задумали.
Rɪᴋᴇʀ

4
Пов'язані (виведіть не унікальні елементи замість кількості не унікальних елементів).
Кевін Кройсейсен

Відповіді:


15

R , 20 байт

Це те, що ти шукаєш? Використовує tableдля підрахунку подій кожного з scanвхідних значень. Тести, якщо підрахунок дорівнює> 1, підсумовують підсумки.

sum(table(scan())>1)

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


мій розум пішов duplicatedпершим - скромний tableтакий корисний для гольфу!
Джузеппе

Таблиця @giuseppe улюблена зараз :)
MickyT



7

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

-1 завдяки ngn

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

+/1<⊢∘≢⌸

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

+/ сума

1< чи 1 менше, ніж

 Для кожного унікального елемента:

⊢∘ ігнорування фактичного унікального елемента,

 кількість його виникнення


{1<≢⍵}⌸->1<⊢∘≢⌸
ngn

@ngn Дякую Включений.
Адам

6

C (ляскання) 175 117 95 байт

c(*a,*b){return*a-*b;}r(*l,m){qsort(l,m,4,c);return((!m||l[1]-*l)&l[-1]==*l)+(m?r(l+1,m-1):0);}

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

Це перший раз, коли я подав одну з них, тому повідомте мені, чи є проблеми із форматуванням чи що-небудь.

Оновлення з коментарів:

  • Від Джо Кінга від -58 до 117 байт
  • Від 80 до 95 байт лише для ASCII

оригінальне подання


5
Ласкаво просимо, приємний початок. Я не людина C, але ось посилання на поради щодо сторінки C із гольфу
MickyT

2
117 байт => d,i;c(*a,*b){return*a-*b;}r(l[],m){qsort(l,m,4,c);for(i=d=0;++i<m;)d+=((l[i+1]-l[i]||i>m-2)&&l[i-1]==l[i]);return d;}. Як зазначав @ ASCII, includes не впливає на складання вашої програми
Jo King,

2
@JoKing 100:d;c(*a,*b){return*a-*b;}r(*l,m){qsort(l,m,4,c);for(d=0;~m--;)d+=(!m||l[1]-*l)&l[-1]==*l++;return d;}
ASCII лише

1
@CollinPhillips так. як ви можете бачити на засланні я в курсі, він по- , як і раніше становить штраф без включає в себе
ASCII-тільки

2
95:c(*a,*b){return*a-*b;}r(*l,m){qsort(l,m,4,c);return((!m||l[1]-*l)&l[-1]==*l)+(m?r(l+1,m-1):0);}
Лише ASCII лише

5

C # (Visual C # Interactive Compiler) , 40 байт

n=>n.GroupBy(c=>c).Count(c=>c.Count()>1)

Перший проект специфікації був незрозумілим, і я вважав, що це означає повернути всі елементи, які з’являються не один раз. Це оновлена ​​версія.

Якось я не помітив, що мій код повертає кількість елементів, які з’явились один раз. Дякую Полу Караму за те, що це зробив!

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


1
Ваш вихід неправильний, він повинен рахувати елементи з 2 або більше випадками. Це повинно бути n=>n.GroupBy(c=>c).Count(c=>c.Count()>=2). ОП каже, що відповідь цього списку - 2. Ваш код повертається 5. Зміни, які я вам дав, повертає 2.
Пол Карам,

1
Або просто >1тримати кількість байтів
Пол Карам,

@PaulKaram Я цього не помітив, дякую!
Втілення Невідомості


4

J , 11 9 байт

-2 байти завдяки Йона!

1#.1<1#.=

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

Оригінальне рішення:

1#.(1<#)/.~

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

Пояснення:

        /.~   group the list by itself
   (   )      for each group
    1<#       is the length greater than 1
1#.           sum by base-1 conversion

Гей, Гален. 1#.1<1#.=для 9 байт + хороший ol 'само класифікувати розваги.
Йона

1
@Jonah Дякую! Чесно кажучи, я цього не знав.
Гален Іванов,

1
@Jonah Nice!
Адам

@ Adám, і тут мені було приємно, що я змусив J зв'язати APL. Знову згорнутий :)
Йона



3

Желе , 4 байти

ĠITL

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

... Або ĠIƇL

Як?

ĠITL - Link: list of integers   e.g. [234, 2, 12, 234, 5, 10, 1000, 2, 99, 234]
Ġ    - group indices by value        [[2,8],5,6,3,9,[1,4,10],7]
 I   - incremental differences       [[6],[],[],[],[],[3,6],[]]
  T  - truthy indices                [1,6]
   L - length                        2

буде фільтрувати, щоб зберегти лише триєдні результати I( [[6],[3,6]]), які також мають бажану довжину.




3

Java 8, 74 73 байт

L->L.stream().filter(i->L.indexOf(i)<L.lastIndexOf(i)).distinct().count()

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

Пояснення:

L->                      // Method with ArrayList parameter and integer return-type
  L.stream()             //  Create a stream of the input-list
   .filter(i->           //  Filter it by:
     L.indexOf(i)        //   Where the first index of a value
     <L.lastIndexOf(i))  //   is smaller than the last index of a value
   .distinct()           //  Deduplicate this filtered list
   .count()              //  And return the count of the remaining values

3

APL (Dyalog Extended) , 8 7 байт SBCS

Функція анонімного мовчазного префікса за методом Йона .

+/1<∪⍧⊢

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

+/ загальна кількість подій
  буквально становить суму Істин

1< де одна менша

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

 рахувати в

 немодифікований аргумент


3

Haskell , 41 байт

f(h:t)=sum[1|filter(==h)t==[h]]+f t
f _=0

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

Порахуйте суфікси, де перший елемент hз’являється рівно один раз у тій частині, tяка настає після.


Haskell , 40 байт

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

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

Викрадання методу з інших відповідей.


Блін, у нас була точно така ж відповідь
гордий haskeller

3

Haskell, 41 байт

f[]=0
f(a:s)=sum[1|filter(==a)s==[a]]+f s

Це рішення, по суті, підраховує, скільки елементів списку мають один і той же елемент, що з'являються рівно пізніше в списку.


2

Haskell , 47 байт

f[]=0
f(a:b)|x<-filter(/=a)b,x/=b=1+f x|1>0=f b

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

Це наївний підхід. Ймовірно, можна щось зробити для покращення цього.

f[]=0

Повертаємося 0до порожнього списку

f(a:b)

У випадку не порожнього списку, що починається з aта потім b.

|x<-filter(/=a)b,x/=b=1+f x

Якщо фільтрація aз bвідрізняється від b(тобто aв b) , то ми повернути більше 1 fзастосовується до bз aи відфільтровані.

|1>0=f b

Якщо фільтрація as не змінюється, bми просто fпереходимо через решту.

Ось ще один подібний підхід, який має однакову довжину:

f[]=0
f(a:b)|elem a b=1+f(filter(/=a)b)|1>0=f b

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



2

Мова Вольфрама 34 байти

 Length@DeleteCases[Gather@#,{x_}]&

Gatherгрупує однакові цілі числа у списки. DeleteCases[...{x_}]виключає списки, що містять єдине число. Lengthповертає кількість решти списків (кожен містить два чи більше однакових цілих чисел.


1
Count[{_,__}]@*Gather
алефальфа


2

Pyth, 6 байт

l{.-Q{

Спробуйте тут

Пояснення

l{.-Q{
     {Q   Deduplicate the (implicit) input.
  .-Q     Remove the first instance of each from the input.
l{        Count unique.


2

PHP, 39 байт

приємний привід використовувати змінні змінні :

foreach($argv as$v)$r+=++$$v==2;echo$r;

приймає дані з аргументів командного рядка. Запустіть -nrабо спробуйте в Інтернеті .


$argv[0]є -і що з’являється лише один раз в аргументах, тому це не впливає на результат.


1

Елемент , 40 байт

_(#'{"2:0+4:'~1+";~2=[''1+""]$2+'[(#]'}`

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

Для цього потрібно вводити точний формат [234, 2, 1000, 2, 99, 234](додається до)[] комою та пробілом між цілими числами).

Пояснення:

_                                        input
 (#                                      delete the [ at start of input
   '{"                               '}  WHILE the string is non-empty
   '{"2:                             '}    duplicate it
   '{"  0+                           '}    add 0 to coerce to integer (gets next number in array)
   '{"    4:                         '}    make 3 additional copies
   '{"      '                        '}    temporarily move 1 copy to control stack
   '{"       ~                       '}    fetch the current map value for given integer
   '{"        1+                     '}    increment map value
   '{"          "                    '}    retrieve temporary copy of integer (the key for the map)
   '{"           ;                   '}    store updated map value
   '{"            ~                  '}    fetch map value again (1 if 1st instance, 2 if 2nd, etc.)
   '{"             2=                '}    test for map value = 2, this is the first duplication
   '{"               [      ]        '}    IF
   '{"               [''    ]        '}      move stuff from main stack to control stack
   '{"               [  1+  ]        '}      increment the counter of duplicate (bottom of stack)
   '{"               [    ""]        '}      move stuff back to main stack
   '{"                       $       '}    take length of current integer
   '{"                        2+     '}    add 2 (for the comma and space)
   '{"                          '[  ]'}    FOR loop with that number
   '{"                          '[(#]'}      trim those many characters from front of input string
                                       ` output result

1

Сітківка 0,8,2 , 19 байт

O`.+
m`^(.+)(¶\1)+$

Спробуйте в Інтернеті! Посилання включає тестовий набір, який розділяє кожен рядок на коми. Пояснення:

O`.+

Сортувати рівні значення разом.

m`^(.+)(¶\1)+$

Порахуйте кількість пробіжок щонайменше двох значень.



1

Іржа, 126 байт

let f=|v:Vec<i32>|{let mut u=v.clone();u.sort();u.dedup();u.iter().filter(|i|v.iter().filter(|n|**n==**i).count()>1).count()};

Я здаюся. Це в основному те саме, що і Рубі. Існує "інший спосіб" створення масиву та індексації в ньому за допомогою значень вхідного вектора +100000, однак перетворення типів (як розмір / як i32) займає занадто багато місця.



1

k, 8 байт

+/1<#:'=

читається як: сума (довжина кожної групи)> 1

+/ is sum (plus over)

#:' is length each

= is group (ex. =1 2 1 6 7 2 generates 1 2 6 7!(0 2;1 5;,3;,4) (dictionary of unique value and its positions)

Використовуйте приклад (перший тестовий випадок)

+/1<#:'=1 10 16 4 8 10 9 19 2 15 18 19 10 9 17 15 19 5 13 20

пише 4

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.