Một bot chào mừng cho một đồng nghiệp từ công việc


14

Tôi có một đồng nghiệp tại nơi làm việc tại nhà vào mỗi thứ ba và thứ năm. Vào khoảng 8:00 sáng, anh ấy gửi cho chúng tôi một tin nhắn với nội dung như sau:

Xin chào hôm nay tôi đang làm việc tại nhà

Để giảm bớt gánh nặng cho anh ấy khỏi công việc này mỗi ngày anh ấy ở nhà, chúng tôi muốn tự động hóa nhiệm vụ này cho anh ấy.

Các thách thức

Viết càng ít byte càng tốt một đoạn mã:

  • Nhận thời gian hiện tại: mã của bạn có thể nhận các giá trị cho năm hiện tại, tháng (1-12), ngày trong tháng (1-31), giờ (0-23) và phút (0-59) và ngày trong tuần (bạn có thể chọn số này bắt đầu từ 0 hoặc 1 và nếu 0/1 có nghĩa là Chủ nhật, Thứ Hai hoặc bất kỳ ngày nào khác); Hoặc bạn có thể nhận được một cấu trúc như Date, DateTime, Calendarhoặc bất kỳ cấu trúc thời gian có liên quan khác, nếu ngôn ngữ của bạn cho phép nó. Bạn cũng có thể nhận được một chuỗi có ngày trong yyyyMMddHHmmnếu bạn muốn hoặc hai chuỗi riêng biệt cho ngày và thời gian, sau đó là một số nguyên với ngày trong tuần. Đừng ngại.
  • Trả về hai giá trị trung thựcfalsey nhất quán , cho biết liệu tin nhắn có phải được gửi đến cuộc trò chuyện công việc hay không.

Quy tắc

  • Đoạn mã này được coi là được gọi định kỳ. Tuy nhiên, tính chính xác là không liên quan.
  • Giá trị trung thực phải được trả lại nếu ngày trong tuần là Thứ Ba hoặc Thứ Năm và thời gian là 8:00 sáng với biên độ lỗi là 10 phút (bao gồm từ 7:50 đến 8:10).
  • Giá trị trung thực phải được gửi chỉ khi đó là lần đầu tiên mã được gọi giữa các giờ đó trong ngày được chỉ định. Chúng tôi không muốn bot gửi cùng một tin nhắn nhiều lần liên tiếp. Cách bạn quản lý hạn chế này sẽ hoàn toàn phụ thuộc vào bạn.
  • Mã của bạn có thể là một chương trình độc lập được thực thi nhiều lần hoặc nó có thể là một phần của mã lớn hơn luôn chạy. Lựa chọn của bạn.
  • Bạn có thể cho rằng sẽ không có khởi động lại giữa các lần thực thi mã.
  • Bạn có thể cho rằng ngày sẽ luôn chính xác.
  • Giải thích về mã của bạn và cụ thể về phương pháp được sử dụng để đạt được sự kiên trì được khuyến khích.

Ví dụ

(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)

Đây là , vì vậy có thể mã ngắn nhất cho mỗi ngôn ngữ sẽ giành chiến thắng!


Điều này đến từ hộp cát .
Charlie

Có bất kỳ hạn chế trong định dạng đầu vào? Tôi có thể lấy ngày làm một tham số duy nhất như YYYYmmddthời gian HHsskhông?
Luis felipe De jesus Munoz

1
@LuisfelipeDejesusMunoz có, nếu bạn muốn bạn có thể nhận được ngày và giờ ở định dạng đó. Tôi đã cập nhật câu hỏi để làm rõ điều đó.
Charlie

1
@KamilDrakari chương trình phải kiểm tra ngày đưa ra dưới dạng tham số, bạn không thể lấy ngày hiện tại. Nếu bạn làm như vậy, sẽ không thể làm cho mã vượt qua pin thử nghiệm như pin tôi đề xuất trong câu hỏi.
Charlie

2
Vì vậy, bạn đang bỏ phiếu một kịch bản thường xuyên để có ích nhiều nhất một lần một ngày, 2/7 của ngày? Nếu bạn tự động hóa tất cả các nhiệm vụ của mình như thế ...
Mast

