Bot ucapan untuk rekan kerja

14

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, Calendaratau struktur-terkait waktu lainnya, jika bahasa Anda memungkinkan. Anda juga dapat menerima string dengan tanggal masuk yyyyMMddHHmmjika 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 , jadi semoga kode terpendek untuk setiap bahasa menang!

Charlie
sumber
Ini berasal dari kotak pasir .
Charlie
Apakah ada batasan dalam format input? Bisakah saya menganggap tanggal sebagai parameter tunggal suka YYYYmmdddan waktu juga HHss?
Luis felipe De jesus Munoz
1
@LuisfelipeDejesusMunoz ya, jika mau, Anda mungkin menerima tanggal dan waktu dalam format itu. Saya telah memperbarui pertanyaan untuk memperjelasnya.
Charlie
1
@KamilDrakari program harus memeriksa tanggal yang diberikan sebagai parameter, Anda tidak dapat mengambil tanggal saat ini. Jika Anda melakukannya, tidak mungkin untuk membuat kode lulus tes baterai seperti yang saya usulkan dalam pertanyaan.
Charlie
2
Jadi, Anda mem-polling sebuah skrip secara teratur agar bermanfaat paling banyak sekali sehari, 2/7 hari? Jika Anda mengotomatiskan semua tugas Anda seperti itu ...
Mast

Jawaban:

15

JavaScript (ES6), 43 byte

f=(D,t,d)=>5>>d&t>749&t<811&&!f[D]*(f[D]=1)

Cobalah online!

Memasukkan

  • tanggal sebagai string dalam yyyymmddformat
  • waktu sebagai string dalam hhmmformat
  • hari dalam seminggu sebagai bilangan bulat berindeks 0, dengan 0= Selasa, 1= Rabu, ..., 6= Senin

Keluaran

Pengembalian 0atau 1.

Berkomentar

f = (            // named function, as the underlying object will be used as storage
  D,             // D = date (string)
  t,             // t = time (string)
  d              // d = day of week (integer)
) =>             //
  5              // 5 is 0000101 in binary, where 1's are set for Tuesday and Thursday
  >> d &         // test the relevant bit for the requested day of week
  t > 749 &      // test whether we are in the correct time slot
  t < 811        //
  && !f[D] *     // make sure that this date was not already invoked at a correct time
  (f[D] = 1)     // and store it in the underlying object of f()
Arnauld
sumber
7
Javascript (dan penguasaan Anda akan hal itu) akan selalu membuat saya takjub.
Charlie
1
ES6 menyenangkan untuk bermain golf :) Apakah format input kedua valid?
Arnauld
Ya, saya sudah menentukan itu dalam teks pertanyaan.
Charlie
5

Python 3 , 69 byte

f=lambda w,r,*t,l={0}:r not in l!=w in(2,4)<(7,49)<t<(8,11)!=l.add(r)

Cobalah online!

Mengambil input sebagai f(day of the week, date, hours, minutes), di mana tanggal dapat dalam format yang konsisten.

ovs
sumber
5

APL (Dyalog Unicode) , 61 53 50 48 37 36 byte SBCS

Lambda infix Anonim. Dipanggil dengan YYYYMMDD f hhmmdan kemudian meminta nomor hari kerja; 2 dan 4 adalah Selasa dan Kamis. Mendefinisikan ulang global Duntuk mengingat tanggal.

D←⍬
{≢D,←⍺/⍨(⎕∊2 4)∧(⍺∊D)<30≥|780-⍵}

Cobalah online!

D←⍬ inisialisasi Dmenjadi set kosong

{... } lambda anonim; adalah YYYYMMDD, apakah hhmm
780-⍵ perbedaan antara 780 (rata-rata 0750 dan 0810) dan nilai waktu
| absolut
30≥ yaitu 30 lebih besar atau sama dengan itu?
(... )< dan tidak benar bahwa:
  ⍺∊D tanggal adalah anggota dari D
(... )∧ 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 ke D
 dan mengembalikan penghitungannya (yaitu 0 atau 1, yang merupakan APL yang salah dan benar)

Adm
sumber
4

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

Moacir
sumber
Anda bisa menggunakan MID(WEEKDAY(A1)/0,29;5;1)="4"dan juga ;1;)bukannya;TRUE)
adebunk
4

Bersih , 343 326 303 279 216 byte

Bersih sangat tidak cocok untuk ini seperti mencoba melukis pagar dengan gergaji mesin.

import StdEnv,System.Environment,System._Unsafe
?(y,x,z)=y*480+x*40+z
$y h m d=(d-3)^2==1&&((h-8)*60+m)^2<121&&appUnsafe(setEnvironmentVariable"l"(fromInt(?y)))(maybe 0toInt(accUnsafe(getEnvironmentVariable"l")))< ?y

