Подсчет правок с учетом льготного периода


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)]

Leaderboard:


Хотя это действительно раздражает, если ваше редактирование не дает льготный период, потому что тогда вы должны использовать свой новый льготный период, чтобы он выглядел так, как будто вы хотели редактировать его таким образом все время ...
Нейл

Ответы:


20

JavaScript, 36 байт

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

Попробуйте онлайн!

Как это работает

В каждом рекурсивном вызове мы удаляем все элементы из массива, которые находятся на расстоянии более 4 минут от первого элемента.
Есть маленькая хитрость с именем переменной $. Проверка $>fсначала преобразует массив в строку, а затем сравнивает ее со строковым представлением функции, fа затем сравнивает их лексикографически. Первым символом строкового массива является цифра и, следовательно, только имя переменной с одним символом, индекс ascii которого меньше, чем индексы всех цифр $. Замена $на любое другое имя переменной всегда вернет false.


3
Я люблю этот сайт из-за таких ответов.
Кристиан Лупаску

1
Очень хороший трюк!
Арно

1
О, это отличный трюк!
Лохматый

8

Mathematica, 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

Шелуха , 8 байт

Γ(→₀f>+4

Попробуйте онлайн!

объяснение

Γ(→₀f>+4  Implicit input, a list of numbers.
Γ(        Deconstruct into head n and tail x (if empty, return 0).
    f>+4  Keep those elements of x that are greater than n+4.
   ₀      Call main function recursively on the result.
  →       Increment.

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+}}¾
Riley

оооооо, есть переменная счетчика, это удобно! Спасибо!!
Кирилл Гандон

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

Pyth , 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.

©

Логическое И ( &&) - выполнить следующее, только если Êверно (не ноль).

ß

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

Uf_

Filter ( 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.