Стрічка в часі


12

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

`A = [1,1,1,2,7,10]` and `bin_size = 2`.

`O = [4,0,0,1,1]`.

Чому ? З a bin_size = 2, у нас будуть такі інтервали:, (0,2], (2,4], (4,6], (6,8], (8,10]де чотири елементи (1,1,1,2)знаходяться у першому інтервалі (0,2], жоден у другому та третьому інтервалах, один 7у інтервалі (6,8]та один 10у інтервалі (8,10].

Ваш код повинен враховувати кожен інтервал довжини, bin_sizeпочинаючи з 0і рахувати, скільки Aв кожному номері є. Ви завжди повинні включати правий кінець інтервалу у відро, так що в наведеному вище прикладі 2включено до числа 4. Ваш код повинен працювати в лінійний час у сумі довжин вводу та виводу.

Більше прикладів:

`A = [1,2,7,12,15]`  and `bin_size = 5`.

`O = [2, 1, 2]`.

`A = [1,2,7,12,15]`  and `bin_size = 3`.

`O = [2,0,1,1,1]`.

Ви можете припустити, що введення та вихід можуть бути надані у будь-якому зручному для вас форматі. Ви можете використовувати будь-які мови та бібліотеки, які вам подобаються.


Чи 0дозволені виходи із задніми s? То повертається [2,0,1,1,1,0]замість [2,0,1,1,1]?
Кевін Кройсейсен

Ніяких задніх нулів, будь ласка.

2
А як щодо ситуацій, коли значення максимуму масиву не кратне bin_size, чи ми справді повинні вирішувати це? Здається, більшість відповідей так, але якщо так, то було б непогано додати тестовий випадок для цього сценарію, щоб запобігти плутанині.
Кирило Л.

@KirillL. Так, з ними теж слід поводитися.

1
@GPS 0 не є додатним цілим числом. Це не випадково :)

Відповіді:


9

R , 48 байт

function(n,s)table(cut(n,0:ceiling(max(n)/s)*s))

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

Ще раз, tableі cutнамагайтеся factorзробити трюк для бінінгу. Виходи пойменований vectorде namesзнаходяться інтервали, в інтервального нотації, наприклад, (0,5].

EDIT: Повернення до попередньої версії, яка працює, коли sне ділиться n.


Я дійсно не R, але в TIO це, здається, виводить format you [most likely do not] find convenientбез tableчастини.
мій займенник monicareinstate

@someone саме тому воно і є. cutрозбиває вектор на фактори з рівнями, заданими інтервалами, і tableпідраховує входження кожного унікального значення у його вхід.
Джузеппе

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

1
Не повністю перевірено, але я думаю, ви можете зберегти пару байтів, замінивши 0:ceiling(max(n)/s)*sїх seq(0,max(n)+s-1,s). Це працює принаймні для двох зразків у питанні.
Грегор Томас

1
@Gregor Хм, якщо це не працює, 1:max(n/s+1)*s-sце ще одне поліпшення, оскільки два рівноцінні
Джузеппе



3

Python 2 , 62 байти

I,s=input()
B=[0]*(~-I[-1]/s+1)
for i in I:B[~-i/s]+=1
print B

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


1
Перш за все: приємна відповідь, я вже поставив це +1 (і створив порт на Java, тому що він трохи коротший, ніж у мене). Проте нульові нулі заборонені (просто запитували ОП), тому I[-1]/s+1слід бути ~-I[-1]/s+1замість цього.
Кевін Кройсейсен

@KevinCruijssen Дякуємо за повідомлення!
Мертвий Поссум

3

05AB1E , 18 байт

θs/Å0¹vDyI/î<©è>®ǝ

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


Я не знаю, що 05AB1E так добре, але це, здається, викликає A.count max (A) , тому час виконання не лінійно в len (A) + len (O) . Це правильно чи я щось помилився?
Денніс

@ Денніс підрахунок буде O(max(A)*max(A))... так що це квадратичний на максимумі A ... OP вказав, що він повинен бути лінійним в плані ... що саме?
Чарівний восьминога Урна

2
@MagicOctopusUrn Ваш код повинен працювати в лінійний час у сумі довжин вводу та виводу , згідно останньої редакції.
Денніс

2
@Dennis, що здається досить довільним.
Чарівна восьминога урна

2
@MagicOctopusUrn Я думаю, що це єдине розумне визначення лінійного часу для цього питання.

2

APL + WIN, 23 байти

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

+⌿<\v∘.≤b×⍳⌈⌈/(v←⎕)÷b←⎕    

Пояснення:

⎕ Prompt for input

⌈⌈/(v←⎕)÷b←⎕ divide the integers by bin size, take maximum and round up for number of bins

b×⍳ take number of bins from previous step and create a vector of bin upper boundaries

v∘.≤ apply outer product to generate boolean matrix where elements of vector ≤ boundaries

<\ switch off all 1's after first 1 in each row to filter multiple bin allocations

+⌿ sum columns for the result


2

Java 8, 75 байт

