Temukan Tanggal terdekat ke TargetDate untuk Hari Minggu tertentu.
Misalnya, diberi tanggal 20161219
dan satu hari dalam seminggu Friday (6)
, jawabannya adalah 20161216
.
Contoh lain, diberi tanggal 20161219
dan satu hari dalam seminggu Wednesday (4)
, jawabannya adalah 20161221
.
Contoh terakhir, diberi tanggal 20161219
dan hari dalam seminggu Monday (2)
, jawabannya adalah 20161219
.
Aturan:
- Format Tanggal untuk input dan output harus sesuai. Dalam contoh, saya menggunakan
yyyymmdd
, tetapi Anda dapat menggunakan format apa pun sepanjang tahun (setidaknya dua digit), bulan, dan hari dalam sebulan "dapat dibaca manusia". - Day of Week dimasukkan sebagai bilangan bulat. Dalam contoh saya, hari Minggu adalah hari pertama dalam seminggu, oleh karena itu itu adalah hari dalam jumlah minggu
1
. Anda dapat memiliki penomoran Day of Week, selama Anda mencatatnya ketika berbeda dari contoh. - Tahun 1970 hingga 2030 harus diakomodasi.
- Alat dan pustaka tanggal bahasa umum diizinkan, tetapi kredibilitas jalanan diberikan kepada mereka yang memilih untuk tidak menggunakannya.
- Jumlah byte terkecil menang.
Jawaban:
Perl 6 , 46 byte
Sebuah lambda yang menerima dua argumen: String tanggal dalam
yyyy-mm-dd
format, dan angka hari kerja antara1
= Senin dan7
= Minggu.Penjelasan:
Menggunakan format tanggal dan hari kerja yang digunakan dalam contoh, itu akan menjadi 88 byte:
sumber
Perl 6 , 83 byte
Cobalah
Diperluas
sumber
JavaScript (ES6), 93 byte
Menggunakan
%Y-%m-%d
format tanggal. Jika%a %b %d %Y
format tanggal dapat diterima, maka untuk 82 byte:Saya bisa menyimpan 2 byte lebih lanjut dengan membutuhkan hari Minggu = 10 hingga Sabtu = 16, tapi itu hari yang konyol dalam pemetaan seminggu. Sebelumnya
142141 byte (terima kasih kepada @Guedes) versi yang menggunakan format tanggal YYYYMMDD tertentu, dengan penjelasannya:Ini terasa terlalu lama. Penjelasan: Pertama, masukkan
-
tanggal untuk memasukkannya ke dalam format ISO yangnew Date
kemudian dapat diuraikan. Kemudian, bandingkan hari yang diinginkan dengan hari yang sebenarnya untuk mendapatkan nilai antara-3
dan3
untuk offset aktual. Keajaiban9
datang dari7
(karena%
CPU modulo, bukan modulo benar) plus3
(untuk-3
offset) minus1
(karenan
1-diindeks dangetDay
0-diindeks). Tanggal kemudian dikonversi kembali ke format ISO dan karakter yang tidak diinginkan dihapus.sumber
.replace(/(?=..(..)?$)/g,'-')
Python,
150149 byteOouuf, 149. repl.it
Fungsi tanpa nama yang mengambil string
s
, tanggal seperti yang ditentukan (menggunakan format stringt='%Y%m%d'
untuk input dan output) dan angka dalam [1,7]n
,.Memeriksa tujuh hari dari tiga hari sebelum tiga hari setelah itu diberikan untuk hari dalam seminggu yang diminta.
Minggu masuk
datetime
dimulai pada hari Senin dan berbasis nol, jadi tesnya adalah(n-2)%7==d.weekday()
.sumber
Bash + coreutils, 50
Cobalah online .
date -d$1 +%u
beri hari dalam seminggu (1..7); 1 adalah Senin3 + 7 - 1
. 3 menyesuaikan rentang input untuk rentang [-3, 3], dan dikurangi lagi setelah modulo. 7 diperlukan karena bash modulo sama dengan modulo CPU dan dapat memberikan -ve hasil - menambahkan 7 menyesuaikan ke kisaran yang tepat. -1 adalah karena dalam input, 1 adalah hari Minggu, tetapi dengan% u output, 1 adalah hari Senin.date
kemudian mem<input date> + <magic factor>days
- parsing dan menyajikannya dalam format YYYYMMDD.sumber
SAS Macro Language, 110 Bytes
Bahasa golf yang mengerikan tapi inilah penjelasannya (dari dalam ke luar):
Buat makro
s
yang menerima input tanggald
dan hari kerja numerika
. Kemudian%eval(%sysfunc(putn(&d,8.))-4)
mengonversi tanggal menjadi tanggal numerik SAS dan menguranginya 4 hari. Theintnx
fungsi kemudian kembali terjadinya berikutnya dari hari kerja yang ditentukan.putn
kemudian memformat tanggal kembali ke yyyymmdd dan%put
mencetak output ke log.sumber
Mathematica,
8549 byteFormat input untuk tanggal adalah daftar suka
{2016, 12, 16}
atau aktualDateObject
(saya pikir beberapa yang lain juga berfungsi, tapi saya sudah menguji ini). Dalam kedua kasus, format output akan cocok secara otomatis. Penomoran hari dimulai1
pada hari Senin.Idenya adalah untuk menghitung perbedaan antara input hari kerja dan hari kerja target dengan
#2-#~DateValue~"ISOWeekDay"
dan kemudian memetakannya[-3, 3]
menggunakan modulo dengan offset (yaituMod[...,7,-3]
). Hasilnya hanya ditambahkan ke tanggal input (unit default untuk penambahan objek tanggal adalah hari).sumber
R,
119 7756 byteFungsi tanpa nama yang mengambil dua input, tanggal
D
(string) dan harid
(numerik).Menggunakan fungsi
wday()
darilubridate
paket. Itu dapat dengan mudah mengkonversiDate
objek menjadi hari kerja dengan1
diperlakukan sebagai hari Minggu secara default.Sunting: I / O sekarang merupakan
as.Date()
fungsi default :"YYYY-mm-dd"
Tidak Dijelaskan dan Dijelaskan
Sunting: Sekarang membuat urutan
+-3
hari di mana setiap hari kerja tertentu dijamin dapat ditemukan. Selanjutnya kita hanya perlu mencocokkan satu hari yang membuat masalah menjadi lebih mudah.sumber