Tugas Anda adalah menghasilkan satu nomor; jumlah minggu ISO yang memotong rentang tanggal tertentu. Mengutip Wikipedia:, An average year is exactly 52.1775 weeks long
tapi ini bukan tentang rata-rata.
Input terdiri dari dua tanggal ISO yang dipisahkan oleh ruang:
0047-12-24 2013-06-01
Tanggal akhir tidak pernah sebelum tanggal mulai. Kami akan menggunakan kalender Gregorian ekstrapolasi untuk kesederhanaan.
Kasus uji:
Format: input -> output
2015-12-31 2016-01-01 -> 1 (both are within week 53 of 2015)
2016-01-03 2016-01-04 -> 2 (the 3rd is within week 53, and the 4th is in week 1)
2015-12-24 2015-12-24 -> 1 (this single day is of course within a single week)
Solusi Anda harus menangani tanggal antara 0001-01-01
dan 9999-12-31
.
Weeks start with Monday.
Jawaban:
Ruby,
898886 byteSebuah solusi yang sangat primitif: diberikan tanggal pertama
a
dan tanggal keduab
, selisiha
, cek apakah itu hari Senin (jika demikian, kita sudah "berguling" untuk satu minggu baru), dan berhenti setelaha
inib
.Mengambil input dalam format persis yang ditentukan dalam pertanyaan: string yang dipisahkan spasi. (Cara mem-parsing input adalah fancy-ish: ia menggunakan operator "splat" Ruby
*
,. Operator ini "memperluas" array atau menghitung, jadiTime.gm *[2013, 06, 01]
menjadiTime.gm 2013, 06, 01
.)Diimpor dari diskusi komentar:
Hanya untuk menghindari kebingungan di masa depan dengan apakah ini menangani batas tahun dengan benar — menurut Wikipedia , semua minggu selalu dimulai pada hari Senin dan berakhir pada hari Minggu.
Untuk beberapa trik mewah lainnya, ini semua setara:
sumber
a==b
oleha<b
?VBA, 125 Bytes
Mengharapkan 2 input fungsi sebagai string
Cukup yakin Ini bisa bermain golf. Ini adalah perulangan meskipun setiap hari antara 2 tanggal dan menambah penghitung setiap kali tanggal ISO berubah.
DatePart("ww",f+i,2,2)
adalah angka minggu ISO dalam VBA 2 artinya pertamaMonday (complies with ISO standard 8601, section 3.17)
. maka yang kedua berarti 2Week that has at least four days in the new year (complies with ISO standard 8601, section 3.17)
140 byte w / input tunggal
sumber
R, 76 byte
Setelah berbicara dengan @Doorknob, akhirnya semudah menghitung hari Senin.
seq
memungkinkan untuk membuat vektor tanggal (setiap hari antara dua tanggal) dan strftime mengubahnya menjadi 'jumlah hari dalam seminggu', sekarang hitung berapa kali 1 untuk mendapatkan jumlah waktu Anda mengubah minggu dan tambahkan 1 ke memperhitungkan minggu sebelumnya.Perulangan pendekatan lain:
R, 85 byte
sumber
Mathematica
135 79 96 8474 byteKonsisten dengan saran @ Doorknob, ini
menghasilkan semua tanggal dalam kisaran
menghitung jumlah Senin (
ISOWeekDay
== "1") diDateRange
(tidak termasukd
), danmenambah
1
total.sumber