a->b->{var r=new int[~-a[a.length-1]/b+1];for(int i:a)r[~-i/b]++;return r;}

Порт @ DeadPossum's Python 2 відповідь , тому обов'язково підтримайте його відповідь!

Пояснення:

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

a->b->{          // Method with integer-array and integer parameters and no return-type
  var r=new int[~-a[a.length-1]/b+1];
                 //  Result integer-array of size `((last_item-1)/bin_length)+1`
  for(int i:a)   //  Loop over the input-array
    r[~-i/b]++;  //   Increase the value at index `(i+1)/bin_length` by 1
  return r;}     //  Return the result-array


2

JavaScript (ES6), 60 байт / O (len (a) + max (a) / n)

Збережено 5 байт завдяки @Neil

Здійснює введення в синтаксис currying (a)(n).

a=>n=>[...a.map(x=>o[x=~-x/n|0]=-~o[x],o=[])&&o].map(n=>~~n)

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

Або просто 43 байти / O (len (a)), якщо пусті елементи дозволені.


[...o].map(n=>n|0)отримує перший вихід з другого рішення в меншій кількості байтів.
Ніл

@Neil Не впевнений, чому я пішов на щось таке перекручене. : - /
Арнольд


1

Pyth, 23 22 байти

Jm/tdeQhQK*]ZheJhXRK1J

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

Jm/tdeQhQK*]ZheJhXRK1J
Jm/tdeQhQ                 Find the bin for each time and save them as J.
         K*]ZheJ          Create empty bins.
                 XRK1J    Increment the bins for each time within them.
                h         Take the first (because mapping returned copies).

1

Рубі , 53 50 байт

Редагувати: -3 байти від iamnotmaynard.

->a,b{(0..~-a.max/b).map{|i|a.count{|x|~-x/b==i}}}

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


Це не працює, коли a.maxне є кратним b(напр. f[[1,1,1,2,7,10],3]=>, [4, 0, 1]Але має дати [4, 0, 2]). Я спробував той самий підхід.
Відновіть Моніку - не Мейнард

(Або , швидше за [4, 0, 1, 1])
відновило Моніка - notmaynard

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


Приємно, ще краще, дякую.
Кирило Л.

1

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

C (стук) , 53 байти

i,j;f(*A,l,b,*O){for(j=0;j<l;O[(A[j++]+b-1)/b-1]++);}

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

Це рішення приймає такі параметри: довжина
Aвхідного масиву сховища bin_size для виводу. Повинна бути достатня довжина і повертає вихід у О.
l
b
O

Це рішення має гандикап: воно не повертає довжину вихідного масиву O, і тому абонент не знає, скільки друкувати.

Наступна версія долає цей гандикап:

C (стук) , 79 байт

i,j,k;f(*A,l,b,*O,*m){for(k=j=0;j<l;O[i=(A[j++]+b-1)/b-1]++,k=k>i?k:i);*m=++k;}

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

Він бере додатковий параметр mі повертає Oв ньому довжину . Це коштувало мені 26 байт.


1

C (gcc) , 102 90 89 86 байт

#define P!printf("%d ",k)
i,j,k;f(s){for(i=s;~scanf("%d",&j);k++)for(;j>i;i+=s)k=P;P;}

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

Дякуємо Кевіну Крейсейну за зменшення кількості 12 байт, а також котлів для стелі ще 4 байти!


1
90 байт за допомогою циклів for-циклів, видалення intта зміни ==1на >0.
Kevin Cruijssen

Ласкаво просимо. Btw, лише примітка, наразі вона недійсна (як і моя видалена відповідь на Java). Це потрібно запустити O(n)вчасно, тому у вас не може бути вкладених циклів. (Ваша відповідь на C ++ здається чудовою. Хоча я цей + 1-й редактор. :))
Кевін Круїссен

Це все ще O (n). Внутрішній цикл завжди буде надрукувати значення, а ми друкуємо лише (максимальне значення + 1) / величину розміру.
Г. Сліпен

Хм, але це не зовнішній цикл, вже O(n)перебираючи елементи введення. Навіть якщо внутрішня петля буде циклічна лише в 2 рази, це вже вище O(n). Або я щось нерозумію .. Я мушу визнати, що Oчасом насправді не моя експертиза ..
Кевін Круїссен

1
Але внутрішній цикл не повторюється над усіма вхідними елементами, він лише повторює скільки-небудь вихідні значення, які він повинен надрукувати, щоб "наздогнати" позицію, що відповідає останньому вхідному елементу. Якщо вхідний вектор складається з безлічі дублікатів або значень, які відрізняються менше розміру біна, внутрішній цикл взагалі не буде виконувати жодних ітерацій. З іншого боку, якщо вхідний вектор дуже рідкий, то внутрішня петля виконає більше ітерацій, друкуючи 0. Отже, щоб бути правильним, код працює за О ((кількість вхідних елементів) + (останній елемент / розмір бін)). Це все ще лінійно.
Г. Сліпен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.