Порахуйте випадки набору в списку


15

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

Підказка: набір - це не упорядкований список унікальних предметів.

Застосовуються правила вводу / виводу за замовчуванням .

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


Тестові приклади:

["apple", "banana"], ["apple", "pear", "apple", "banana", "banana"] => 2

["apple", "banana"], ["apple", "pear", "apple", "banana", "apple"] => 1

["apple", "banana", "pear"], ["apple", "banana", "kiwi", "apple"] => 0

["coconut"], [] => 0

EDIT: видалено речення, вказуючи, що параметри введення визначені в локальній області. Це суперечить вищезазначеним правилам вводу-виводу за замовчуванням.


Так, це пояснює. Однак я трохи затримався на третьому реченні. Що ви маєте на увазі під "не обробляє об'єкти"?
Пост Рок Гарф Мисливець

@WheatWizard деякі мови не орієнтовані на об'єкти і не знають поняття порівняння довільних об'єктів.
Hubert Grzeskowiak

1
Ви, ймовірно, повинні змінити це на об'єктно-орієнтований, оскільки кожна мова, яку я знаю, обробляє об'єкти певного типу, навіть якщо об'єкти є закритим класом. Я також повинен зазначити, що є багато мов, які також взагалі не можуть обробляти рядки.
Опублікувати Rock Garf Hunter

@WheatWizard добре, оновлений опис. Цей абзац був призначений для таких мов, як C, Assembler або Maple.
Hubert Grzeskowiak

Які мови об'єктно орієнтовані? Що вони повинні використовувати, якщо не рядки? Я думаю, що найпростіше було б обмежитися лише рядками. Або, як варіант, лише цілі числа. Дивіться цю пораду щодо використання найпростішого типу, який достатній.
xnor

Відповіді:


12

Пітон, 30 байт

lambda s,l:min(map(l.count,s))

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


Хороший. Не думав про використання карти. Ви можете трохи заощадити, використовуючи друк замість визначення лямбда-BTW.
Hubert Grzeskowiak

1
@HubertGrzeskowiak Зміна lambdaдо printпризводить байт рахувати до 37 через двох input()секунд , необхідних.
Опублікувати Rock Garf Hunter

@WheatWizard, як зазначено в виклику, врахуйте вхідні дані, визначені в локальному масштабі. Вам НЕ потрібно, щоб входи були чітко визначені, наприклад, як параметри функцій або введення користувачів.
Хуберт Ґшесков'як

@HubertGrzeskowiak, якщо для цього немає вагомих причин, ви не повинні замінювати наші параметри за замовчуванням для прийому вводу та виводу, а також наші за замовчуванням для подання
кодгольфа

@ovs о, я не знав про цю посаду. Спасибі.
Губерт Ґжесковяк


6

Желе , 6 5 4 байти

ċ@€Ṃ

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

Перший аргумент програми - це набір, а другий аргумент - список.

Пояснення

ċ@€Ṃ
ċ@   -- Create a link which finds the number of occurrences of 
          its left argument in its right argument (the list)
  €  -- Map this link over each element in the first argument
          of the program (the set)
   Ṃ -- Minimum value of this.

-1 байт завдяки @ETHproductions

-1 байт знову завдяки @ETHproductions


Дуже хороша! Ви можете зберегти байт, об'єднавши посилання в один рядок: у ⁹ċ$€Ṃмене є відчуття, яке можна скоротити, скориставшись неявним правильним аргументом замість ...
ETHproductions

Я думаю, що ċ@€Ṃ працює, щоб зберегти ще один байт ... ( @повертає аргументи до ċ)
ETHproductions

@ETHproductions працює правильно, наскільки я перевірив.
fireflame241

Він існував до 12 травня минулого року, але замість @€(із зворотними аргументами до програми) зберігається ще один байт: Спробуйте в Інтернеті!
Непов’язана струна


5

JavaScript (ES6), 64 байти

(s,l)=>l.map(e=>m[s.indexOf(e)]++,m=s.map(e=>0))&&Math.min(...m)

Передбачає обидва sі lє масивами об'єктів. Використовується сувора рівність JavaScript для порівнянь, наприклад [] === [], хибна.


Дуже цікаве рішення. Поверніть або роздрукуйте результат. AFAIK це повертає анонімну функцію.
Hubert Grzeskowiak

