บอทอวยพรสำหรับเพื่อนร่วมงานจากการทำงาน


14

ฉันมีเพื่อนร่วมงานที่ทำงานที่บ้านทุกวันอังคารและวันพฤหัสบดี เมื่อเวลาประมาณ 8:00 น. เขาส่งข้อความพร้อมข้อความต่อไปนี้ถึงเรา:

สวัสดีวันนี้ฉันทำงานจากที่บ้าน

เพื่อบรรเทาเขาจากภาระในการทำเช่นนี้ทุกวันที่เขาอยู่บ้านเราต้องการทำงานนี้ให้เขาโดยอัตโนมัติ

ความท้าทาย

เขียนเป็นส่วนน้อยของรหัสที่:

  • รับเวลาปัจจุบัน: รหัสของคุณอาจรับค่าสำหรับปีปัจจุบันเดือน (1-12) วันเดือน (1-31) ชั่วโมง (0-23) และนาที (0-59) และวันในสัปดาห์ (คุณสามารถเลือกได้ว่าหมายเลขนี้จะเริ่มต้นจาก 0 หรือ 1 และถ้า 0/1 หมายถึงวันอาทิตย์วันจันทร์หรือวันอื่น ๆ ) ฉะนั้นคุณอาจได้รับโครงสร้างเช่นDate, DateTime, Calendarหรือโครงสร้างเวลาอื่น ๆ ที่เกี่ยวข้องถ้าภาษาของคุณให้มัน นอกจากนี้คุณยังสามารถรับสตริงที่มีวันที่yyyyMMddHHmmหากคุณต้องการหรือสองสตริงแยกกันสำหรับวันที่และเวลาแล้วจำนวนเต็มกับวันของสัปดาห์ ตามสบาย.
  • ส่งคืนค่าความจริงและค่าเท็จที่สอดคล้องกันสองค่าซึ่งระบุว่าจะต้องส่งข้อความไปยังแชทที่ทำงานหรือไม่

กฎระเบียบ

  • โค้ดส่วนนี้จะถูกเรียกใช้เป็นระยะ ระยะเวลาที่แน่นอนจะไม่เกี่ยวข้องอย่างไรก็ตาม
  • ต้องส่งคืนค่าความจริงหากวันในสัปดาห์คือวันอังคารหรือวันพฤหัสบดีและเวลาคือ 8:00 น. โดยมีระยะเวลาข้อผิดพลาด 10 นาที (ตั้งแต่ 7:50 ถึง 8:10 น.)
  • ค่าความจริงจะต้องส่งเฉพาะในกรณีที่เป็นครั้งแรกที่มีการเรียกใช้รหัสระหว่างชั่วโมงเหล่านั้นสำหรับวันที่ระบุ เราไม่ต้องการให้บอตส่งข้อความเดียวกันหลายครั้งติดต่อกัน วิธีที่คุณจัดการข้อ จำกัด นี้จะขึ้นอยู่กับคุณทั้งหมด
  • รหัสของคุณอาจเป็นโปรแกรมอิสระที่ดำเนินการซ้ำ ๆ หรืออาจเป็นส่วนหนึ่งของรหัสที่ใหญ่กว่าที่ใช้งานอยู่เสมอ ตัวเลือกของคุณ.
  • คุณอาจคิดว่าจะไม่มีการรีบูตระหว่างการประมวลผลของรหัส
  • คุณอาจคิดว่าวันที่จะถูกต้องเสมอ
  • คำอธิบายเกี่ยวกับรหัสของคุณและโดยเฉพาะเกี่ยวกับวิธีการที่ใช้เพื่อให้บรรลุความเพียรได้รับการสนับสนุน

ตัวอย่าง

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

นี่คือดังนั้นอาจเป็นรหัสที่สั้นที่สุดสำหรับแต่ละภาษาที่ชนะ!


นี้มาจากกล่องเครื่องมือ
Charlie

มีข้อ จำกัด ในรูปแบบอินพุตหรือไม่ ฉันสามารถใช้วันที่เป็นพารามิเตอร์เดียวเช่นเดียวYYYYmmddกับเวลาได้HHssหรือไม่?
Luis felipe De jesus Munoz

1
@LuisfelipeDejesusMunoz ใช่ถ้าคุณต้องการคุณอาจได้รับวันที่และเวลาในรูปแบบนั้น ฉันได้อัปเดตคำถามเพื่อให้ชัดเจน
ชาร์ลี

1
@KamilDrakari โปรแกรมจะต้องตรวจสอบวันที่ที่กำหนดเป็นพารามิเตอร์คุณไม่สามารถใช้วันที่ปัจจุบัน หากคุณทำเช่นนั้นจะเป็นไปไม่ได้ที่จะทำให้รหัสผ่านการทดสอบแบตเตอรี่เช่นเดียวกับที่ฉันเสนอในคำถาม
ชาร์ลี

