Saya memiliki rekan kerja yang bekerja dari rumah setiap hari Selasa dan Kamis. Sekitar jam 8:00 pagi dia mengirimi kami pesan dengan teks berikut:
Halo hari ini saya sedang bekerja dari rumah
Untuk membebaskannya dari beban melakukan hal ini setiap hari dia tinggal di rumah, kami ingin mengotomatiskan tugas ini untuknya.
Tantangan
Tulis sesedikit mungkin byte kode yang:
- Menerima waktu saat ini: kode Anda dapat menerima nilai untuk tahun saat ini, bulan (1-12), hari bulan (1-31), jam (0-23) dan menit (0-59) dan hari dalam seminggu (Anda dapat memilih apakah angka ini dimulai dari 0 atau 1, dan jika 0/1 berarti hari Minggu, Senin atau hari lainnya); alternatifnya Anda mungkin menerima struktur seperti
Date
,DateTime
,Calendar
atau struktur-terkait waktu lainnya, jika bahasa Anda memungkinkan. Anda juga dapat menerima string dengan tanggal masukyyyyMMddHHmm
jika Anda mau, atau dua string terpisah untuk tanggal dan waktu, dan kemudian bilangan bulat dengan hari dalam seminggu. Merasa bebas. - Pengembalian dua konsisten truthy dan falsey nilai-nilai, menunjukkan jika pesan harus dikirim ke pekerjaan obrolan atau tidak.
Aturan
- Sepotong kode ini diasumsikan dipanggil secara berkala. Namun, periodisitas yang tepat tidak relevan.
- Nilai kebenaran harus dikembalikan jika hari dalam seminggu adalah Selasa atau Kamis dan pukul 8:00 pagi dengan margin kesalahan 10 menit (mulai dari 7:50 hingga 8:10).
- Nilai kebenaran harus dikirim hanya jika ini adalah pertama kalinya kode dipanggil antara jam-jam itu untuk hari yang ditentukan. Kami tidak ingin bot mengirim pesan yang sama beberapa kali berturut-turut. Cara Anda mengelola pembatasan ini sepenuhnya terserah Anda.
- Kode Anda mungkin merupakan program independen yang dijalankan berulang kali atau mungkin merupakan bagian dari kode yang lebih besar yang selalu berjalan. Pilihanmu.
- Anda dapat mengasumsikan bahwa tidak akan ada reboot di antara eksekusi kode.
- Anda dapat berasumsi bahwa tanggal tersebut akan selalu benar.
- Penjelasan tentang kode Anda dan khususnya tentang metode yang digunakan untuk mencapai kegigihan dianjurkan.
Contohnya
(Week starts on Monday: 1, the following invokations will be made in succession)
2018,08,27,08,00,1 = falsey (not Tuesday or Thursday)
2018,08,28,07,45,2 = falsey (out of hours)
2018,08,28,07,55,2 = truthy (first time invoked this day at the proper hours)
2018,08,28,08,05,2 = falsey (second time invoked this day at the proper hours)
2018,08,28,08,15,2 = falsey (out of hours)
2018,08,29,08,00,3 = falsey (not Tuesday or Thursday)
2018,08,29,18,00,3 = falsey (not Tuesday or Thursday)
2018,08,30,07,49,4 = falsey (out of hours)
2018,08,30,07,50,4 = truthy (first time invoked this day at the proper hours)
2018,08,30,07,50,4 = falsey (second time invoked this day at the proper hours)
2018,08,30,08,10,4 = falsey (third time invoked this day at the proper hours)
2018,08,30,08,11,4 = falsey (out of hours)
2018,09,04,08,10,2 = truthy (first time invoked this day at the proper hours)
Ini adalah kode-golf , jadi semoga kode terpendek untuk setiap bahasa menang!
code-golf
decision-problem
date
stateful
Charlie
sumber
sumber
YYYYmmdd
dan waktu jugaHHss
?Jawaban:
JavaScript (ES6), 43 byte
Cobalah online!
Memasukkan
yyyymmdd
formathhmm
format0
= Selasa,1
= Rabu, ...,6
= SeninKeluaran
Pengembalian
0
atau1
.Berkomentar
sumber
Python 3 , 69 byte
Cobalah online!
Mengambil input sebagai
f(day of the week, date, hours, minutes)
, di mana tanggal dapat dalam format yang konsisten.sumber
APL (Dyalog Unicode) ,
615350483736 byte SBCSLambda infix Anonim. Dipanggil dengan
YYYYMMDD f hhmm
dan kemudian meminta nomor hari kerja; 2 dan 4 adalah Selasa dan Kamis. Mendefinisikan ulang globalD
untuk mengingat tanggal.Cobalah online!
D←⍬
inisialisasiD
menjadi set kosong{
...}
lambda anonim;⍺
adalahYYYYMMDD
,⍵
apakahhhmm
780-⍵
perbedaan antara 780 (rata-rata 0750 dan 0810) dan nilai waktu|
absolut30≥
yaitu 30 lebih besar atau sama dengan itu?(
...)<
dan tidak benar bahwa:⍺∊D
tanggal adalah anggota dariD
(
...)∧
dan memang benar bahwa:⎕∊2 4
yang diminta untuk hari kerja adalah anggota dari himpunan {2,4}⍺/⍨
menggunakannya untuk mengompres tanggal (yaitu memberikan {} jika salah, {date} if true)D,←
menambahkan itu keD
≢
dan mengembalikan penghitungannya (yaitu 0 atau 1, yang merupakan APL yang salah dan benar)sumber
Rumus Excel, 85 byte
=IF(AND(MID(WEEKDAY(A1)/0,684;3;1)="3";A1-INT(A1)>=0,32638;A1-INT(A1)<=0,34028);TRUE)
Hari kerja tanpa parameter mulai dari 1 (Minggu) hingga 7 (Sabtu). Hari yang kita inginkan adalah 3 dan 5. Membagi semua angka dari 1 hingga 7 untuk 0,648, hanya 3 dan 5 yang memberikan hasil di mana desimal pertama adalah 3 (Dapat dengan membagi dengan rand ())
Input dimasukkan pada Sel A1
sumber
MID(WEEKDAY(A1)/0,29;5;1)="4"
dan juga;1;)
bukannya;TRUE)
Bersih ,
343326303279216 byteBersih sangat tidak cocok untuk ini seperti mencoba melukis pagar dengan gergaji mesin.
Cobalah online!
Golf kemudian penjelasan.
sumber
R ,
114106 byteCobalah online!
Kegigihan:
Tanggal dicentang
L
, daftar tanggal di mana kode dikembalikan BENAR. Ketika kode mengembalikan BENAR, tanggal hari ini ditambahkan ke daftar ini. Kalau tidak, daftarnya tidak diubah.Disimpan 6 byte berkat @Giuseppe!
Membuat kode ini benar-benar berfungsi dan menyelamatkan 2 byte berkat @digEmAll!
sumber
^
memiliki prioritas lebih tinggi daripada%any%
tetapi*
memiliki prioritas lebih rendah daripada%any%
, jadi dengan menggunakan^
Anda dapat menyingkirkan beberapa tanda kurung, dan saya bermain golf turun lagi juga! Cukup yakin itu bekerja untuk 108 byte:
bukan^
untuk bersenang-senang, dan kode Anda memiliki sejuta:
di dalamnya.:
sekarang!C (gcc) ,
785049 byteCobalah online!
Input yang diharapkan adalah:
d
: tanggal, sebagai nomor tunggalyyyymmdd
w
: hari dalam seminggu, dimulai dengan Senin (0)t
: waktu, sebagai nomor tunggalhhmm
Penjelasan
Suntingan
abs()
sebenarnya tidak membantu dengan versi barusumber
YYYYMMDD
danhhmm
sebagai nomor tunggal?w<4&w%2&t>749&t<811
alih-alihw<4&&w%2&&t>749&&t<811
Batch, 109 byte
Mengambil input dalam bentuk
date
time
dow
misalnya2018-09-04 08:10 2
dan output melalui kode keluar. Penjelasan: Variabel lingkunganl
(atau huruf tunggal mana pun akan berfungsi) digunakan untuk menyimpan tanggal sukses terakhir yang lulus tes. (Format tanggal itu sendiri tidak masalah asalkan konsisten dan tidak mengandung spasi.)sumber
Perl 6 , 33 byte
Cobalah online!
Sangat terinspirasi oleh solusi Arnauld. Menggunakan format input yang sama.
sumber
C # , 121 Bytes
Memindahkan ketiganya ke baris yang sama mengurangi ukuran menjadi
117
byte.h
digunakan sebagai properti, cukup baca nilai sebelum mengirim pesan:sumber
F #, 119 byte
let f w d h m l =
mendeklarasikan fungsi yang dipanggil
f
dengan parameterw
(hari dalam seminggu)d
(tanggal)h
(jam)m
(menit)l
(daftar tanggal dijalankan)if not(l|>Seq.contains d)
jika daftar tanggal tidak berisi tanggal yang dilewati&&[3;5]|>Seq.contains w
dan hari itu Selasa (3) atau Rabu (5)&&(h=7&&m>49||h=8&&m<11)
dan waktunya adalah antara (eksklusif) 7:49 dan 8:11then(l@[d],true)
lalu kembalikan tuple yang berisi daftar tanggal dengan tanggal saat ini ditambahkan, dan benarelse(l,false)
lain mengembalikan tuple yang berisi daftar tanggal tanpa hari ini dan salahsumber
Bash
9587 byteSunting: disimpan 8 byte dengan mencuri ide dari Annyo
Panggil dengan yyyymmdd HHMM D, dengan D mulai dari 0, untuk hari Senin.
Saya tidak sepenuhnya yakin mengapa saya memiliki set hitung garis yang ditetapkan menjadi tiga, sepertinya itu harus dua, tetapi dua gagal berfungsi dan tiga tampaknya berfungsi.
Juga, saya belum repot menggunakan tanggal, tetapi persyaratan tampaknya menunjukkan bahwa kita harus menerima tanggal, jadi saya mengambil opsi yang disebutkan untuk mengambil waktu secara terpisah dan hanya mengabaikan nilai tanggal.
sumber