2
@HubertGrzeskowiak Код, як показано, оцінює анонімну функцію. При виклику функція повертає кількість за бажанням.
Ніл

4

Хаскелл , 37 34 байт

Дякуємо @Laikoni за бриття трьох байтів.

s#l=minimum[sum[1|y<-l,y==x]|x<-s]

Зателефонуйте, (set::[a]) # (list::[a])де aпоходить будь-який тип Eq.


Замість length[y|y<-l,y==x]вас можна використовувати sum[1|y<-l,y==x].
Лайконі

@Laikoni, ти впевнений у цьому? Я думаю, мені потрібно використовувати щось на кшталт sum[1|y<-l,y==x,_<-y], що виходить на два байти довше - я, безумовно, щось там міг пропустити
Джуліан Вольф

Неважливо, ви точно маєте рацію. Гарний дзвінок.
Джуліан Вольф


3

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

Min[#/.Rule@@@Tally@#2]&

Чиста функція, що приймає два списки як аргументи у запропонованому порядку та повертає неотримкове ціле число. Tallyпідраховує кількість зустрічей кожного символу у списку вхідних даних і #/.Rule@@@перетворює кожен елемент набору входів у відповідне число подій.


3

T-SQL, 62 59 байт

Попередня версія не працювала для наборів без збігів

select top 1(select count(*)from l where l=s)from s order by 1

З s і l як таблиці та стовпці, названі так само, як табл

select top 1         -- return only the first result
    (select count(*) -- count of rows
     from l          -- from table l
     where l=s)      -- for each l equal
from s               -- to each from s
order by 1           -- sort by count ascending

3

Свіфт, 39 байт

s.map{w in l.filter{$0==w}.count}.min()

пояснення:

s.map{} пройде через кожне слово в s і створить масив підрахунків

w in називає відображене слово для використання у наступному фільтрі

l.filter{} призначає фільтр до масиву l

$0==w - це умова фільтра, що відповідає слову w

.count дає кількість елементів l, які відповідали умові

.min() повертає найменший підрахунок у відображеному результаті


1
Ласкаво просимо до PPCG! Я додав форматування коду для вашого рішення. Це можна зробити, попередньо додавши 4 пробіли до рядків, що містять код.
Мего

3

APL (Dyalog) , 9 байт

⌊/+/⎕∘.≡⎕

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

 отримати оцінений вхід (список рядків)

⎕∘.≡ отримати оцінений вхід (не порожній набір рядків) та створити таблицю еквівалентності

+/ додати поперек

⌊/ мінімум поперек


2

Perl 6 ,  37  18 байт

37

{+(($_=@^a⊍@^b)≽@a)&&.values.min}

Спробуй це

Розширено:

{
  +( # turn into a 0 if False

    (
      $_ =        # store into $_ the result of
        @^a  @^b # use the baggy multiplication operator
    )  @a        # is that the baggy superset of the set
  )

  &&          # if that is True

  .values.min # get the minimum value from the Bag in $_
}

Додаткову інформацію див. У розділі Набори, сумки та суміші .


18

{@^b.Bag{@^a}.min}

Спробуй це

Пояснення:

@^b.Bagстворити Мішок із
{@^a}клавіші значень у цій сумці (повертає список підрахунків),
.minщоб отримати мінімальне значення результуючого списку



Акуратні відповіді, але жодна з них не схожа на функції / завершені програми
Julian Wolf

@JulianWolf У мене було враження, що фрагменти дозволені на основі висловлювань "Вважайте, що обидва входи визначаються в поточній області як s і l" і "Вам не потрібно визначати функцію". Я перейшов і відредагував її все одно .
Бред Гілберт b2gills

Ах, ти абсолютно правий. Це, мабуть, було відредаговано у питанні після того, як я його прочитав. У будь-якому випадку мені подобається естетичність цієї версії навіть більше, ніж остання - синтаксис Перла завжди буде для мене загадкою.
Джуліан Вольф

@JulianWolf Це насправді не хороший приклад коду Perl 6. Я б рекомендував побачити 1-годинну розмову Овідія Perl 6 - Чому люди так захоплюються , або переглядати вкладку « Ресурси » на Perl6.org .
Бред Гілберт b2gills

Так, вибачте за плутанину. Це мій перший виклик, і я не знав, що вже є правила введення та виведення даних. Я змінив це, тому що більшість відповідей використовували ці правила навіть тоді, коли цього не вимагали.
Хуберт Ґжесков'як

2

Аксіома, 42 байти

f(a,b)==reduce(min,[count(x,b)for x in a])

код тесту та результати

(28) -> f(["1","2"], ["1", "2", "1", "1", "7"])
   (28)  1
                                                    Type: PositiveInteger
(29) -> f(["apple","banana"],["apple","pear","apple","banana","banana"])
   (29)  2
                                                    Type: PositiveInteger
(30) -> f(["apple","banana"],["apple","pear","apple","banana","apple"])
   (30)  1
                                                    Type: PositiveInteger
(31) -> f(["apple","banana","pear"],["apple","banana","kiwi","apple"])
   (31)  0

2

C ++, 203 201 байт

Дякуємо @Quentin за збереження двох байт!

#import<vector>
#import<string>
using T=std::vector<std::string>;
int f(T S,T L){for(int j,b,i=0;;++i)for(auto s:S){for(b=j=0;j<L.size();++j)if(L[j]==s){b=1;L.erase(begin(L)+j);break;}if(!b)return i;}}

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


L.begin()-> begin(L)економить один байт :)
Квентін

