सहकर्मी को काम के लिए बधाई बॉट


14

मेरे पास काम पर एक सहयोगी है जो हर मंगलवार और गुरुवार को घर से काम करता है। लगभग 8:00 बजे वह हमें निम्नलिखित पाठ के साथ एक संदेश भेजता है:

हेलो आज मैं घर से काम कर रहा हूँ

ऐसा करने के बोझ से राहत देने के लिए वह हर दिन घर पर रहता है, हम उसके लिए इस कार्य को स्वचालित करना चाहेंगे।

चुनौती

कोड का एक टुकड़ा संभव के रूप में कुछ बाइट्स में लिखें:

  • वर्तमान समय प्राप्त करता है: आपका कोड वर्तमान वर्ष, माह (1-12), महीने का दिन (1-31), घंटा (0-23) और मिनट (0-59) और सप्ताह का दिन मान प्राप्त कर सकता है (आप चुन सकते हैं कि क्या यह संख्या 0 या 1 से शुरू होती है, और यदि 0/1 का अर्थ रविवार, सोमवार या किसी अन्य दिन है); वैकल्पिक रूप से आप इस तरह के रूप में एक संरचना प्राप्त हो सकता है Date, DateTime, Calendarया किसी अन्य समय से संबंधित संरचना, अपनी भाषा यह अनुमति देता है। आप चाहें तो तारीख के साथ एक तार भी प्राप्त कर सकते yyyyMMddHHmmहैं, या तिथि और समय के लिए दो अलग-अलग तार, और फिर सप्ताह के दिन के साथ एक पूर्णांक। स्वतंत्र महसूस करना।
  • रिटर्न दो लगातार truthy और falsey मूल्यों, संदेश काम चैट करने के लिए नहीं भेजा जाना चाहिए अगर या संकेत है।

नियम

  • कोड के इस टुकड़े को समय-समय पर ग्रहण किया जाता है। सटीक आवधिक अप्रासंगिक है, फिर भी।
  • यदि सप्ताह का दिन मंगलवार या गुरुवार है और समय 10 मिनट (7:50 से 8:10 तक) के एक त्रुटि मार्जिन के साथ 8:00 पूर्वाह्न है, तो सत्य मान लौटाया जाना चाहिए।
  • सत्य मान तभी भेजा जाना चाहिए, जब यह पहली बार कोड निर्दिष्ट दिन के लिए उन घंटों के बीच लागू किया गया हो। हम बॉट को एक ही संदेश को कई बार एक पंक्ति में नहीं भेजना चाहते हैं। जिस तरह से आप इस प्रतिबंध का प्रबंधन करते हैं, वह पूरी तरह आपके ऊपर होगा।
  • आपका कोड बार-बार निष्पादित एक स्वतंत्र कार्यक्रम हो सकता है या यह हमेशा चलने वाले बड़े कोड का हिस्सा हो सकता है। आपकी पंसद।
  • आप मान सकते हैं कि कोड के निष्पादन के बीच कोई रिबूट नहीं होगा।
  • आप मान सकते हैं कि तारीख हमेशा सही होगी।
  • आपके कोड के बारे में स्पष्टीकरण और विशेष रूप से दृढ़ता को प्राप्त करने के लिए उपयोग की जाने वाली विधि के बारे में प्रोत्साहित किया जाता है।

उदाहरण

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

यह , इसलिए प्रत्येक भाषा की जीत के लिए सबसे छोटा कोड हो सकता है!


यह सैंडबॉक्स से आता है ।
चार्ली

क्या इनपुट प्रारूप में कोई प्रतिबंध है? क्या मैं डेट को सिंगल पैरामीटर की तरह ले सकता हूं YYYYmmddऔर समय भी HHss?
लुइस फेलिप डी जेउस मुनोज

1
@LuisfelipeDejesusMunoz हाँ, यदि आप चाहें तो उस प्रारूप में दिनांक और समय प्राप्त कर सकते हैं। मैंने इस प्रश्न को स्पष्ट करने के लिए अद्यतन किया है।
चार्ली

1
@KamilDrakari कार्यक्रम को पैरामीटर के रूप में दी गई तारीख की जांच करनी चाहिए, आप वर्तमान तिथि नहीं ले सकते। यदि आप ऐसा करते हैं, तो कोड को टेस्ट बैटरी पास करना असंभव होगा, जैसे मैं प्रश्न में प्रस्तावित करता हूं।
चार्ली

2
इसलिए, आप नियमित रूप से दिन में 2 या 7 वें दिन एक बार एक स्क्रिप्ट का उपयोग कर रहे हैं। यदि आप अपने सभी कार्यों को उस तरह से स्वचालित करते हैं ...
मस्तूल

जवाबों:


15

जावास्क्रिप्ट (ईएस 6), 43 बाइट्स

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

इसे ऑनलाइन आज़माएं!

इनपुट

  • yyyymmddप्रारूप में एक स्ट्रिंग के रूप में तारीख
  • hhmmप्रारूप में एक स्ट्रिंग के रूप में समय
  • सप्ताह का दिन 0-अनुक्रमित पूर्णांक के रूप में, 0= मंगलवार, 1= बुधवार, ..., 6= सोमवार के साथ

