Inspiré d'un scénario réel, auquel j'ai demandé une réponse ici: /superuser/1312212/writing-a-formula-to-count-how-many-times-each-date- apparaît dans un ensemble de dates
Étant donné un tableau d'intervalles de temps (ou de paires startdate-enddate), affichez un nombre de périodes couvrant chaque jour, pour tous les jours de la plage totale.
Par exemple:
# 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
Compte tenu des données ci-dessus, les résultats devraient être les suivants:
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)
Vous avez seulement besoin de sortir les comptes pour chaque jour (dans l'ordre, triés du plus ancien au plus récent); pas dans quels enregistrements ils apparaissent.
Vous pouvez supposer que chaque intervalle de temps contient uniquement des dates, pas des heures; et ainsi des jours entiers sont toujours représentés.
E / S
L'entrée peut être n'importe quel format représentant un ensemble d'intervalles de temps - donc soit un ensemble de paires d'heures, soit une collection d'objets (intégrés) contenant des dates de début et de fin. Les dates-heures sont limitées entre 1901 et 2099, comme c'est normal pour les défis PPCG.
Vous pouvez supposer que l'entrée est pré-triée comme vous le souhaitez (spécifiez dans votre réponse). Les dates d'entrée sont inclusives (donc la plage comprend l'ensemble des dates de début et de fin).
Vous pouvez également supposer que, parmi les deux dates d'une plage donnée, la première sera plus ancienne ou égale à la seconde (c'est-à-dire que vous n'aurez pas de plage de dates négative).
La sortie est un tableau contenant le nombre pour chaque jour, du plus ancien au plus récent dans l'entrée lorsqu'il est trié par date de début.
Ainsi, la sortie de l'exemple ci-dessus serait {3,2,2,0,1}
Il est possible que certains jours ne soient inclus dans aucune plage horaire, auquel cas la 0
sortie est effectuée pour cette date.
Critères gagnants
C'est le code-golf, donc les octets les plus bas gagnent. Les exclusions habituelles s'appliquent
Exemple de pseudo-algorithme
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
D'autres algorithmes pour arriver au même résultat sont très bien.
0
devrait être dans un dictionnaire? Cela semble seulement forcer l'utilisateur à parcourir demin(input)
àmax(input)
, ce qui ne semble rien ajouter au cœur du défi (temps de calcul).Réponses:
APL (Dyalog Unicode) , 32 octets SBCS
Programme complet. Demande à stdin une liste de paires de numéros de date internationaux (comme ce qu'utilisent Excel et MATLAB). La liste et les paires peuvent être données dans n'importe quel ordre, par exemple (Fin, Début). Imprime la liste des décomptes vers la sortie standard.
¯1+⊢∘≢⌸(R,⊢)∊(R←⌊/,⌊/+∘⍳⌈/-⌊/)¨⎕
Essayez-le en ligne!Si cela n'est pas valide, une liste de paires (YMD) peut être convertie pour 21 octets supplémentaires, pour un total de 53:
¯1+⊢∘≢⌸(R,⊢)∊(R⌊/,⌊/+∘⍳⌈/-⌊/)¨{2⎕NQ#'DateToIDN'⍵}¨¨⎕
Essayez-le en ligne!⎕
console d'invite pour l'entrée évaluée(
…)¨
Appliquer la fonction tacite suivante à chaque paire⌊/
le minimum (lit. min-réduction), c'est-à-dire la date de début⌈/-
le maximum (c'est-à-dire la date de fin) moins⌊/+∘⍳
la date de début plus la plage de 1 à celle⌊/,
la date de début précédait celleR←
affecter cette fonction àR
(pour R ange)∊
ε nlist (aplatir) la liste des gammes en une seule liste(
…)
Appliquer la fonction tacite suivante à cela:R,⊢
le résultat de l'applicationR
(c'est-à-dire la plage de dates) suivi de l'argument(cela garantit que chaque date de la plage est représentée au moins une fois et que les dates apparaissent dans l'ordre trié)
…
⌸
Pour chaque paire d'unique (date, ses indices d'occurrence en entrée), faites:⊢∘≢
ignorer la date réelle en faveur du décompte des indices¯1+
ajoutez -1 à ces décomptes (car nous avons ajouté une de chaque date dans la plage)la source
JavaScript (ES6), 85 octets
Prend la saisie sous forme de liste de
Date
paires. Attend que la liste soit triée par date de début. Renvoie un tableau d'entiers.Essayez-le en ligne!
ou 84 octets si nous pouvons prendre les horodatages JS en entrée (comme suggéré par @Shaggy)
la source
JavaScript,
7573 octetsPrend les entrées sous la forme d'un tableau trié de tableaux de paires de primitives de date, génère un objet dont les clés sont les primitives de chaque date et les valeurs, le nombre de ces dates dans les plages.
Essayez-le
Je travaillais sur cette version de 60 octets jusqu'à ce qu'il soit confirmé que les dates qui n'apparaissent dans aucune des plages doivent être incluses, donc mis à jour à la hâte vers la solution ci-dessus.
Essayez-le en ligne (ou avec des dates lisibles par l'homme dans la sortie )
la source
Octave , 63 octets
Essayez-le en ligne!
Maintenant, c'était moche!
Explication:
Prend l'entrée comme un tableau de cellules d'
datenum
éléments (c'est-à-dire une chaîne"2001-01-01"
convertie en une valeur numérique, ressemblant à ceci:où
d()
est la fonctiondatenum
. Nous utilisons ensuitecellfun
pour créer des cellules avec les plages de la première colonne à la seconde pour chacune de ces lignes. Nous concaténons ces plages horizontalement, de sorte que nous avons un long vecteur horizontal avec toutes les dates.Nous créons ensuite un histogramme à l'aide
histc
de ces valeurs, avec des cases données par la plage entre la date la plus basse et la date la plus élevée.la source
R , 75 octets
Essayez-le en ligne!
L'entrée est une matrice dont la première colonne est Début et la deuxième colonne est Fin. Suppose Début <= Fin mais ne nécessite pas de tri des dates de début.
la source
hist
; vous pourriez fairec(-25668,min(x):max(x))
depuis-25568
avant,1900
mais cela finit par être plus long que votre réponse suggérée. Cela étant dit, il existe une meilleure façon de générer les dates queapply
; J'en ai un qui fait 68 octets et je n'ai tout simplement pas trouvé le temps de le poster moi-même.(min(x)-1):max(x)
et cela devrait fonctionner comme prévu; alors si vous pouvez trouver leapply
moyen de générer les dates, vous pouvez obtenir ceci à 63 octets et lier la réponse Octave.table
etfactor
avant ce qui était mon utilisation d'origineMap
pour 68 octets, maishist
c'est une approche soignée que j'oublie toujours, probablement parce que c'est ennuyeux d'obtenir les bacs juste à droite (comme nous l'avons vu )Rouge , 174 octets
Implémentation assez longue et littérale.
Essayez-le en ligne!
Lisible:
la source
Groovy, 142 octets
La
Formaté:
la source
Python 2 ,
1148793 octets-27 octets grâce à Jonathan Allan
+6 octets grâce à Sundar
Prend l'entrée sous forme de liste de paires d'objets datetime.
Suppose que la première paire commence par la date la plus basse.
Essayez-le en ligne!
la source
days
est l'argument par défaut detimedelta
.from datetime import*
et remplacerd+=timedelta(days=1)
pard+=type(d-d)(1)
puisque les entrées sont déjàdate
s. 87 octets[(2001-01-01, 2001-01-05), (2001-01-02, 2001-01-03)]
. À moins que OP ne nous permette de diviser et de réorganiser ces plages pendant le prétraitement (ce qui semble peu probable), cette entrée ne peut pas être traitée correctement par ce code.Wolfram Language (Mathematica) , 62 octets
Essayez-le en ligne!
+35 octets car OP a spécifié qu'il
0
doit être inclus dans la sortie.Si l'omission d'une entrée dans un dictionnaire était autorisée, 27 octets
Essayez-le en ligne!
La fonction intégrée
DayRange
accepte deuxDateObject
s (ou une chaîne équivalente) et affiche une liste d'Dates
entre ces dates (inclus).la source
R ,
6563 octetsEssayez-le en ligne!
Il s'agit d'une collaboration entre JayCe et moi-même, portant la réponse de Stewie Griffin sur R.
Pour citer JayCe:
C'est peut-être
$c
inutile, mais ce n'est pas tout à fait dans l'esprit du défi, je l'ai donc inclus.la source
Powershell,
122121118113 113 octetsenregistrez-le sous
count-timespan.ps1
. Script de test:Explication
la source
$cnt.Keys.Date
bien sûr.function
remplacé parscriptblock
. les codes golfés et non golfés sont testés.scriptblock
remplacé lefilter
. L'appel d'unfilter
est plus compact.J, 43 octets
l'entrée est une liste de paires d'entiers, où chaque entier est le décalage de tout 0 jour arbitraire commun.
non golfé
explication
la structure est:
A&:B
l'entrée à gauche et l'entrée aplatie à droite((>./ (] + i.@>:@-) <./)"1)
prend le min et le max d'une liste et renvoie la plage résultante, et agit avec le rang 1. Par conséquent, il donne la plage totale à droite et les plages individuelles à gauche.=
avec rang"0 _
(c'est-à-dire rang de{
) pour compter le nombre de fois que chaque entrée apparaît dans l'une des plages. enfin, il zippe chaque année avec ces chiffres.Essayez-le en ligne!
la source
JavaScript (Node.js) , 80 octets
Essayez-le en ligne!
undefined
signifie zéro; Le premier élément doit commencer le plus tôt(a,u=[])=>a.map(g=([p,q])=>p>q||g([p,q-1],u[z=(q-a[0][0])/864e5]=-~u[z]))&&u
est plus court si vous ne voyez que des éléments et utilisez plus de pilela source
0
est acceptable.Rubis , 70 octets
Essayez-le en ligne!
Contribution:
Tableau de paires de dates, triées par date de fin décroissante.
la source
R (70)
Suppose un bloc de données
x
avec deux colonnes (Start
etEnd
ou éventuellementS
etE
) avec des dates (classeDate
).Essayez-le en ligne
la source
library(magrittr)
doit être inclus dans le nombre d'octets.x
votre réponse commence parfunction(x)
le corps de la fonction.Julia 0,6 , 77 octets
Essayez-le en ligne!
Inspiré par @ DeadPossum's solution Python de .
Prend l'entrée comme une matrice, où chaque ligne a deux dates: les dates de début et de fin d'une plage d'entrée. Suppose que l'entrée a la date la plus ancienne en premier et que chaque ligne a la date de début en premier, mais ne suppose aucun tri au-delà de celui entre les différentes lignes.
Solution plus ancienne:
Julia 0,6 , 124 octets
Essayez-le en ligne!
Accepte l'entrée comme un tableau de plages de dates. N'assume aucun tri parmi les différentes plages du tableau.
la source