2
ดังนั้นคุณจึงควรสำรวจสคริปต์เป็นประจำเพื่อให้ได้ประโยชน์สูงสุดวันละครั้งในวันที่ 2/7 ของวัน? หากคุณทำงานโดยอัตโนมัติทั้งหมดของคุณต้องการที่ ...
Mast

คำตอบ:


15

JavaScript (ES6), 43 ไบต์

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

ลองออนไลน์!

อินพุต

  • วันที่เป็นสตริงในyyyymmddรูปแบบ
  • เวลาเป็นสตริงในhhmmรูปแบบ
  • วันในสัปดาห์เป็นจำนวนเต็ม 0 ดัชนีโดยมี0= Tuesday, 1= Wednesday, ... , 6= Monday

เอาท์พุต

ผลตอบแทนหรือ01

แสดงความคิดเห็น

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 (และความเชี่ยวชาญของคุณ) จะทำให้ฉันประหลาดใจอยู่เสมอ
ชาร์ลี

1
ES6 สนุกกับการเล่นกอล์ฟด้วย :) รูปแบบอินพุตที่ 2 ใช้ได้หรือไม่
Arnauld

ใช่ฉันได้ระบุไปแล้วในข้อความของคำถาม
Charlie

5

Python 3 , 69 ไบต์

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

ลองออนไลน์!

รับอินพุตเป็นf(day of the week, date, hours, minutes)โดยที่วันที่สามารถอยู่ในรูปแบบที่สอดคล้องกัน


5

APL (Dyalog Unicode) , 61 53 50 48 37 36 ไบต์SBCS

แลมบ์ดานิรนาม เรียกด้วยYYYYMMDD f hhmmแล้วแจ้งหมายเลขประจำวัน 2 และ 4 คือวันอังคารและวันพฤหัสบดี กำหนดโลกใหม่Dให้จดจำวันที่

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

ลองออนไลน์!

D←⍬ initialise Dเป็นชุดว่าง

{} แลมบ์ดานิรนาม คือYYYYMMDD, คือhhmm
780-⍵ ความแตกต่างระหว่าง 780 (ค่าเฉลี่ยของ 0750 และ 0810) และเวลา
| ค่าสัมบูรณ์ของที่
30≥ 30 มากกว่าหรือเท่ากับที่?
(... )< และมันไม่เป็นความจริงที่:
  ⍺∊D วันที่เป็นสมาชิกของD
(... )∧ และมันก็เป็นความจริงที่:
  ⎕∊2 4 ได้รับแจ้งสำหรับวันธรรมดาเป็นสมาชิกของชุด {2,4}
⍺/⍨ ใช้ที่จะบีบอัดวันที่ (เช่นให้ {} ถ้าเท็จ {date} ถ้าเป็นจริง)
D,← ผนวกว่าD
 และส่งกลับจำนวน (เช่น 0 หรือ 1 ซึ่งเป็นเท็จและ APL ของจริง)


4

สูตร Excel ขนาด 85 ไบต์

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

วันทำงานที่ไม่มีพารามิเตอร์มาจาก 1 (วันอาทิตย์) ถึง 7 (วันเสาร์) วันที่เราต้องการคือ 3 และ 5 การหารตัวเลขทั้งหมดจาก 1 ถึง 7 สำหรับ 0,648 เพียง 3 และ 5 ให้ผลลัพธ์โดยที่ทศนิยมแรกคือ 3 (รับโดยหารด้วย rand ())

อินพุตถูกแทรกบน Cell A1


คุณสามารถใช้MID(WEEKDAY(A1)/0,29;5;1)="4"และ;1;)แทน;TRUE)
adebunk

4

ทำความสะอาด , 343 326 303 279 216 ไบต์

ทำความสะอาดไม่เหมาะกับสิ่งนี้มันเหมือนพยายามทาสีรั้วด้วยลูกโซ่

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

ลองออนไลน์!

ตีกอล์ฟแล้วอธิบาย


1
+1 เพียงทาสีรั้วที่มีการอ้างอิงเลื่อย! : D
Emma - PerpetualJ

4

R , 114 106 ไบต์

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

ลองออนไลน์!

วิริยะ:

วันที่ถูกตรวจสอบกับLรายการของวันที่รหัสกลับ TRUE เมื่อโค้ดส่งคืน TRUE วันที่วันนี้จะถูกผนวกเข้ากับรายการนี้ มิฉะนั้นจะไม่มีการแก้ไขรายการ

บันทึกแล้ว 6 ไบต์ขอบคุณ @Giuseppe!

ทำให้รหัสใช้งานได้จริงและบันทึกได้ 2 ไบต์ด้วย @digEmAll!


วิธีนี้ใช้เวลาปัจจุบันแทนที่จะรับมันเป็นพารามิเตอร์ใช่ไหม?
ชาร์ลี

@ Charlie ดูเหมือนฉันควรอ่านความท้าทายอย่างละเอียดยิ่งขึ้น ... จะทำให้ชีวิตของฉันง่ายขึ้น! ฉันจะอัปเดต
JayCe

