Підрахунок редагувань, що враховують пільговий період


23

Коли ви редагуєте публікацію в SE, будь-які подальші зміни протягом 5-хвилинного періоду пільги об’єднуються в неї. З урахуванням списку разів редагування публікації, рахуйте зміни не в пільговий період.

Скажіть, ви редагуєте за кілька хвилин [0,3,4,7,9,10,11,12]. Це призводить до 3 редагувань часом [0,7,12], а решта відбувається в їх пільгові періоди.

0:  [3,4]
7:  [9,10,11]
12: []
  • Перша редакція - це хвилина 0. Зміни в 3 та 4 хвилинах знаходяться в межах 5-хвилинного періоду пільги, і тому не рахуйте.
  • Друга редакція - 7 хвилини. Правки в хвилинах 9, 10, 11 знаходяться в межах її пільгового періоду.
  • Третя редакція в хвилину 12 - це лише біля краю 5-хвилинного пільгового періоду, починаючи з 7 хвилини.

Отже, вихід 3.

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

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

[0]
[0,3,5,7]
[0,3,4,7,9,10,11,12]
[0,30,120]
[0,4,8,12,16]
[0,4,8,12,16,20]
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]
[0,5,10,15,20]
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
[0,1,4,5,9,11,12,14,16,18,23,24,26,28,29,30]

Виходи:

1
2
3
3
3
3
4
5
5
6

Для зручності копіювання, ось пари входів, виходів та вхід / вихід:

[[0], [0, 3, 5, 7], [0, 3, 4, 7, 9, 10, 11, 12], [0, 30, 120], [0, 4, 8, 12, 16], [0, 4, 8, 12, 16, 20], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [0, 5, 10, 15, 20], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], [0, 1, 4, 5, 9, 11, 12, 14, 16, 18, 23, 24, 26, 28, 29, 30]]
[1, 2, 3, 3, 3, 3, 4, 5, 5, 6]
[([0], 1), ([0, 3, 5, 7], 2), ([0, 3, 4, 7, 9, 10, 11, 12], 3), ([0, 30, 120], 3), ([0, 4, 8, 12, 16], 3), ([0, 4, 8, 12, 16, 20], 3), ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], 4), ([0, 5, 10, 15, 20], 5), ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], 5), ([0, 1, 4, 5, 9, 11, 12, 14, 16, 18, 23, 24, 26, 28, 29, 30], 6)]

Табло:


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

Відповіді:


20

JavaScript, 36 байт

f=$=>$>f&&1+f($.filter(b=>b-$[0]>4))

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

Як це працює

У кожному рекурсивному виклику ми видаляємо всі елементи з масиву, який знаходиться на відстані більше 4 хвилин від першого елемента.
Існує невеликий трюк зі змінною назвою $. Перевірка $>fспочатку перетворює масив у рядок, а потім порівнює його з представленням рядка функції, fа потім порівнює їх лексикографічно. Перший символ строкованого масиву - це цифра, а отже, лише однозначне ім'я змінної, індекс ascii менший, ніж індекси всіх цифр $. Заміна $будь-яким іншим ім'ям змінної завжди повернеться false.


3
Мені подобається цей сайт через такі відповіді.
Крістіан Лупаску

1
Дуже приємний трюк!
Арнольд

1
О, тепер це чудова хитрість!
Кудлатий

8

Математика, 46 40 37 33 байт

