Максимально розширити цілі інтервали


14

Припустимо, вам задано набір непересічних інтервалів цілих чисел [a1,b1],[a2,b2],[a3,b3],...,[aN,bN]. (Де [a,b]множина цілих чисел більша або дорівнює aі менша або дорівнює b.)

Інтервал в індексі Xохоплює bX - aX + 1значення. Ми зателефонуємо на цей номер cX.

Враховуючи, що кожен інтервал може бути або ...

  • незмінний (залишається таким [aX,bX]),
  • простягнутий праворуч до +сторони від номера, лінія на cX(стає [aX,bX + cX]),
  • або простягнутий ліворуч до -сторони від нумерації лінії cX(стає [aX - cX,bX]),

яка максимальна кількість значень, які можуть бути охоплені об'єднанням усіх оновлених інтервалів, враховуючи, що вони все ще не перетинаються?

Напишіть функцію або програму, яка приймає рядок форми [a1,b1],[a2,b2],[a3,b3],...,[aN,bN]і обчислює цей максимум. Якщо ви пишете функцію, поверніть значення. Якщо ви пишете повну програму, використовуйте stdin для введення та друкуйте значення для stdout (або використовуйте найближчі альтернативи).

Ви можете припустити, що всі значення знаходяться в межах нормально підписаних 32-бітових цілих чисел, і aXце менше або дорівнює bXдля всіх індексів X. Інтервали можуть бути в будь-якому порядку, вони не обов'язково завжди збільшуються. Вони повинні бути задані у вигляді рядка у форматі, наведеному вище. Рядок може бути порожнім, і в цьому випадку відповідь буде 0.

Виграє найкоротше подання в байтах .

Приклад

Якщо вхідний [-3,0],[1,2],[4,9]висновок був би 22. Середній інтервал не має можливості розширюватися в будь-якому випадку, тому він повинен залишатися незмінним. Ліві і праві інтервали можуть одночасно бути поширені на [-7,0]і [4,15]відповідно. Об'єднання [-7,0]і [1,2]і [4,15]містить всі значення від -7 до 15 років , за винятком 3. Це 22 значень.


3
Чи можемо ми використовувати для введення нативне представлення рідних рядків нашого мовного масиву, чи це має бути саме цей формат?
Мартін Ендер

@ MartinBüttner Ні. Вам потрібно використовувати саме цей формат. (Я знаю, що такий меч з двома кінцями, але це так, як він йде.)
Захоплення Кальвіна

Чи можете ви розширити заданий інтервал з обох сторін? Наприклад, може [5,6]стати [3,8](для відповіді 6), чи може бути просто [5,8]або [3,6](для відповіді 4)?
MtnViewMark

@MtnViewMark Ні. Їх можна продовжити лише з одного боку (або зовсім не буде)
Захоплення Кальвіна

Відповіді:


4

Haskell, 145 байт

import Data.List
x=maximum.map length.filter(nub>>=(==)).map concat.sequence.map(\[a,b]->[[2*a-b-1..b],[a..b],[a..2*b-a+1]]).read.('[':).(++"]")

Проби:

λ: x ""
0

λ: x "[5,6]"
4

λ: x "[-3,0],[1,2],[4,9]"
22

1

R, 282 278 269 247

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

f=function(s){i=matrix(strtoi(strsplit(gsub('[^0-9,-]','',s),',')[[1]]),nrow=2);l=0;if((a<-length(b<-order(i[1,])))>0){if(a>1)i=i[,b];l=diff(i[,1:a])+1;x=c(t(i));for(n in 1:a)if(n==1|n==a|x[n]-l[n]>x[n+a-1]|x[n+a]+l[n]<x[n+1])l[n]=l[n]*2;};sum(l)}

По суті ідея така

  • Візьміть рядок і перетворіть його в матрицю з 2 рядками
  • Переконайтесь, що це в правильному порядку
  • Опрацюйте відмінності для кожного стовпця
  • Подвійні перші та останні різниці
  • Подвойте середні відмінності, якщо вони мають достатньо великий зазор до попереднього чи наступного
  • Поверніть суму різниць

Редагувати: зрозумів, що я спочатку списав символи, а потім переставив декілька речей, щоб поголити декілька.

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