Anzahl der Änderungen, die den Kulanzzeitraum berücksichtigen


23

Wenn Sie einen Beitrag in SE bearbeiten, werden alle weiteren Bearbeitungen innerhalb einer Nachfrist von 5 Minuten darin zusammengeführt. Wenn Sie eine Liste der Bearbeitungszeitpunkte für einen Beitrag angegeben haben, zählen Sie die Änderungen, die sich nicht in einem Kulanzzeitraum befinden.

Angenommen, Sie bearbeiten in Minuten [0,3,4,7,9,10,11,12]. Dies führt zu 3 zeitweiligen Änderungen [0,7,12], wobei der Rest in den Kulanzfristen erfolgt.

0:  [3,4]
7:  [9,10,11]
12: []
  • Die erste Bearbeitung findet in Minute 0 statt. Die Änderungen in den Minuten 3 und 4 liegen innerhalb der 5-minütigen Schonfrist und werden daher nicht gezählt.
  • Die zweite Bearbeitung findet in Minute 7 statt. Die Bearbeitungen in den Minuten 9, 10, 11 liegen innerhalb der Schonfrist.
  • Die dritte Bearbeitung in Minute 12 ist kurz nach dem Ende der 5-Minuten-Schonfrist, die in Minute 7 beginnt.

Die Ausgabe ist also 3.

Die Liste der Zeiten in Minuten ist eine Liste mit aufsteigenden ganzen Zahlen. Die erste Zahl ist immer 0 für die Erstbuchung, die wir als Bearbeitung betrachten.

Testfälle:

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

Ausgänge:

1
2
3
3
3
3
4
5
5
6

Um das Kopieren zu vereinfachen, sind hier die Eingänge, Ausgänge und Ein- / Ausgangspaare:

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

Bestenliste:


Obwohl es wirklich ärgerlich ist, wenn Ihre Bearbeitung die Nachfrist nicht einhält, weil Sie dann Ihre neue Nachfrist verwenden müssen, damit sie so aussieht, als wollten Sie sie die ganze Zeit so bearbeiten ...
Neil

Antworten:


20

JavaScript, 36 Bytes

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

Probieren Sie es online!

Wie es funktioniert

In jedem rekursiven Aufruf löschen wir alle Elemente aus dem Array, die mehr als 4 Minuten vom ersten Element entfernt sind.
Es gibt einen kleinen Trick mit Variablennamen $. Die Prüfung $>fkonvertiert zuerst das Array in eine Zeichenfolge und vergleicht es dann mit der Zeichenfolgendarstellung der Funktion fund vergleicht sie dann lexikografisch. Das erste Zeichen eines Zeichenketten-Arrays ist eine Ziffer und daher nur ein einziger Variablenname, dessen ASCII-Index kleiner ist als die Indizes aller Ziffern $. Das Ersetzen $durch einen anderen Variablennamen wird immer zurückgegeben false.


3
Ich liebe diese Seite wegen solcher Antworten.
Cristian Lupascu

1
Sehr schöner Trick!
Arnauld

1
Oh, das ist ein toller Trick!
Shaggy

8

Mathematica, 46 40 37 33 Bytes

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

Erläuterung

i=1;j=0

Setzen Sie iauf 1und jauf 0.

... /@#

Auf alle Elemente der Eingabe abbilden ...

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

Wenn (element) - j < 5falsch, dann inkrementieren iund jauf das Element setzen (Kurzschlussauswertung).

;i

Ausgabe i.


5

Schale , 8 Bytes