(i=1;j=0;#-j<5||(i++;j=#)&/@#;i)&

Пояснення

i=1;j=0

Встановіть iв 1і jв 0.

... /@#

Мапа на всі елементи введення ...

#-j<5||(i++;j=#)&

Якщо (element) - j < 5false, то приріст iі встановлюється jна елемент (оцінка короткого замикання).

;i

Вихідні дані i.



5

Python 2 , 58 байт

a=input()
x=[0]
for k in a:x+=[k]*(k-x[-1]>4)
print len(x)

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

  • Збережено 2 байти завдяки @Mr. Xcoder.

49 байт

f=lambda a:a>[]and-~f([x for x in a if x-a[0]>4])

Використовуючи рекурсивний метод, показаний у рішенні @ ThePirateBay .

  • Збережено байт завдяки @Mr. Xcoder.
  • Збережено 2 байти завдяки @Halvard Hummel.

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


and 1+f(...)можна замінити and-~f(...)на 49 байт
Містер Xcoder

@ Mr.Xcoder О, не можу забути всі ці побіжні хитрощі.
милі

x=a[:1]еквівалентно x=[0], оскільки в питанні прямо вказано, що перший елемент завжди 0( 62 байти )
Містер Xcoder



3

MATLAB, 34 байти

@(x)nnz(uniquetol(x+1,4/max(x+1)))

Анонімна функція, яка вводить масив і виводить число.

При цьому використовується uniquetolфункція, конкретно її форма y = uniquetol(x, t), яка надає yмістять унікальні елементи xз толерантністю t. При цьому функція, здається, дотримується "ледачого" підходу: сортуйте x, виберіть його перший запис та продовжуйте пропускати записи до тих пір, поки вони не відповідають допустимій кількості останнього вибраного запису. Це саме те, що тут потрібно.

uniquetolФункція автоматично масштабує заданий допуск за максимальною абсолютною величиною в a. Ось чому нам тут потрібен поділ. x+1використовується замістьx щоб уникнути поділу на 0.

Перевірка тестових випадків:

>> f = @(x)nnz(uniquetol(x+1,4/max(x+1)));
>> inputs = {...
       [0] ...
       [0,3,5,7] ...
       [0,3,4,7,9,10,11,12] ...
       [0,30,120] ...
       [0,4,8,12,16] ...
       [0,4,8,12,16,20] ...
       [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19] ...
       [0,5,10,15,20] ...
       [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] ...
       [0,1,4,5,9,11,12,14,16,18,23,24,26,28,29,30] ...
   };
>> outputs = cellfun(f, inputs)
outputs =
     1     2     3     3     3     3     4     5     5     6

1
TIL про uniquetol... Представлений у R2015a . У мене R2014b :( Приємна відповідь :)
Стюі Гріффін

@Stewie Я знав, що це існує, але я думаю, що це перший раз, коли я його використовую
Луїс Мендо

2

05AB1E , 20 19 18 15 14 11 байт

v®y‹iy4+©\¼

Пояснення:

v          # loop on input
 ®          # push register_c, start at -1
  y‹i         # if current item greater than last item
   y4+         # push new max on stack
    ©\          # push new max on register_c, and pop it from stack
     ¼           # increment counter_variable
                  # implicit print of counter_variable

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

Редагувати

  • -3 байти завдяки Райлі та використанню системи counter_variable
  • врешті-решт немає потреби у counter_variable
  • -3 байти знову завдяки Райлі та використанню register_c

Ви можете використовувати змінну лічильника, щоб зберегти 3 байти:¼4¹vDy‹i¼y4+}}¾
Райлі

oooooh, є лічильна змінна, це зручно! Дякую!!
Кирило Гендон

1
11 байт:v®y‹iy4+©\¼
Райлі

2

Лушпиння, 6 байт

Lüo<+5

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

  o<+5        a function that takes two arguments and checks if
              the second is less than the the first plus 5
 ü            remove equal elements from the input list using the above
              function as the equality test
L             return the length of the remaining list

Ого, я не усвідомлював üтаких робіт! Це дуже зручно.
Згарб

@ Zgarb: Я спершу спробував, ġале це не вийшло, тоді як роботи Haskell groupBy: length.groupBy((>).(+5)). Потім я виявив , üщо також призводить до більш короткому Haskell еквівалент: nubBy.
німі



1

MATL , 13 12 байт

`ttX<4+>)t}@

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

`        % Do..while
  t      %   Duplicate. Takes input (implicitly) the first time
  tX<    %   Duplicate and get minimum, i.e the first entry
  4+     %   Add 4
  >      %   Greater than? Element-wise
  )      %   Keep entries that fulfill that
  t      %   Duplicate. This is used as loop condition
}        % Finally (execute at the end of the loop)
  @      %   Push number of iterations. This is the output
         % End (implicit). A new iteration is run if top of the stack is truthy

1

Піт , 14 байт

L&lbhyfg-Thb5b

Це рекурсивна функція. Телефонуйте за допомогою y[0 1 2 3 4 5 6 7 8), де [...)ваш список.

Крім того, спробуйте тут! або Перевірте всі тестові випадки.


Пояснення

Це приблизно еквівалентно рішенню Python. Переклад дав би такі результати:

def y(b):
 return (len(b) and y(filter(lambda T:T>=b[0]+5,b)) + 1)

Розбивка коду

L&lbhyfg-Thb5b   - Function called y that accepts a list parameter b.

L                - Define the function.
  lb             - The length of b...
 &               - ... Logical AND ...
    h            - Increment by 1.
     y           - The result given by calling the function recursively on the following:
      f      b     - b filtered...
        -Thb       - ... For the elements whose difference compared to the first element...
       g    5      - ... Is greater than or equal to 5.

Я намагаюся знайти вирішення проблеми .U. Пропозиції вітаються
містер Xcoder


1

C # .NET, 63 байти

a=>{int e=0;foreach(int l in a)if(l-a[e]>4)a[++e]=l;return-~e;}

Пояснення:

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