Câu trả lời:


15

JavaScript (ES6), 43 byte

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

Hãy thử trực tuyến!

Đầu vào

  • ngày dưới dạng một chuỗi trong yyyymmddđịnh dạng
  • thời gian như một chuỗi trong hhmmđịnh dạng
  • ngày trong tuần dưới dạng số nguyên 0 được lập chỉ mục, với 0= Thứ ba, 1= Thứ tư, ..., 6= Thứ hai

Đầu ra

Trả về 0hoặc 1.

Đã bình luận

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()

7
Javascript (và sự thành thạo của bạn về nó) sẽ luôn làm tôi ngạc nhiên.
Charlie

1
ES6 rất thú vị khi chơi golf với :) Định dạng đầu vào thứ 2 có hợp lệ không?
Arnauld

Vâng, tôi đã chỉ định rằng trong văn bản của câu hỏi.
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)

Hãy thử trực tuyến!

Đưa đầu vào là f(day of the week, date, hours, minutes), trong đó ngày có thể ở bất kỳ định dạng nhất quán.


5

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

Vô danh lambda. Được gọi với YYYYMMDD f hhmmvà sau đó nhắc cho số ngày trong tuần; 2 và 4 là thứ ba và thứ năm. Xác định lại toàn cầu Dđể ghi nhớ ngày.

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

Hãy thử trực tuyến!

D←⍬ khởi tạo Dthành một tập hợp trống

{... } lambda vô danh; YYYYMMDD, hhmm
780-⍵ sự khác biệt giữa 780 (trung bình của 0750 và 0810) và thời gian
| giá trị tuyệt đối đó
30≥ là 30 lớn hơn hoặc bằng với điều đó?
(... )< và nó không phải là sự thật rằng:
  ⍺∊D ngày là thành viên của D
(... )∧ và đó là sự thật rằng:
  ⎕∊2 4 các nhắc nhở cho các ngày trong tuần là thành viên của tập {2,4}
⍺/⍨ sử dụng mà để nén ngày (tức là mang đến cho {} nếu sai sự thật, {ngày} nếu đúng)
D,← nối thêm D
 và trả lại số kiểm đếm của nó (tức là 0 hoặc 1, đó là sai và đúng)


4

Công thức Excel, 85 byte

=IF(AND(MID(WEEKDAY(A1)/0,684;3;1)="3";A1-INT(A1)>=0,32638;A1-INT(A1)<=0,34028);TRUE)

Các ngày trong tuần không có tham số là từ 1 (Chủ nhật) đến 7 (Thứ bảy). Số ngày chúng tôi muốn là 3 và 5. Chia tất cả các số từ 1 đến 7 cho 0,648, chỉ có 3 và 5 cho kết quả trong đó số thập phân đầu tiên là 3 (Nhận được bằng cách chia với rand ())

Đầu vào được chèn vào Ô A1


Bạn có thể sử dụng MID(WEEKDAY(A1)/0,29;5;1)="4";1;)thay vì;TRUE)
adebunk

4

Sạch sẽ , 343 326 303 279 216 byte

Clean rất không phù hợp với điều này, nó giống như cố gắng vẽ một hàng rào bằng cưa máy.

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

Hãy thử trực tuyến!

Chơi golf rồi giải thích.


1
+1 Chỉ để vẽ một hàng rào với một tài liệu tham khảo cưa máy! : 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

Hãy thử trực tuyến!

Kiên trì:

Ngày được kiểm tra L, danh sách các ngày mà mã trả về ĐÚNG. Khi mã trả về ĐÚNG, ngày hôm nay sẽ được thêm vào danh sách này. Nếu không, danh sách không được sửa đổi.

Đã lưu 6 byte nhờ @Giuseppe!

Làm cho mã thực sự hoạt động và lưu được 2 byte nhờ @digEmAll!


Phương pháp này mất thời gian hiện tại thay vì nhận nó như một tham số, phải không?
Charlie