Γ(→₀f>+4

Probieren Sie es online!

Erläuterung

Γ(→₀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 Bytes

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

Probieren Sie es online!

  • 2 Bytes gespart dank @Mr. Xcoder.

49 Bytes

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

Verwenden Sie die in der @ ThePirateBay- Lösung gezeigte rekursive Methode .

  • Ein Byte dank @Mr gespeichert. Xcoder.
  • 2 Bytes gespart dank @Halvard Hummel.

Probieren Sie es online!


and 1+f(...)kann durch and-~f(...)für 49 Bytes ersetzt werden
Mr. Xcoder

@ Mr.Xcoder Oh, ich kann all diese bitweisen Tricks nicht vergessen.
Meilen

x=a[:1]ist äquivalent zu x=[0], da die Frage explizit angibt, dass das erste Element immer 0( 62 Bytes ) ist
Mr. Xcoder


3

J , 20 Bytes

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

Probieren Sie es online!

Erläuterung

[:#(,}.~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 Bytes

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

Anonyme Funktion, die ein Array eingibt und eine Zahl ausgibt.

Dabei wird die uniquetolFunktion verwendet, insbesondere ihre Form y = uniquetol(x, t), die yeindeutige Elemente xmit Toleranz enthält t. Dabei scheint die Funktion einem "trägen" Ansatz zu folgen: Sortieren x, Auswählen des ersten Eintrags und Überspringen von Einträgen, solange sie innerhalb der Toleranz des zuletzt ausgewählten Eintrags liegen. Genau das ist hier gefragt.

Die uniquetolFunktion skaliert die angegebene Toleranz automatisch um den maximalen Absolutwert in a. Deshalb brauchen wir hier die Aufteilung. x+1wird anstelle von verwendet x, um eine Division durch 0 zu vermeiden.

Überprüfung von Testfällen:

>> 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
Bis etwa uniquetol... Eingeführt in R2015a . Ich habe R2014b :( Nette Antwort :)
Stewie Griffin

@Stewie Ich wusste, dass es existiert, aber ich denke, dies ist das erste Mal, dass ich es benutze
Luis Mendo

2

05AB1E , 20 19 18 15 14 11 Bytes

v®y‹iy4+©\¼

Erläuterung:

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

Probieren Sie es online!

Bearbeiten

  • -3 Bytes dank Riley und der Verwendung von counter_variable
  • keine Notwendigkeit für counter_variable
  • Nochmals -3 Bytes dank Riley und der Verwendung von register_c

Sie können die Zählervariable verwenden, um 3 Bytes zu speichern:¼4¹vDy‹i¼y4+}}¾
Riley

oooooh, es gibt eine Zählervariable, das ist praktisch! Vielen Dank!!
Cyril Gandon

1
11 Bytes:v®y‹iy4+©\¼
Riley

2

Schale, 6 Bytes

Lüo<+5

Probieren Sie es 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

Oh, ich habe nicht gemerkt, dass so etwas üfunktioniert! Das ist sehr praktisch.
Zgarb

@Zgarb: ich zum ersten Mal versucht , ġaber es funktioniert nicht, während Haskells groupByWerke: length.groupBy((>).(+5)). Dann fand ich üwas dazu führt auch zu einer kürzeren Haskell - Äquivalent: nubBy.
nimi



1

MATL , 13 - 12 Bytes

`ttX<4+>)t}@

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

`        % 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 Bytes

L&lbhyfg-Thb5b

Dies ist eine rekursive Funktion. Nennen Sie es mit y[0 1 2 3 4 5 6 7 8), wo [...)ist Ihre Liste.

Alternativ können Sie es hier ausprobieren! oder Überprüfen Sie alle Testfälle.


Erläuterung

Dies entspricht in etwa der Python-Lösung. Eine Übersetzung würde zu folgenden Ergebnissen führen:

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

Code-Aufschlüsselung

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.

Ich versuche, eine Problemumgehung mit zu finden .U. Vorschläge sind willkommen
Mr. Xcoder


1

C # .NET, 63 Bytes

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

Erläuterung:

Probieren Sie es hier aus.

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

Retina , 32 26 Bytes

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

Probieren Sie es online! Erläuterung:

.+
$*11

Konvertieren Sie zu Unary, aber addieren Sie 1, da 0 in Retina ein schwieriges Konzept ist.

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

Zählen Sie die Anzahl der Bearbeitungen, schließen Sie jedoch alle Kulanzbearbeitungen in jede Übereinstimmung ein.


0

Kotlin, 52 Bytes

Posting als Funktion, wenn dies nicht akzeptabel ist, werde ich es in eine Methode ändern

Einreichung

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

Verschönert

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

Prüfung

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 Byte

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

Iterative Lösung. Langwierig, da Zaunpfosten auf der forSchlaufe eine zusätzliche Kontrolle am Ende erfordern. Golfvorschläge sind willkommen.

Wir nehmen die Eingabe $args[0]als Literal-Array, schälen das erste Element in $xund das verbleibende in ab $y. Dann, solange es noch Elemente gibt$y , wird eine Schleife ausgeführt.

Jede Iteration, prüfen wir , ob der aktuelle Zeitstempel $xist 5oder mehr weg von den $last bearbeiten Zeitstempeln. In diesem $i++Fall erhöhen wir unseren Zähler und setzen unseren Zeitstempel auf den aktuellen Stand. Dann schälen wir bei der Iteration der Schleife das nächste Element ab $xund lassen das verbleibende in $y.

Sobald wir die Schleife verlassen haben, geben wir $iplus 1für die anfängliche Bearbeitung plus aus, ob der endgültige Zeitstempel mehr als fünf von der letzten Bearbeitung entfernt ist (wobei der Boolesche Wert implizit in eine Ganzzahl umgewandelt wird). Dieses Ergebnis verbleibt in der Pipeline und die Ausgabe ist implizit.

Probieren Sie es online!


0

R , 52 Bytes

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

Probieren Sie es online!

Einfache anonyme Funktion, die iterativ Elemente aus der Liste entfernt, die weniger als 5 vom ersten Element entfernt sind, bis die Liste leer ist, und dann den Zähler zurückgibt.


0

Clojure, 53 Bytes

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

Dies verfolgt die "Bearbeitungsstartzeiten" und gibt dann ihre eindeutige Anzahl zurück.


0

Japt , 14 Bytes

Ê©1+ßUf_aUg)>4

Versuch es


Erläuterung

Implizite Eingabe eines Arrays U

Ê

Holen Sie sich die Länge von U.

©

Logisches AND ( &&) - ÊFührt nur dann Folgendes aus, wenn es wahr ist (nicht Null).

ß

Rekursiver Aufruf.

Uf_

Filter ( f), Uindem jedes Element durch eine Funktion geleitet wird.

aUg

Ermitteln Sie die Differenz ( a) zwischen dem aktuellen Element und dem ersten Element ( g) von U.

>4

Größer als 4?

1+

Hinzufügen 1 .

Implizite Ausgabe der resultierenden Ganzzahl.


0

Jelly , 11 Bytes

+4Ḣ<x@µÐĿL’

Probieren Sie es online!

Erläuterung

+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 Bytes

;I4<1;x@;ð/L

Probieren Sie es online!

Erläuterung

;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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.