^มีลำดับความสำคัญสูงกว่า%any%แต่*มีลำดับความสำคัญต่ำกว่า%any%ดังนั้นการใช้^คุณสามารถกำจัดวงเล็บบางส่วนได้และฉันเล่นกอล์ฟอีกไม่กี่ลงเช่นกัน! ค่อนข้างแน่ใจว่าใช้งานได้108 bytes
Giuseppe

1
นอกจากนี้คุณยังสามารถใช้:แทน^เพื่อความสนุกสนานของมันและเพื่อให้รหัสของคุณมีล้าน:ในนั้น
จูเซปเป้

@Giuseppe ตอนนี้มีจำนวนมาก:แล้ว!
JayCe

3

C (gcc) ,  78   50  49 ไบต์

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

ลองออนไลน์!

อินพุตที่คาดหวังคือ:

  • d: วันที่เป็นตัวเลขเดียว yyyymmdd
  • w: วันในสัปดาห์เริ่มต้นด้วยวันจันทร์ (0)
  • t: เวลาเป็นตัวเลขเดียว hhmm

คำอธิบาย

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
}

การแก้ไข

  • บันทึกแล้ว 28 ไบต์ขอบคุณAdám
  • บันทึกอีก 1 ไบต์เนื่องจากabs()แท้จริงแล้วไม่ได้ช่วยเวอร์ชั่นใหม่

1
ทำไมไม่รับYYYYMMDDและhhmmเป็นตัวเลขเดียว?
อดัม

@ Adámแน่นอน ... ฉันจะลองดูเมื่อฉันมีเวลา
Annyo

แนะนำw<4&w%2&t>749&t<811แทนw<4&&w%2&&t>749&&t<811
ceilingcat

2

แบตช์ 109 ไบต์

@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

รับอินพุตในรูปแบบdate time dowเช่น2018-09-04 08:10 2และเอาต์พุตผ่านรหัสออก คำอธิบาย: ตัวแปรสภาพแวดล้อมl(หรือตัวอักษรอื่นใดก็ได้) ใช้เพื่อเก็บวันที่ประสบความสำเร็จครั้งล่าสุดที่ผ่านการทดสอบ (รูปแบบวันที่นั้นไม่สำคัญตราบใดที่มีความสอดคล้องกันและไม่มีช่องว่าง)



1

C # , 121 ไบต์

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

การย้ายทั้งสามเป็นบรรทัดเดียวกันจะลดขนาดเป็น117ไบต์ hถูกใช้เป็นคุณสมบัติเพียงแค่อ่านค่าก่อนที่จะส่งข้อความ:

if (h) SendMessage();

1

F #, 119 ไบต์

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 =

ประกาศฟังก์ชั่นที่เรียกfพร้อมกับพารามิเตอร์w(วันของสัปดาห์) d(วันที่) h(ชั่วโมง) m(นาที) l(รายการวันที่ที่มันทำงานอยู่)

if not(l|>Seq.contains d) หากรายการวันที่ไม่มีวันที่ผ่าน

&&[3;5]|>Seq.contains w และวันนี้เป็นวันอังคาร (3) หรือวันพุธ (5)

&&(h=7&&m>49||h=8&&m<11) และเวลาอยู่ระหว่าง (พิเศษ) 7:49 ถึง 8:11

then(l@[d],true) จากนั้นส่งคืน tuple ที่มีรายการวันที่พร้อมกับวันที่ปัจจุบันและต่อท้ายจริง

else(l,false) มิฉะนั้นคืน tuple ที่มีรายการวันที่โดยไม่มีวันนี้และเท็จ


0

Bash 95 87 ไบต์

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

แก้ไข: บันทึก 8 ไบต์โดยขโมยแนวคิดจาก Annyo

โทรด้วย yyyymmdd HHMM D โดย D เริ่มต้นที่ 0 สำหรับวันจันทร์

ฉันไม่แน่ใจทั้งหมดว่าทำไมฉันจึงมีการตรวจสอบการนับบรรทัดเป็นสามดูเหมือนว่าควรเป็นสอง แต่สองล้มเหลวในการทำงานและสามดูเหมือนว่าจะทำงาน

นอกจากนี้ฉันไม่ได้ใส่ใจกับการใช้วันที่ แต่ข้อกำหนดดูเหมือนจะบ่งบอกว่าเราควรยอมรับวันที่ดังนั้นฉันจึงเลือกตัวเลือกที่กล่าวถึงเพื่อแยกเวลาและแยกค่าวันที่ออก


หากคุณไม่ได้ใช้วันที่คุณจะตรวจสอบว่าคุณไม่ได้ส่งข้อความสองครั้งในวันเดียวกันได้อย่างไร
ชาร์ลี

ใช้เวลาประมาณ 20 นาทีและการตรวจสอบครั้งแรกทำให้มั่นใจได้ว่าไม่มีการคัดลอกที่มีอยู่เดิม
crystalgecko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.