Cobalah online!

Golf kemudian penjelasan.

Suram
sumber
1
+1 Hanya untuk mengecat pagar dengan referensi gergaji! : D
Perpetual J
4

R , 114 106 byte

function(D,y=D:"%D",u=D$h==7&D$mi>49|D$h==8&D$mi<11&D$w%in%2^4&!y%in%L,`:`=format,`^`=c){L<<-L^y[u];u}
L=F

Cobalah 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!

JayCe
sumber
Metode ini membutuhkan waktu saat ini alih-alih menerimanya sebagai parameter, bukan?
Charlie
@Charlie sepertinya aku seharusnya membaca tantangan dengan lebih hati-hati ... akan membuat hidupku lebih mudah! Saya akan memperbarui.
JayCe
^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
Giuseppe
1
Anda juga bisa menggunakan, :bukan ^untuk bersenang-senang, dan kode Anda memiliki sejuta :di dalamnya.
Giuseppe
@ Giuseppe Itu memang punya banyak :sekarang!
JayCe
3

C (gcc) ,  78   50  49 byte

D;f(d,w,t){w=d-D&&w<4&&w%2&&t>749&&t<811&&(D=d);}

Cobalah online!

Input yang diharapkan adalah:

  • d: tanggal, sebagai nomor tunggal yyyymmdd
  • w: hari dalam seminggu, dimulai dengan Senin (0)
  • t: waktu, sebagai nomor tunggal hhmm

Penjelasan

D;                                      // the date we last said hello.
f(d,                                    // date
    w,                                  // day of the week
      t)                                // time
{
  w=                                    // replaces return
    d-D                                 // if we did not say hello today
       &&w<4&&w%2                       // and we are Tuesday(1) or Thursday(3)
                 &&t>749&&t<811         // and time is between 7:50 and 8:10, inclusive
                               &&(D=d); // then we say hello (evaluated to true) and update D
}

Suntingan

  • Disimpan 28 byte berkat Adám
  • Disimpan 1 byte lebih, karena abs()sebenarnya tidak membantu dengan versi baru
Annyo
sumber
1
Mengapa tidak mengambil YYYYMMDDdan hhmmsebagai nomor tunggal?
Adám
@ Adám Memang ... Saya akan mencobanya ketika saya punya waktu
Annyo
Sarankan w<4&w%2&t>749&t<811alih-alihw<4&&w%2&&t>749&&t<811
ceilingcat
2

Batch, 109 byte

@if %3 neq 2 if %3 neq 4 exit/b1
@if %2 geq 07:50 if %2 leq 08:10 if .%1 neq .%l% set l=%1&exit/b0
@exit/b1

Mengambil input dalam bentuk date time dowmisalnya 2018-09-04 08:10 2dan output melalui kode keluar. Penjelasan: Variabel lingkungan l(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.)

Neil
sumber
2

Perl 6 , 33 byte

{811>$^t>749>5+>$^w%2>(%){$^d}++}

Cobalah online!

Sangat terinspirasi oleh solusi Arnauld. Menggunakan format input yang sama.

nwellnhof
sumber
1

C # , 121 Bytes

int[] d=new int[]{2,4};
double s=>Now.TimeOfDay.TotalSeconds;
bool h=>d.Contains((int)Now.DayOfWeek)&&s>=470&&s<=490;

Memindahkan ketiganya ke baris yang sama mengurangi ukuran menjadi 117byte. hdigunakan sebagai properti, cukup baca nilai sebelum mengirim pesan:

if (h) SendMessage();
Abadi J
sumber
1

F #, 119 byte

let f w d h m l = if not(l|>Seq.contains d)&&[3;5]|>Seq.contains w&&(h=7&&m>49||h=8&&m<11)then(l@[d],true)else(l,false)

let f w d h m l =

mendeklarasikan fungsi yang dipanggil fdengan parameter w(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:11

then(l@[d],true) lalu kembalikan tuple yang berisi daftar tanggal dengan tanggal saat ini ditambahkan, dan benar

else(l,false) lain mengembalikan tuple yang berisi daftar tanggal tanpa hari ini dan salah

nick
sumber
0

Bash 95 87 byte

[ $(ps -ef|grep $0|wc -l) -gt 3 -o $2 -lt 750 -o $2 -gt 810 ]||((10>>$3&1))&&sleep 20m

Sunting: 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.

crystalgecko
sumber
Jika Anda tidak menggunakan tanggal, bagaimana Anda memastikan bahwa Anda tidak mengirim pesan dua kali untuk hari yang sama?
Charlie
Itu bertahan selama 20 menit dan pemeriksaan pertama memastikan bahwa tidak ada salinan yang berjalan
crystalgecko