Policz edycje uwzględniające okres karencji


23

Gdy edytujesz post w SE, wszelkie dalsze zmiany w ciągu 5 minutowego okresu karencji są z nim scalane. Biorąc pod uwagę listę razy, gdy edytujesz wpis, policz zmiany, które nie były w okresie karencji.

Załóżmy, że edytujesz w ciągu kilku minut [0,3,4,7,9,10,11,12]. Powoduje to 3 edycje czasami [0,7,12], a reszta dzieje się w okresach karencji.

0:  [3,4]
7:  [9,10,11]
12: []
  • Pierwsza edycja następuje w minucie 0. Zmiany w minutach 3 i 4 mieszczą się w 5-minutowym okresie karencji, więc nie licz.
  • Druga edycja następuje w 7. minucie. Zmiany w minutach 9, 10, 11 mieszczą się w okresie karencji.
  • Trzecia edycja w minucie 12 jest tuż poza 5-minutowym okresem karencji rozpoczynającym się w 7 minucie.

Zatem wynik wynosi 3.

Lista czasów w minutach będzie listą rosnących liczb całkowitych. Pierwszy numer zawsze będzie wynosił 0 dla początkowego wpisu, który liczymy jako edycję.

Przypadki testowe:

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

Wyjścia:

1
2
3
3
3
3
4
5
5
6

Aby ułatwić kopiowanie, oto pary danych wejściowych, wyjściowych i wejściowych / wyjściowych:

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

Tabela liderów:


Chociaż to naprawdę denerwujące, jeśli twoja edycja nie skraca okresu karencji, ponieważ wtedy musisz użyć nowego okresu karencji, aby wyglądał tak, jakbyś chciał go edytować w ten sposób cały czas ...
Neil

Odpowiedzi:


20

JavaScript, 36 bajtów

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

Wypróbuj online!

Jak to działa

W każdym wywołaniu rekurencyjnym usuwamy wszystkie elementy z tablicy, które są oddalone o więcej niż 4 minuty od pierwszego elementu.
Jest mała sztuczka ze zmienną nazwą $. Kontrola $>fnajpierw konwertuje tablicę na ciąg znaków, a następnie porównuje ją z reprezentacją ciągu funkcji, fa następnie porównuje je leksykograficznie. Pierwszym znakiem tablicy łańcuchowej jest cyfra, a zatem jest tylko nazwa zmiennej jednoznakowej, której indeks ascii jest mniejszy niż indeksy wszystkich cyfr $. Zastąpienie $inną nazwą zmiennej zawsze będzie zwracane false.


3
Uwielbiam tę stronę z powodu takich odpowiedzi.
Cristian Lupascu,

1
Bardzo fajna sztuczka!
Arnauld,

1
Och, teraz to świetna sztuczka!
Kudłaty

8

Mathematica, 46 40 37 33 bajtów

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

Wyjaśnienie

i=1;j=0

Ustaw ina 1i jna 0.

... /@#

Odwzoruj na wszystkie elementy danych wejściowych ...

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

Jeśli (element) - j < 5jest fałszem, zwiększ ii ustaw jelement (ocena zwarcia).

;i

Wyjście i.


5

Łuska , 8 bajtów