Також using T=std::vector<std::string>;економить інше! Хто знав, що сучасний гарний синтаксис також може допомогти гольфу.
Квентін

@Quentin Я спробував це спочатку. Напевно, був якийсь простий друк, якого я не помітив.
Steadybox


1

Pyth, 5 байт

hS/LF

Приймає список першим, а встановлений другим. Тестовий набір.

Пояснення:

    F  Expand the input into l and s (not literally, 
                  since those are function names in Pyth, but...)
   L   for d in s:
  /        Count instances of d in l
   L   Package all the results as a list
 S     Sort the results smallest-first
h      grab the smallest element


1

Java, 135 байт

int f(List<String> s,List<String> l){int n=0,i=0;while(i<s.size()){if(!l.remove(s.get(i++)))break;if(i==s.size()){n++;i=0;}};return n;}

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

РЕДАКТУВАННЯ : обернутий код у функції. Дякуємо @Steadybox


Відповіддю може бути повна програма, функція або якась інша функціональна конструкція . Ви можете взяти параметри, наприклад, як аргументи функції або зі стандартного вводу.
Steadybox


1

Java, 114 байт

<T>int a(Set<T>b,List<T>c){int m=2e32;b.stream().map(i->{int j=java.util.Collections.frequency(c,i);m=j<m?j:m;});return m;}

Тіо скоро

Пояснення

  • створює локальну змінну m.

  • відображає набір потоку.

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

  • повертає m, що є кількістю повних версій набору


0

R 54 байт

f<-function(s,l) min(table(factor(l[l%in%s],levels=s)))

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

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


0

R, 61 57 44 байт

print(min(sapply(s,function(x)sum(l%in%x))))

Анонімна функція. Мабуть, вам не потрібно визначати функцію для цього завдання. Збережено 13 байт завдяки підрахунку.

Пояснення:

sum(l%in%x))повертає кількість sзнайдених рядків у l.

lapply(s,function(x))застосовує це до кожного рядка sокремо і повертає список сум.

min() повертає найменшого зі списку.


Could be brought down to 40 Bytes with a for-loop: z=c();for(i in s)z[i]=sum(l%in%i);min(z)
count

Or even further to 37 bytes with sapply: min(sapply(s,function(x)sum(l%in%x)))
count

Brilliant, I always forget you can sum booleans. I'll edit that in later. I've been told I need that print() if it's not a function.
BLT

0

JavaScript (ES6), 59 bytes

a=>b=>a.reduce((x,y)=>(l=b.filter(s=>s==y).length)>x?x:l)|0

Try it

f=

a=>b=>a.reduce((x,y)=>(l=b.filter(s=>s==y).length)>x?x:l)|0

console.log(f(["apple","banana"])(["apple","pear","apple","banana","banana"]))
console.log(f(["apple","banana"])(["apple", "pear", "apple", "banana", "apple"]))
console.log(f(["apple","banana","pear"])(["apple","banana","kiwi","apple"]))
console.log(f(["coconut"])([]))

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