@Charlie có vẻ II nên đọc thử thách cẩn thận hơn ... sẽ giúp cuộc sống của tôi dễ dàng hơn! Tôi sẽ cập nhật.
JayCe

^có quyền ưu tiên cao hơn %any%nhưng *có quyền ưu tiên thấp hơn %any%, vì vậy sử dụng ^bạn có thể thoát khỏi một số dấu ngoặc đơn, và tôi cũng đánh gôn thêm một vài lần nữa! Khá chắc chắn rằng nó hoạt động với 108 byte
Giuseppe

1
Bạn cũng có thể sử dụng :thay vì ^, vì sự thú vị của nó, và vì vậy mã của bạn có một triệu :trong đó.
Giuseppe

@Giuseppe Nó có một tấn :bây giờ!
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);}

Hãy thử trực tuyến!

Các đầu vào dự kiến ​​là:

  • d: ngày, dưới dạng một số yyyymmdd
  • w: ngày trong tuần, bắt đầu từ thứ Hai (0)
  • t: thời gian, dưới dạng một số duy nhất hhmm

Giải trình

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
}

Chỉnh sửa

  • Đã lưu 28 byte nhờ Adám
  • Đã lưu thêm 1 byte, vì abs()thực sự không giúp được gì với phiên bản mới

1
Tại sao không lấy YYYYMMDDhhmmlàm số đơn?
Adám

@ Adám Thật vậy ... Tôi sẽ thử điều đó khi tôi có thời gian
Annyo

Đề xuất w<4&w%2&t>749&t<811thay vìw<4&&w%2&&t>749&&t<811
trần mèo

2

Mẻ, 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

Lấy đầu vào ở dạng, date time dowví dụ 2018-09-04 08:10 2và đầu ra thông qua mã thoát. Giải thích: Biến môi trường l(hoặc bất kỳ chữ cái đơn nào khác sẽ hoạt động) được sử dụng để lưu trữ ngày thành công cuối cùng vượt qua bài kiểm tra. (Bản thân định dạng ngày không quan trọng miễn là nó phù hợp và không chứa khoảng trắng.)



1

C # , 121 byte

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

Di chuyển cả ba đến cùng một dòng làm giảm kích thước thành 117byte. hđược sử dụng như một tài sản, chỉ cần đọc giá trị trước khi gửi tin nhắn:

if (h) SendMessage();

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 =

Hàm khai báo được gọi fvới tham số w(ngày trong tuần) d(ngày) h(giờ) m(phút) l(danh sách ngày chạy)

if not(l|>Seq.contains d) nếu danh sách ngày không chứa ngày đã qua

&&[3;5]|>Seq.contains w và ngày là thứ ba (3) hoặc thứ tư (5)

&&(h=7&&m>49||h=8&&m<11) và thời gian là giữa (độc quyền) 7:49 và 8:11

then(l@[d],true) sau đó trả về một tuple chứa danh sách các ngày có ngày hiện tại được thêm vào và đúng

else(l,false) khác trả lại một tuple chứa danh sách ngày mà không có ngày hôm nay và sai


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

Chỉnh sửa: đã lưu 8 byte bằng cách đánh cắp một ý tưởng từ Annyo

Gọi với yyyymmdd HHMM D, với D bắt đầu từ 0, cho thứ Hai.

Tôi không hoàn toàn chắc chắn tại sao tôi có bộ kiểm tra đếm dòng được đặt thành ba, có vẻ như là hai, nhưng hai không hoạt động và ba dường như hoạt động.

Ngoài ra, tôi không bận tâm đến việc sử dụng ngày, nhưng các yêu cầu dường như cho thấy rằng chúng ta nên chấp nhận ngày, vì vậy tôi đã chọn tùy chọn được đề cập để dành thời gian riêng biệt và chỉ bỏ qua giá trị ngày.


Nếu bạn không sử dụng ngày, làm thế nào để bạn kiểm tra xem bạn không gửi tin nhắn hai lần cho cùng một ngày?
Charlie

Nó tồn tại trong vòng 20 phút và lần kiểm tra đầu tiên đảm bảo rằng không có bản sao nào đang chạy
crystalgecko
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.