Zainspirowany scenariuszem z życia, o który poprosiłem o odpowiedź tutaj: /superuser/1312212/writing-a-formula-to-count-how-many-times-each-date- pojawia się w zestawie z datą uruchomienia
Biorąc pod uwagę tablicę przedziałów czasowych (lub par data-data-początek), wypisz liczbę, ile przedziałów czasowych obejmuje każdego dnia, dla wszystkich dni w całym zakresie.
Na przykład:
# 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
Biorąc pod uwagę powyższe dane, wyniki powinny być następujące:
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)
Musisz podać tylko liczby dla każdego dnia (w kolejności, posortowane od najstarszych do najnowszych); nie w jakich rekordach się pojawiają.
Możesz założyć, że każdy przedział czasowy zawiera tylko daty, a nie godziny; a więc całe dni są zawsze reprezentowane.
I / O
Dane wejściowe mogą być dowolnym formatem reprezentującym zestaw przedziałów czasowych - a więc albo zestaw par czasów, albo zbiór (wbudowanych) obiektów zawierających daty początkowe i końcowe. Terminy są ograniczone do okresu od 1901 do 2099, co jest normalne w przypadku wyzwań PPCG.
Możesz założyć, że dane wejściowe są wstępnie posortowane, jak chcesz (podaj w odpowiedzi). Daty wprowadzania są włącznie (więc zakres obejmuje całość dat rozpoczęcia i zakończenia).
Możesz również założyć, że z dwóch dat w danym zakresie pierwszy będzie starszy lub równy drugiemu (tzn. Nie będziesz miał ujemnego zakresu dat).
Dane wyjściowe to tablica zawierająca liczbę dla każdego dnia, od najstarszego do najnowszego na wejściu, posortowane według daty początkowej.
Zatem wynik dla powyższego przykładu byłby {3,2,2,0,1}
Możliwe jest, że niektóre dni nie zostaną uwzględnione w żadnym przedziale czasowym, w którym 0
to przypadku jest generowany dla tej daty.
Zwycięskie kryteria
To jest golf golfowy, więc wygrywa najmniej bajtów. Obowiązują zwykłe wyłączenia
Przykład pseudo-algorytmu
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
Inne algorytmy pozwalające uzyskać ten sam wynik są w porządku.
0
powinienem znajdować się w słowniku? Wydaje się to tylko zmuszać użytkownika do iteracji odmin(input)
domax(input)
, co wydaje się nie dodawać niczego do rdzenia wyzwania (obliczanie przedziałów czasowych).Odpowiedzi:
APL (Dyalog Unicode) , 32 bajty SBCS
Pełny program Monituje stdin o listę par międzynarodowych numerów dat (np. Tego, czego używają Excel i MATLAB). Zarówno lista, jak i pary mogą być podawane w dowolnej kolejności, np. (End, Start). Wyświetla listę zliczeń na standardowe wyjście.
¯1+⊢∘≢⌸(R,⊢)∊(R←⌊/,⌊/+∘⍳⌈/-⌊/)¨⎕
Wypróbuj online!Jeśli jest to nieprawidłowe, listę par (YMD) można przekonwertować na dodatkowe 21 bajtów, łącznie 53:
¯1+⊢∘≢⌸(R,⊢)∊(R⌊/,⌊/+∘⍳⌈/-⌊/)¨{2⎕NQ#'DateToIDN'⍵}¨¨⎕
Wypróbuj online!⎕
monit konsoli do oceny danych wejściowych(
…)¨
Zastosuj następującą milczącą funkcję do każdej pary⌊/
minimum (lit. min. redukcja), tj. data rozpoczęcia⌈/-
maksymalna (tj. data końcowa) minus to⌊/+∘⍳
data rozpoczęcia plus zakres od 1 do 1⌊/,
data rozpoczęcia została do tego dodanaR←
przypisz tę funkcję doR
(dla R ange)∊
ε nlist (Spłaszczenie) wykaz zakresów na jednej liście(
…)
Zastosuj do tego następującą milczącą funkcję:R,⊢
wynik zastosowaniaR
(tj. zakres dat), po którym następuje argument(zapewnia to, że każda data w zakresie jest reprezentowana co najmniej raz, a daty pojawiają się w posortowanej kolejności)
…
⌸
Dla każdej pary unikalnych (data, jej wskaźniki wystąpienia na wejściu):⊢∘≢
zignoruj faktyczną datę na korzyść sumy indeksów¯1+
dodaj -1 do tych danych statystycznych (ponieważ dodaliśmy jedną z każdej daty w zakresie)źródło
JavaScript (ES6), 85 bajtów
Pobiera dane wejściowe jako listę
Date
par. Oczekuje, że lista zostanie posortowana według daty początkowej. Zwraca tablicę liczb całkowitych.Wypróbuj online!
lub 84 bajtów, jeśli możemy wziąć znaczniki czasu JS jako dane wejściowe (jak sugeruje @Shaggy)
źródło
JavaScript,
7573 bajtówPobiera dane wejściowe jako posortowaną tablicę tablic par prymitywów daty, generuje obiekt, w którym klucze są prymitywami każdej daty, a wartości zlicza te daty w zakresach.
Spróbuj
Pracowałem nad tą 60-bajtową wersją, dopóki nie potwierdzono, że daty, które nie występują w żadnym z zakresów, muszą zostać uwzględnione, więc pospiesznie zaktualizowałem ją do powyższego rozwiązania.
Wypróbuj online (lub z danymi wyjściowymi czytelnymi dla ludzi )
źródło
Oktawa , 63 bajty
Wypróbuj online!
To było brzydkie!
Wyjaśnienie:
Pobiera dane wejściowe jako tablicę komórek
datenum
elementów (tj. Ciąg"2001-01-01"
przekonwertowany na wartość liczbową, wyglądający tak:gdzie
d()
jest funkcjadatenum
. Następnie używamycellfun
do tworzenia komórek z zakresami od pierwszej kolumny do drugiej dla każdego z tych wierszy. Łączymy te zakresy poziomo, dzięki czemu mamy długi poziomy wektor ze wszystkimi datami.Następnie tworzymy histogram przy użyciu
histc
tych wartości, z przedziałami podanymi w przedziale od najniższej do najwyższej daty.źródło
R , 75 bajtów
Wypróbuj online!
Dane wejściowe to macierz, której pierwsza kolumna to Start, a druga kolumna to Koniec. Zakłada Początek <= Koniec, ale nie wymaga sortowania dat rozpoczęcia.
źródło
hist
; można zrobić,c(-25668,min(x):max(x))
ponieważ-25568
jest przed1900
, ale to kończy się dłużej niż sugerowane odpowiedzi. Biorąc to pod uwagę, istnieje lepszy sposób na generowanie dat niżapply
; Mam taki, który ma 68 bajtów i po prostu nie znalazłem czasu, aby go opublikować.(min(x)-1):max(x)
i powinno działać zgodnie z oczekiwaniami; to jeśli nie możesz znaleźćapply
sposobu na generowanie dat, możesz uzyskać to do 63 bajtów i powiązać odpowiedź Octave.table
afactor
wcześniej było to moje pierwotne użycieMap
dla 68 bajtów, alehist
jest to fajne podejście, o którym zawsze zapominam, prawdopodobnie dlatego, że denerwujące jest prawidłowe umieszczenie pojemników (jak widzieliśmy )Czerwony , 174 bajty
Całkiem długie i dosłowne wdrożenie.
Wypróbuj online!
Czytelny:
źródło
Groovy, 142 bajty
W pobliżu
Sformatowany:
źródło
Python 2 ,
1148793 bajtów-27 bajtów dzięki Jonathanowi Allanowi
+6 bajtów dzięki sundarowi
Pobiera dane wejściowe jako listę par obiektów datetime.
Zakłada, że pierwsza para zaczyna się od najniższej daty.
Wypróbuj online!
źródło
days
jest domyślnym argumentem dlatimedelta
.from datetime import*
i wymienićd+=timedelta(days=1)
zd+=type(d-d)(1)
od wejścia są jużdate
s. 87 bajtów[(2001-01-01, 2001-01-05), (2001-01-02, 2001-01-03)]
. O ile OP nie pozwala nam dzielić i zmieniać kolejności tych zakresów podczas przetwarzania wstępnego (co wydaje się mało prawdopodobne), dane wejściowe nie mogą być poprawnie przetworzone przez ten kod.Wolfram Language (Mathematica) , 62 bajty
Wypróbuj online!
+35 bajtów, ponieważ określono OP, które
0
należy uwzględnić w danych wyjściowych.Jeżeli pominięcie wpisu w słowniku było dozwolone, 27 bajtów
Wypróbuj online!
Wbudowane
DayRange
akceptuje dwaDateObject
s (lub ciąg równoważny) i wyświetla listęDates
między tymi datami (włącznie).źródło
R ,
6563 bajtówWypróbuj online!
To jest współpraca między JayCe a mną, przenosząca odpowiedź Stewiego Griffina na R.
Cytując JayCe:
Być może
$c
jest to niepotrzebne, ale nie jest w duchu wyzwania, więc go uwzględniłem.źródło
PowerShell,
122121118113 bajtówzapisz to jako
count-timespan.ps1
. Skrypt testowy:Wyjaśnienie
źródło
$cnt.Keys.Date
oczywiście.function
zastąpione przezscriptblock
. kody do gry w golfa i bez golfa są testowane.scriptblock
wymienianefilter
. Call of afilter
jest bardziej kompaktowy.J, 43 bajty
dane wejściowe to lista par liczb całkowitych, gdzie każda liczba całkowita jest przesunięciem względem dowolnego dowolnego wspólnego 0-dni.
bez golfa
wyjaśnienie
struktura jest:
A&:B
wejście po lewej, a wejście spłaszczone po prawej((>./ (] + i.@>:@-) <./)"1)
przyjmuje wartość minimalną i maksymalną listy i zwraca wynikowy zakres, i działa z rangą 1. stąd daje całkowity zasięg po prawej stronie, a poszczególne zakresy po lewej.=
z rangą"0 _
(tj. Ranga{
), aby policzyć, ile razy każde wejście pojawia się w dowolnym z zakresów. wreszcie z każdym rokiem zamyka się.Wypróbuj online!
źródło
JavaScript (Node.js) , 80 bajtów
Wypróbuj online!
undefined
oznacza zero; Pierwszy element powinien zacząć się najwcześniej(a,u=[])=>a.map(g=([p,q])=>p>q||g([p,q-1],u[z=(q-a[0][0])/864e5]=-~u[z]))&&u
jest krótszy, jeśli widzisz tylko elementy i używasz więcej stosuźródło
0
jest dopuszczalne.Rubinowy , 70 bajtów
Wypróbuj online!
Wejście:
Tablica par dat, posortowana według malejącej daty końcowej.
źródło
R (70)
Zakłada ramkę danych
x
z dwiema kolumnami (Start
iEnd
ewentualnieS
iE
) z datami (klasaDate
).Wypróbuj online
źródło
library(magrittr)
musi być uwzględnione w liczbie bajtów.x
twoja odpowiedź, zaczyna sięfunction(x)
od treści funkcji.Julia 0.6 , 77 bajtów
Wypróbuj online!
Zainspirowany rozwiązaniem Python @ DeadPossum .
Pobiera dane wejściowe jako macierz, gdzie każdy wiersz ma dwie daty: datę początkową i końcową zakresu wejściowego. Zakłada, że dane wejściowe mają najwcześniejszą datę i że każdy wiersz ma datę początkową jako pierwszą, ale nie zakłada sortowania poza tym między różnymi wierszami.
Starsze rozwiązanie:
Julia 0.6 , 124 bajty
Wypróbuj online!
Akceptuje dane wejściowe jako tablicę zakresów dat. Nie zakłada żadnego sortowania między różnymi zakresami w tablicy.
źródło