a=>{                   // Method with integer-array parameter and integer return-type
  int e=0;             //  Amount of edits (starting at 0)
  foreach(int l in a)  //  Loop over the input-array
    if(l-a[e]>4)       //   If the current value minus the current edit is larger than 4:
      a[++e]=l;        //    Raise the edit-count by 1 first,
                       //    and set the current value to this next current edit
                       //  End of loop (implicit / single-line body)
  return-~e;           //  Return the amount of edits + 1
}                      // End of method





0

Сітківка , 32 26 байт

.+
$*11
(1+)(¶1{1,4}\1)*\b

Спробуйте в Інтернеті! Пояснення:

.+
$*11

Перетворити в одинарне, але додати 1, тому що 0 - хитра концепція у Retina.

(1+)(¶1{1,4}\1)*\b

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


0

Котлін, 52 байти

Опублікування як функція, якщо це неприйнятно, я зміню його на метод

Подання

{var x=it[0]
var o=1
it.map{if(it>x+4){o++
x=it}}
o}

Прикрасили

{
    // Last counted edit
    var x=it[0]
    // Current edit total
    var o = 1
    // For each edit
    it.map{
        // If it was 5 or more minutes ago
        if (it>x+4) {
            // Increase edit count
            o++
            // Make it the last counted edit
            x=it
        }
    }
    // Return the edit count
    o
}

Тест

var r:(IntArray)->Int=
{var x=it[0]
var o=1
it.map{if(it>x+4){o++
x=it}}
o}

fun main(args: Array<String>) {
    println(r(intArrayOf(0)))
    println(r(intArrayOf(0,3,5,7)))
    println(r(intArrayOf(0,3,4,7,9,10,11,12)))
    println(r(intArrayOf(0,30,120)))
    println(r(intArrayOf(0,4,8,12,16)))
    println(r(intArrayOf(0,4,8,12,16,20)))
    println(r(intArrayOf(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19)))
    println(r(intArrayOf(0,5,10,15,20)))
    println(r(intArrayOf(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)))
    println(r(intArrayOf(0,1,4,5,9,11,12,14,16,18,23,24,26,28,29,30)))
}

TryItOnline


0

PowerShell , 74 байти

for($x,$y=$args[0];$y;$x,$y=$y){if($l-le$x-5){$i++;$l=$x}}$i+1+($l-le$x-5)

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

Ми приймаємо введення $args[0]як буквальний масив, відклеюємо перший елемент, $xа решту - $y. Тоді, поки ще є елементи$y , ми робимо цикл.

Кожна ітерація, ми перевіряємо , є чи поточна мітка $xє 5або більш від $lаст редагування мітки часу. Якщо так, ми збільшуємо свій лічильник $i++і встановлюємо свою часову позначку на поточну. Потім на ітерації петлі відшаровуємо наступний елемент$x і залишаємо все, що залишилося$y .

Після того, як ми вийшли з циклу, ми виводимо $i, плюс 1для початкового редагування, плюс те, чи остаточна мітка часу знаходиться більше, ніж п'ять від останнього редагування (при цьому значення булевого значення неявно переведено на ціле число). Цей результат залишається на конвеєрі, і вихід неявний.

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


0

R , 52 байти

function(l){while(sum(l|1)){l=l[l-l[1]>=5]
F=F+1}
F}

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

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


0

Clojure, 53 байти

#(count(set(reductions(fn[r v](if(<(- v r)5)r v))%)))

Це відслідковує "редагувати початкові часи", а потім повертає їх чітку кількість.


0

Japt , 14 байт

Ê©1+ßUf_aUg)>4

Спробуй це


Пояснення

Неявне введення масиву U

Ê

Отримайте довжину U.

©

Логічний AND ( &&) - виконайте наступне, лише якщо Êє truthy (не нульовим).

ß

Рекурсивний дзвінок.

Uf_

Фільтр ( f) U, пропускаючи кожен елемент через функцію.

aUg

Отримайте різницю ( a) між поточним елементом та першим елементом ( g) U.

>4

Більше 4?

1+

Додайте 1.

Неявний вихід отриманого цілого числа.


0

Желе , 11 байт

+4Ḣ<x@µÐĿL’

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

Пояснення

+4Ḣ<x@µÐĿL’  Input: array A
      µÐĿ    Repeat until the results converge
+4             Add 4
  Ḣ            Head
   <           Greater than
    x@         Copy only the true values
         L   Length
          ’  Decrement

12 байт

;I4<1;x@;ð/L

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

Пояснення

;I4<1;x@;ð/L  Input: array A
         ð/   Reduce A from left-to-right using
;               Concatenate
 I              Increment
  4<            Greater than 4
    1;          Prepend 1
      x@        Times each of
        ;       Concatenate
           L  Length
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.