Inspiriert von einem realen Szenario, das ich hier um eine Antwort gebeten habe: /superuser/1312212/writing-a-formula-to-count-how-many-times-each-date- erscheint in einem Datumssatz ran
Bei einem vorgegebenen Array von Zeiträumen (oder Startdatum-Enddatum-Paaren) wird für alle Tage im Gesamtbereich die Anzahl der Zeiträume ausgegeben, die jeden Tag abdecken.
Beispielsweise:
# Start End
1 2001-01-01 2001-01-01
2 2001-01-01 2001-01-03
3 2001-01-01 2001-01-02
4 2001-01-03 2001-01-03
5 2001-01-05 2001-01-05
In Anbetracht der obigen Daten sollten die Ergebnisse wie folgt aussehen:
2001-01-01: 3 (Records 1,2,3)
2001-01-02: 2 (Records 2,3)
2001-01-03: 2 (Records 2,4)
2001-01-04: 0
2001-01-05: 1 (Record 5)
Sie müssen nur die Zählungen für jeden Tag ausgeben (in der Reihenfolge, sortiert nach ältesten und neuesten). nicht in welchen Datensätzen sie erscheinen.
Sie können davon ausgehen, dass jede Zeitspanne nur Daten und keine Zeiten enthält. und so sind immer ganze tage vertreten.
I / O
Eingang kann in jedem Format erfolgen, das eine Reihe von Zeiträumen darstellt - also entweder eine Reihe von Zeitpaaren oder eine Sammlung von (eingebauten) Objekten, die Start- und Enddaten enthalten. Die Datumsangaben sind, wie bei PPCG-Herausforderungen üblich, auf einen Zeitraum zwischen 1901 und 2099 begrenzt.
Sie können davon ausgehen, dass die Eingabe nach Belieben vorsortiert ist (in Ihrer Antwort angeben). Eingabedaten sind inklusive (der Bereich umfasst also das gesamte Start- und Enddatum).
Sie können auch davon ausgehen, dass von den beiden Daten in einem bestimmten Bereich das erste älter oder gleich dem zweiten ist (dh Sie haben keinen negativen Datumsbereich).
Die Ausgabe ist ein Array, das die Anzahl für jeden Tag vom ältesten bis zum neuesten in der Eingabe enthält, wenn nach Startdatum sortiert.
Die Ausgabe für das obige Beispiel wäre also {3,2,2,0,1}
In diesem Fall sind einige Tage möglicherweise nicht in einem Zeitbereich enthalten 0
wird für dieses Datum ausgegeben.
Gewinnkriterien
Dies ist Code-Golf, also gewinnt das niedrigste Byte. Es gelten die üblichen Ausschlüsse
Pseudo-Algorithmus Beispiel
For each time range in input
If start is older than current oldest, update current oldest
If end is newer than current newest, update current newest
End For
For each day in range oldest..newest
For each time range
If timerange contains day
add 1 to count for day
End For
Output count array
Andere Algorithmen, um zum gleichen Ergebnis zu gelangen, sind in Ordnung.
0
sollte in einem Wörterbuch sein? Es scheint nur den Benutzer zu zwingen, vonmin(input)
bis zu iterierenmax(input)
, was nichts zum Kern der Herausforderung (Rechenzeit) hinzuzufügen scheint.Antworten:
APL (Dyalog Unicode) , 32 Byte SBCS
Volles Programm. Fordert stdin zur Eingabe einer Liste mit Paaren internationaler Datumsnummern auf (z. B. was Excel und MATLAB verwenden). Sowohl Liste als auch Paare können in beliebiger Reihenfolge angegeben werden, z. B. (Ende, Start). Gibt die Liste der Zählungen in Standard aus.
¯1+⊢∘≢⌸(R,⊢)∊(R←⌊/,⌊/+∘⍳⌈/-⌊/)¨⎕
Probieren Sie es online!Wenn dies ungültig ist, kann eine Liste von (YMD-) Paaren für zusätzliche 21 Bytes konvertiert werden, was insgesamt 53 ergibt:
¯1+⊢∘≢⌸(R,⊢)∊(R⌊/,⌊/+∘⍳⌈/-⌊/)¨{2⎕NQ#'DateToIDN'⍵}¨¨⎕
Probieren Sie es online!⎕
Eingabeaufforderung Konsole für ausgewertete Eingabe(
…)¨
Wenden Sie auf jedes Paar die folgende implizite Funktion an⌊/
das Minimum (lit. min-reduktion), dh das Startdatum⌈/-
das Maximum (dh Enddatum) minus das⌊/+∘⍳
das Startdatum plus den Bereich 1-bis-das⌊/,
das Anfangsdatum, das dem vorausgehtR←
diese Funktion zuweisenR
(für R ange)∊
ϵ nlist (verflachen) Sie die Liste der Bereiche in eine einzige Liste(
…)
Wenden darauf folgende implizite Funktion an:R,⊢
das Ergebnis der AnwendungR
(dh den Datumsbereich), gefolgt von dem Argument(dies stellt sicher, dass jedes Datum im Bereich mindestens einmal dargestellt wird und die Daten in sortierter Reihenfolge angezeigt werden)
…
⌸
Für jedes eindeutige Paar (Datum, seine Vorkommensindizes in der Eingabe) Folgendes tun:⊢∘≢
Ignorieren Sie das aktuelle Datum zugunsten der Indexzählung¯1+
Addiere -1 zu diesen Werten (weil wir eines von jedem Datum im Bereich vorangestellt haben)quelle
JavaScript (ES6), 85 Byte
Nimmt die Eingabe als Liste von
Date
Paaren. Erwartet, dass die Liste nach dem Startdatum sortiert wird. Gibt ein Array von Ganzzahlen zurück.Probieren Sie es online!
oder 84 Bytes, wenn wir JS-Zeitstempel als Eingabe verwenden können (wie von @Shaggy vorgeschlagen)
quelle
JavaScript,
7573 BytesNimmt Eingaben als sortiertes Array von Arrays von Datumsprimitivpaaren an, gibt ein Objekt aus, bei dem die Schlüssel die Primitive jedes Datums sind und die Werte die Anzahl dieser Datumsangaben in den Bereichen.
Versuch es
Ich habe an dieser 60-Byte-Version gearbeitet, bis bestätigt wurde, dass Daten, die in keinem der Bereiche enthalten sind , aufgenommen werden müssen. Aktualisieren Sie sie daher hastig auf die obige Lösung.
Probieren Sie es online aus (oder mit lesbaren Daten in der Ausgabe )
quelle
Oktave , 63 Bytes
Probieren Sie es online!
Das war hässlich!
Erläuterung:
Nimmt die Eingabe als ein Zellenarray von
datenum
Elementen (dh eine Zeichenfolge,"2001-01-01"
die in einen numerischen Wert konvertiert wurde und wie folgt aussieht:wo
d()
ist die funktiondatenum
. Wir verwenden danncellfun
erstellen für jede dieser Zeilen Zellen mit den Bereichen von der ersten bis zur zweiten Spalte. Wir verketten diese Bereiche horizontal, sodass wir einen langen horizontalen Vektor mit allen Daten haben.Aus
histc
diesen Werten wird ein Histogramm erstellt , wobei die Klassen durch den Bereich zwischen dem niedrigsten und dem höchsten Datum angegeben werden.quelle
R , 75 Bytes
Probieren Sie es online!
Die Eingabe ist eine Matrix, deren erste Spalte Start und deren zweite Spalte Ende ist. Nimmt an, dass Start <= Ende ist, erfordert jedoch keine Sortierung der Startdaten.
quelle
hist
; Sie tun können ,c(-25668,min(x):max(x))
da-25568
vor ist1900
aber diese endet länger als Ihre vorgeschlagene Antwort. Davon abgesehen gibt es eine bessere Möglichkeit, die Daten zu generieren alsapply
; Ich habe eine, die bei 68 Bytes ist und ich habe einfach nicht die Zeit gefunden, es selbst zu posten.(min(x)-1):max(x)
und es sollte wie erwartet funktionieren; Wenn Sie dann keineapply
Möglichkeit finden, die Daten zu generieren, können Sie diese auf 63 Bytes bringen und die Oktavantwort binden.table
undfactor
vor dem war meine ursprüngliche VerwendungMap
für 68 Bytes, aber eshist
ist eine nette Vorgehensweise, die ich immer vergesse, wahrscheinlich, weil es ärgerlich ist, die Mülleimer genau richtig zu machen (wie wir gesehen haben) )Rot , 174 Bytes
Sehr lange und wörtliche Implementierung.
Probieren Sie es online!
Lesbar:
quelle
Groovy, 142 Bytes
Für den Fall, dass Sie nicht mehr weiterkommen möchten
Formatiert aus:
quelle
Python 2 ,
1148793 Bytes-27 Bytes dank Jonathan Allan
+6 Bytes dank Sundar
Übernimmt die Eingabe als Liste von Paaren von Datums- und Uhrzeitobjekten.
Angenommen, das erste Paar beginnt mit dem niedrigsten Datum.
Probieren Sie es online!
quelle
days
ist das Standardargument fürtimedelta
.from datetime import*
und ersetzend+=timedelta(days=1)
mit ,d+=type(d-d)(1)
da die Eingänge sind bereitsdate
s. 87 Bytes[(2001-01-01, 2001-01-05), (2001-01-02, 2001-01-03)]
. Wenn wir diese Bereiche in OP nicht während der Vorverarbeitung aufteilen und neu anordnen können (was unwahrscheinlich erscheint), kann diese Eingabe von diesem Code nicht ordnungsgemäß verarbeitet werden.Wolfram Language (Mathematica) , 62 Bytes
Probieren Sie es online!
+35 Bytes, weil OP dies spezifiziert hat
0
das in die Ausgabe einbezogen werden muss.Wenn ein Eintrag in einem Wörterbuch weggelassen wurde, sind 27 Byte zulässig
Probieren Sie es online!
Die integrierte Funktion
DayRange
akzeptiert zweiDateObject
s (oder ein String-Äquivalent) und gibt eine ListeDates
zwischen diesen Daten (einschließlich) aus.quelle
R ,
6563 BytesProbieren Sie es online!
Dies ist eine Zusammenarbeit zwischen JayCe und mir, die Stewie Griffins Antwort auf R. überträgt .
Um JayCe zu zitieren:
Möglicherweise
$c
ist es unnötig, aber es ist nicht ganz im Sinne der Herausforderung, also habe ich es aufgenommen.quelle
Powershell,
122121118113 BytesSpeichern Sie es als
count-timespan.ps1
. Testskript:Erläuterung
quelle
$cnt.Keys.Date
natürlich.function
ersetzt durchscriptblock
. Golf- und Ungolf-Codes werden getestet.scriptblock
ersetzt amfilter
. Aufruf von afilter
ist kompakter.J, 43 Bytes
Die Eingabe ist eine Liste von Ganzzahlpaaren, wobei jede Ganzzahl der Versatz von einem beliebigen gemeinsamen 0-Tag ist.
ungolfed
Erläuterung
Struktur ist:
A&:B
die Eingabe links und der Eingabe rechts abgeflacht gibt((>./ (] + i.@>:@-) <./)"1)
nimmt das Minimum und Maximum einer Liste und gibt den resultierenden Bereich zurück und handelt mit Rang 1. Daher gibt es den Gesamtbereich rechts und die einzelnen Bereiche links an.=
mit Rang"0 _
(dh Rang von{
), um zu zählen, wie oft jede Eingabe in einem der Bereiche erscheint. Mit diesen Zählungen macht es jedes Jahr einen Reißverschluss.Probieren Sie es online!
quelle
JavaScript (Node.js) , 80 Byte
Probieren Sie es online!
undefined
bedeutet Null; Das erste Element sollte frühestens beginnen(a,u=[])=>a.map(g=([p,q])=>p>q||g([p,q-1],u[z=(q-a[0][0])/864e5]=-~u[z]))&&u
ist kürzer, wenn Sie nur Elemente sehen und mehr Stapel verwendenquelle
0
akzeptabel ist.Ruby , 70 Bytes
Probieren Sie es online!
Eingang:
Array von Datumspaaren, sortiert nach Enddatum in absteigender Reihenfolge.
quelle
R (70)
Setzt einen Datenrahmen
x
mit zwei Spalten (Start
und /End
oder möglicherweiseS
und / oder) vorausE
) mit Datumsangaben (KlasseDate
) .Probieren Sie es online aus
quelle
library(magrittr)
muss in die Anzahl der Bytes einbezogen werden.x
Ihre Antwort ist, beginnt mitfunction(x)
und dann mit dem Hauptteil der Funktion.Julia 0,6 , 77 Bytes
Probieren Sie es online!
Inspiriert von @ DeadPossums Python-Lösung .
Nimmt die Eingabe als Matrix, wobei jede Zeile zwei Daten enthält: das Anfangs- und das Enddatum eines Eingabebereichs. Angenommen, die Eingabe hat zuerst das früheste Datum und jede Zeile hat zuerst das Startdatum, setzt jedoch keine darüber hinausgehende Sortierung zwischen verschiedenen Zeilen voraus.
Ältere Lösung:
Julia 0,6 , 124 Bytes
Probieren Sie es online!
Akzeptiert Eingaben als Array von Datumsbereichen. Nimmt keine Sortierung zwischen den verschiedenen Bereichen im Array an.
quelle