उत्पादन

लौटाता है 0या 1

टिप्पणी की गई

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
जावास्क्रिप्ट (और आपकी महारत) हमेशा मुझे विस्मित करेगी।
चार्ली

1
ES6 के साथ गोल्फ के लिए मजेदार है :) क्या दूसरा इनपुट प्रारूप वैध है?
अरनौलड

हां, मैंने पहले ही प्रश्न के पाठ में निर्दिष्ट किया है।
चार्ली


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←⍬Dएक खाली सेट होने के लिए  शुरुआती

{} गुमनाम लंबोदर; है YYYYMMDD, है hhmm
780-⍵ 780 के बीच का अंतर (0750 और 0810 के मतलब) और समय
| है कि का निरपेक्ष मान
30≥ 30 अधिक है या कि के बराबर?
(... )< और यह सच नहीं है कि:
  ⍺∊D तिथि का एक सदस्य है D
(... )∧ और यह सच है कि:
  ⎕∊2 4 कार्यदिवस के लिए संकेत सेट का एक सदस्य है {2,4} का
⍺/⍨ उपयोग दिनांक को संपीड़ित करने के लिए (यानी {} देता है यदि गलत है) {दिनांक} यदि सही है)
D,← अपील करें कि D
 इसकी टैली वापस कर दें (अर्थात ० या १, जो एपीएल के झूठे और सत्य हैं)


4

एक्सेल सूत्र, 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 है (इसे रैंड के साथ विभाजित करके प्राप्त करें ())

सेल 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
एक चेनसॉ संदर्भ के साथ एक बाड़ पेंटिंग के लिए बस! : डी
एम्मा - सदाबहार

4

आर , 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 लौटाता है, तो आज की तारीख इस सूची में जोड़ दी जाती है। अन्यथा सूची को संशोधित नहीं किया गया है।

@Giuseppe के लिए धन्यवाद 6 बाइट्स सहेजे गए!

कोड वास्तव में काम किया और @digEmAll के लिए 2 बाइट्स धन्यवाद बचाया!


यह विधि एक पैरामीटर के रूप में प्राप्त करने के बजाय वर्तमान समय लेती है, है ना?
चार्ली

@ शर्ली लग रही है II को चुनौती को और ध्यान से पढ़ना चाहिए था ... इससे मेरा जीवन आसान हो जाता! मैं अपडेट करूंगा।
जेसी

^की तुलना में अधिक पूर्वता है, %any%लेकिन *पहले की तुलना में कम वरीयता है %any%, इसलिए ^आप कुछ कोष्ठकों से छुटकारा पा सकते हैं, और मैंने कुछ और नीचे गिरा दिया है! बहुत यकीन है कि यह 108 बाइट्स के
Giuseppe

1
आप :इसके बजाय ^, इसके मज़े के लिए उपयोग कर सकते हैं , और इसलिए आपके कोड में एक मिलियन :है।
Giuseppe

@Giuseppe यह :अब की एक टन है !
JayCe

3

सी (जीसीसी) ,  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
}

संपादित करता

  • Adám के लिए धन्यवाद 28 बाइट्स सहेजे गए
  • 1 और बाइट को बचाया, क्योंकि abs()वास्तव में नए संस्करण के साथ मदद नहीं कर रहा था

1
क्यों नहीं YYYYMMDDऔर hhmmएकल नंबर के रूप में?
15

@ Adám वास्तव में ... मैं कोशिश करूंगा कि जब मेरे पास कुछ समय हो
Annyo

w<4&w%2&t>749&t<811इसके बजाय सुझाव देंw<4&&w%2&&t>749&&t<811
छत

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

सी # , 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

एफ #, 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) फिर वर्तमान तिथि के साथ तारीखों की सूची युक्त एक टपल लौटाएं, और यह सच है

else(l,false) आज और झूठ के बिना तारीखों की सूची वाले एक टपल लौटाएं


0

बैश 95 87 बाइट्स

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

संपादित करें: Annyo से एक विचार चोरी करके 8 बाइट्स को बचाया

सोमवार के लिए 0 से शुरू होने वाले D के साथ yyyymmdd HHMM D के साथ कॉल करें।

मुझे पूरी तरह यकीन नहीं है कि मेरे पास लाइन काउंट चेक सेट तीन क्यों है, ऐसा लगता है कि यह दो होना चाहिए, लेकिन दो काम करने में विफल रहते हैं और तीन काम करने लगते हैं।

इसके अलावा, मैंने तारीख का उपयोग करने की जहमत नहीं उठाई है, लेकिन आवश्यकताओं से संकेत मिलता है कि हमें तारीख को स्वीकार करना चाहिए, इसलिए मैंने अलग से समय लेने के लिए उल्लेखित विकल्प को लिया और सिर्फ तारीख के मूल्य की अनदेखी की।


यदि आप दिनांक का उपयोग नहीं करते हैं, तो आप कैसे जांचते हैं कि आप एक ही दिन में दो बार संदेश नहीं भेजते हैं?
चार्ली

यह लगभग 20 मिनट के लिए चिपक जाता है और पहला चेक सुनिश्चित करता है कि कोई मौजूदा कॉपी नहीं चल रही है
क्रिस्टलगेको
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.