Γ(→₀f>+4

Wypróbuj online!

Wyjaśnienie

Γ(→₀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 bajtów

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

Wypróbuj online!

  • Zaoszczędź 2 bajty dzięki @Mr. Xcoder.

49 bajtów

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

Korzystanie z metody rekurencyjnej pokazanej w rozwiązaniu @ ThePirateBay .

  • Zapisano bajt dzięki @Mr. Xcoder.
  • Zaoszczędź 2 bajty dzięki @Halvard Hummel.

Wypróbuj online!


and 1+f(...)można zastąpić przez and-~f(...)49 bajtów
Pan Xcoder

@ Mr.Xcoder Och, nie mogę zapomnieć o tych wszystkich bitowych sztuczkach.
mile

x=a[:1]jest równoważne x=[0], ponieważ pytanie wyraźnie stwierdza, że ​​pierwszym elementem jest zawsze 0( 62 bajty )
Pan Xcoder,


3

J , 20 bajtów

[:#(,}.~5>(-{.))/@|.

Wypróbuj online!

Wyjaśnienie

[:#(,}.~5>(-{.))/@|.  Input: array A
                  |.  Reverse
                /@    Reduce from right-to-left
            {.          Head of RHS
           -            Subtract with LHS
        5>              Less than 5
     }.~                Drop that many from
    ,                   Join
[:#                   Length

3

MATLAB, 34 bajty

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

Anonimowa funkcja, która wprowadza tablicę i wyprowadza liczbę.

Wykorzystuje to uniquetolfunkcję, a konkretnie jej formę y = uniquetol(x, t), która daje yzawieranie unikalnych elementów xz tolerancją t. W ten sposób funkcja wydaje się podążać podejście „leniwe” sort x, wybrać swój pierwszy wpis, a zachować wpisy pomijanie tak długo, jak są one w granicach tolerancji najnowszej odebrał wpisu. Właśnie to jest potrzebne tutaj.

uniquetolFunkcja automatycznego wagi określonej tolerancji przez maksymalną wartość bezwzględnych w a. Dlatego potrzebujemy tutaj podziału. x+1jest używany zamiast, xaby uniknąć dzielenia przez 0.

Weryfikacja przypadków testowych:

>> 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 about uniquetol... Wprowadzono w R2015a . Mam R2014b :( Ładna odpowiedź :)
Stewie Griffin

@Stewie Wiedziałem, że istnieje, ale myślę, że po raz pierwszy go używam
Luis Mendo,

2

05AB1E , 20 19 18 15 14 11 bajtów

v®y‹iy4+©\¼

Wyjaśnienie:

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

Wypróbuj online!

Edytować

  • -3 bajty dzięki Riley i użyciu zmiennej counter_variable
  • w końcu nie ma potrzeby stosowania zmiennej_zmiennej
  • -3 bajty ponownie dzięki Riley i użyciu register_c

Możesz użyć zmiennej counter, aby zapisać 3 bajty:¼4¹vDy‹i¼y4+}}¾
Riley

oooooh, jest zmienna licznika, to jest przydatne! Dziękuję Ci!!
Cyril Gandon,

1
11 bajtów:v®y‹iy4+©\¼
Riley,

2

Łuska, 6 bajtów

Lüo<+5

Wypróbuj online!

  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

Whoa, nie zdawałem sobie sprawy, że üdziała tak! To bardzo przydatne.
Zgarb,

@Zgarb: Po raz pierwszy próbowałem ġale to nie działa, natomiast Haskell za groupByprac: length.groupBy((>).(+5)). Potem znalazłem üco prowadzi również do krótszy odpowiednik Haskell: nubBy.
nimi



1

MATL , 13 12 bajtów

`ttX<4+>)t}@

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

`        % 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 bajtów

L&lbhyfg-Thb5b

To jest funkcja rekurencyjna. Zadzwoń za pomocą y[0 1 2 3 4 5 6 7 8), gdzie [...)jest twoja lista.

Alternatywnie, wypróbuj tutaj! lub Zweryfikuj wszystkie przypadki testowe.


Wyjaśnienie

Jest to mniej więcej odpowiednik rozwiązania Python. Tłumaczenie dałoby następujące wyniki:

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

Podział kodu

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.

Próbuję znaleźć obejście .U. Sugestie są mile widziane
Pan Xcoder,


1

C # .NET, 63 bajty

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

Wyjaśnienie:

Wypróbuj tutaj.

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

Siatkówka , 32 26 bajtów

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

Wypróbuj online! Wyjaśnienie:

.+
$*11

Konwertuj na unary, ale dodaj 1, ponieważ 0 to trudna koncepcja w Retinie.

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

Policz liczbę edycji, ale dołącz wszystkie edycje dodatkowe w każdym dopasowaniu.


0

Kotlin, 52 bajty

Publikowanie jako funkcja, jeśli nie jest to dopuszczalne, zmienię to na metodę

Uległość

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

Upiększony

{
    // 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
}

Test

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 bajty

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

Iteracyjne rozwiązanie. Długa z powodu słupka ogrodzeniowego na forpętli wymagającego dodatkowej kontroli na końcu. Sugestie dotyczące gry w golfa mile widziane.

Bierzemy dane wejściowe $args[0]jako tablicę literalną, odklejamy pierwszy element do, $xa resztę do $y. Następnie, dopóki są jeszcze elementy $y, pętlujemy.

W każdej iteracji sprawdzamy, czy bieżący znacznik czasu $xznajduje się w 5większej odległości od $lznacznika czasu edycji ast. Jeśli tak, zwiększamy nasz licznik $i++i ustawiamy nasz znacznik czasu na aktualny. Następnie, podczas iteracji pętli, odklejamy następny element $xi pozostawiamy pozostałe $y.

Gdy jesteśmy poza pętlą, generujemy dane wyjściowe $iplus 1dla początkowej edycji, a także czy ostateczny znacznik czasu znajduje się w odległości większej niż pięć od ostatniej edycji (z wartością logiczną domyślnie rzutowaną na liczbę całkowitą). Ten wynik pozostaje w potoku, a dane wyjściowe są niejawne.

Wypróbuj online!


0

R , 52 bajty

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

Wypróbuj online!

Prosta anonimowa funkcja, która iteracyjnie usuwa elementy z listy oddalone od pierwszego elementu o mniej niż 5, aż lista będzie pusta, a następnie zwraca licznik.


0

Clojure, 53 bajty

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

Śledzi to „edycję czasów rozpoczęcia”, a następnie zwraca ich odrębną liczbę.


0

Japt , 14 bajtów

Ê©1+ßUf_aUg)>4

Spróbuj


Wyjaśnienie

Domniemane wejście tablicy U

Ê

Uzyskaj długość U.

©

Logiczne AND ( &&) - wykonaj następujące czynności tylko, jeśli Êjest zgodne z prawdą (niezerowe).

ß

Połączenie rekurencyjne.

Uf_

Filtruj ( f) Uprzepuszczając każdy element przez funkcję.

aUg

Uzyskaj różnicę ( a) między bieżącym elementem a pierwszym elementem ( g) z U.

>4

Więcej niż 4?

1+

Dodaj 1.

Wyjściowa wartość wynikowa liczby całkowitej.


0

Galaretka , 11 bajtów

+4Ḣ<x@µÐĿL’

Wypróbuj online!

Wyjaśnienie

+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 bajtów

;I4<1;x@;ð/L

Wypróbuj online!

Wyjaśnienie

;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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.