Terinspirasi oleh skenario kehidupan nyata, yang saya minta jawabannya di sini: /superuser/1312212/writing-a-formula-to-count-how-many-times-each-date- muncul-dalam-a-set-of-date-ran
Diberikan array rentang waktu (atau pasangan mulai-akhir-tanggal), menghasilkan hitungan berapa banyak rentang waktu setiap hari, untuk semua hari dalam rentang total.
Sebagai contoh:
# 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
Mengingat data di atas, hasilnya harus sebagai berikut:
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)
Anda hanya perlu menampilkan hitungan untuk setiap hari (agar, diurutkan terlama-terbaru); bukan catatan mana mereka muncul.
Anda dapat mengasumsikan bahwa setiap rentang waktu hanya berisi tanggal, bukan waktu; dan sepanjang hari selalu terwakili.
I / O
Input dapat berupa format apa pun yang mewakili sekumpulan rentang waktu - jadi sekumpulan pasangan waktu, atau kumpulan objek (bawaan) yang berisi tanggal mulai dan berakhir. Tanggal-waktu dibatasi antara 1901 dan 2099, seperti biasa untuk tantangan PPCG.
Anda dapat berasumsi bahwa input sudah disortir sesuka Anda (sebutkan dalam jawaban Anda). Tanggal input termasuk (sehingga rentang mencakup seluruh tanggal mulai dan berakhir).
Anda juga dapat mengasumsikan bahwa, dari dua tanggal dalam rentang tertentu, yang pertama akan lebih tua atau sama dengan yang kedua (yaitu Anda tidak akan memiliki rentang tanggal negatif).
Keluaran adalah larik yang berisi hitungan untuk setiap hari, dari yang terlama hingga yang terbaru dalam input saat diurutkan berdasarkan Tanggal Mulai.
Jadi, output untuk contoh di atas akan menjadi {3,2,2,0,1}
Mungkin saja beberapa hari tidak termasuk dalam rentang waktu apa pun, dalam hal ini 0
ini output untuk tanggal tersebut.
Kriteria Menang
Ini adalah kode-golf, sehingga byte terendah menang. Pengecualian biasa berlaku
Contoh algoritma palsu
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
Algoritme lain untuk mendapatkan hasil yang sama baik-baik saja.
0
harus di kamus? Tampaknya hanya memaksa pengguna untuk beralih darimin(input)
kemax(input)
, yang tampaknya tidak menambahkan apa pun ke inti tantangan (menghitung rentang waktu).Jawaban:
APL (Dyalog Unicode) , 32 byte SBCS
Program lengkap. Anjurkan stdin untuk daftar pasangan Nomor Tanggal Internasional (seperti apa yang digunakan Excel dan MATLAB). Daftar dan pasangan dapat diberikan dalam urutan apa pun, misalnya (Akhir, Mulai). Mencetak daftar hitungan ke stdout.
¯1+⊢∘≢⌸(R,⊢)∊(R←⌊/,⌊/+∘⍳⌈/-⌊/)¨⎕
Cobalah online!Jika ini tidak valid, daftar pasangan (YMD) dapat dikonversi untuk 21 byte tambahan, dengan total 53:
¯1+⊢∘≢⌸(R,⊢)∊(R⌊/,⌊/+∘⍳⌈/-⌊/)¨{2⎕NQ#'DateToIDN'⍵}¨¨⎕
Cobalah online!⎕
konsol yang cepat untuk input yang dievaluasi(
...)¨
terapkan fungsi diam-diam berikut untuk setiap pasangan⌊/
minimum (lit-mnt reduksi), yaitu tanggal mulai⌈/-
maksimum (yaitu tanggal akhir) dikurangi itu⌊/+∘⍳
tanggal mulai plus rentang 1-hingga-itu⌊/,
tanggal mulai diawali dengan ituR←
menetapkan fungsi ini untukR
(untuk R ange)∊
ϵ daftar (ratakan) daftar rentang menjadi satu daftar(
...)
terapkan fungsi tersembunyi berikut untuk itu:R,⊢
hasil penerapanR
(yaitu rentang tanggal) diikuti oleh argumen(ini memastikan bahwa setiap tanggal dalam kisaran diwakili setidaknya satu kali, dan bahwa tanggal muncul dalam urutan yang diurutkan)
...
⌸
untuk setiap pasangan unik (tanggal, indeks kemunculannya dalam input), lakukan:⊢∘≢
abaikan tanggal aktual demi penghitungan indeks¯1+
tambahkan -1 ke penghitungan tersebut (karena kami menambahkan satu dari setiap tanggal dalam rentang)sumber
JavaScript (ES6), 85 byte
Mengambil input sebagai daftar
Date
pasangan. Diharapkan daftar akan diurutkan berdasarkan tanggal mulai. Mengembalikan array bilangan bulat.Cobalah online!
atau 84 byte jika kita dapat mengambil cap waktu JS sebagai input (seperti yang disarankan oleh @Shaggy)
sumber
JavaScript,
7573 byteMengambil input sebagai array array yang diurutkan dari pasangan primitif tanggal, mengeluarkan objek di mana kuncinya adalah primitif dari setiap tanggal dan nilai penghitungan tanggal tersebut dalam rentang.
Cobalah
Saya sedang mengerjakan versi 60 byte ini hingga dipastikan bahwa tanggal yang tidak muncul di rentang mana pun harus dimasukkan sehingga dengan tergesa-gesa memperbaruinya ke solusi di atas.
Coba online (atau dengan tanggal yang dapat dibaca manusia di output )
sumber
Oktaf , 63 byte
Cobalah online!
Nah, itu jelek!
Penjelasan:
Mengambil input sebagai array
datenum
elemen sel (yaitu string yang"2001-01-01"
dikonversi ke nilai numerik, terlihat seperti ini:dimana
d()
fungsinyadatenum
. Kami kemudian gunakancellfun
untuk membuat sel dengan rentang dari kolom pertama ke yang kedua untuk setiap baris tersebut. Kami menggabungkan rentang ini secara horizontal, sehingga kami memiliki vektor horizontal panjang dengan semua tanggal.Kami kemudian membuat histogram menggunakan
histc
nilai-nilai ini, dengan nampan yang diberikan oleh rentang antara tanggal terendah dan tertinggi.sumber
R , 75 byte
Cobalah online!
Input adalah matriks yang kolom pertama adalah Mulai dan kolom kedua adalah Akhir. Asumsikan Mulai <= Akhir tetapi tidak memerlukan tanggal Mulai untuk diurutkan.
sumber
hist
; Anda dapat melakukannyac(-25668,min(x):max(x))
sejak-25568
sebelum1900
tetapi ini berakhir lebih lama dari jawaban yang Anda sarankan. Yang sedang berkata, ada cara yang lebih baik untuk menghasilkan tanggal daripadaapply
; Saya punya satu yang di 68 byte dan saya belum menemukan waktu untuk mempostingnya sendiri.(min(x)-1):max(x)
dan seharusnya berfungsi seperti yang diharapkan; maka jika Anda dapat menemukanapply
cara untuk menghasilkan tanggal Anda bisa mendapatkan ini hingga 63 byte dan mengikat jawaban Oktaf.table
danfactor
sebelumnya yang merupakan penggunaan asli sayaMap
untuk 68 byte, tetapihist
merupakan pendekatan yang rapi yang saya selalu lupa, mungkin karena itu mengganggu untuk mendapatkan tempat sampah tepat (seperti yang telah kita lihat )Merah , 174 byte
Implementasi yang cukup lama dan literal.
Cobalah online!
Dapat dibaca:
sumber
Groovy, 142 byte
Diformat:
sumber
Python 2 ,
1148793 byte-27 byte terima kasih kepada Jonathan Allan
+6 bytes berkat sundar
Mengambil input sebagai daftar pasangan objek datetime.
Mengasumsikan bahwa pasangan pertama dimulai dengan tanggal terendah.
Cobalah online!
sumber
days
adalah argumen default untuktimedelta
.from datetime import*
dan gantid+=timedelta(days=1)
dengand+=type(d-d)(1)
karena input sudahdate
s. 87 byte[(2001-01-01, 2001-01-05), (2001-01-02, 2001-01-03)]
. Kecuali OP memungkinkan kami untuk membagi dan mengatur ulang rentang ini selama preprocessing (yang tampaknya tidak mungkin), input ini tidak dapat diproses oleh kode ini dengan benar.Bahasa Wolfram (Mathematica) , 62 byte
Cobalah online!
+35 byte karena OP ditentukan yang
0
harus dimasukkan dalam output.Jika menghilangkan entri dalam kamus diizinkan, 27 byte
Cobalah online!
Built-in
DayRange
menerima duaDateObject
s (atau string yang setara) dan menampilkan daftarDates
antara tanggal tersebut (termasuk).sumber
R ,
6563 byteCobalah online!
Ini adalah kolaborasi antara JayCe dan saya, mengirim jawaban Stewie Griffin ke R.
Mengutip JayCe:
Mungkin,
$c
tidak perlu tetapi tidak dalam semangat tantangan jadi saya sudah memasukkannya.sumber
Powershell,
122121118113 bytesimpan sebagai
count-timespan.ps1
. Skrip uji:Penjelasan
sumber
$cnt.Keys.Date
tentu saja.function
diganti denganscriptblock
. kode golf dan ungolfed diuji.scriptblock
diganti aktiffilter
. Panggilan seorangfilter
lebih kompak.J, 43 byte
input adalah daftar pasangan bilangan bulat, di mana masing-masing bilangan bulat adalah offset dari sembarang 0 hari umum.
ungolfed
penjelasan
struktur adalah:
A&:B
input di sebelah kiri dan input diratakan di sebelah kanan((>./ (] + i.@>:@-) <./)"1)
mengambil min dan maks dari daftar dan mengembalikan rentang yang dihasilkan, dan bertindak dengan peringkat 1. karenanya memberikan kisaran total di sebelah kanan, dan rentang individu di sebelah kiri.=
dengan peringkat"0 _
(yaitu, peringkat{
) untuk menghitung berapa kali setiap input muncul di salah satu rentang. akhirnya ritsleting setiap tahun dengan jumlah tersebut.Cobalah online!
sumber
JavaScript (Node.js) , 80 byte
Cobalah online!
undefined
berarti nol; Elemen pertama harus dimulai paling awal(a,u=[])=>a.map(g=([p,q])=>p>q||g([p,q-1],u[z=(q-a[0][0])/864e5]=-~u[z]))&&u
lebih pendek jika Anda hanya melihat elemen dan menggunakan lebih banyak tumpukansumber
0
dapat diterima.Ruby , 70 byte
Cobalah online!
Memasukkan:
Array pasang tanggal, disortir berdasarkan tanggal berakhir turun.
sumber
R (70)
Menganggap frame data
x
dengan dua kolom (Start
danEnd
atau mungkinS
danE
) dengan tanggal (kelasDate
).Cobalah online
sumber
library(magrittr)
perlu dimasukkan dalam jumlah byte.x
jawaban Anda dimulai denganfunction(x)
dan kemudian badan fungsi.Julia 0.6 , 77 byte
Cobalah online!
Terinspirasi oleh @ DeadPossum's solusi Python .
Mengambil input sebagai matriks, di mana setiap baris memiliki dua tanggal: tanggal awal dan akhir dari rentang input. Mengasumsikan input memiliki tanggal paling awal terlebih dahulu, dan bahwa setiap baris memiliki tanggal mulai pertama, tetapi mengasumsikan tidak ada penyortiran di luar itu antara baris yang berbeda.
Solusi yang lebih lama:
Julia 0,6 , 124 byte
Cobalah online!
Menerima input sebagai larik rentang tanggal. Tidak menganggap pengurutan di antara berbagai rentang dalam array.
sumber