İşten bir meslektaşım için bir tebrik bot


14

Her Salı ve Perşembe günleri evden çalışan bir iş arkadaşım var. 08:00 civarında bize aşağıdaki metni içeren bir mesaj gönderir:

Merhaba bugün evden çalışıyorum

Onu evde kaldığı her gün bunu yapma yükünden kurtarmak için, bu görevi onun için otomatikleştirmek istiyoruz.

Meydan okuma

Mümkün olduğunca az bayt yazarak bir kod parçası yazın:

  • Geçerli saati alır: Kodunuz, geçerli yıl, ay (1-12), ayın günü (1-31), saat (0-23) ve dakika (0-59) ve haftanın günü için değerler alabilir (bu sayının 0 veya 1'den başlayıp başlamayacağını ve 0/1 Pazar, Pazartesi veya başka bir gün anlamına geliyorsa); Alternatif olarak örneğin bir yapıyı alabilir Date, DateTime, Calendarya da başka herhangi bir zaman ilgili yapı, dil izin veriyorsa. İsterseniz tarih içeren bir dize yyyyMMddHHmmya da tarih ve saat için iki ayrı dize, ardından da haftanın günüyle bir tam sayı alabilirsiniz. Çekinmeyin.
  • İade iki tutarlı truthy ve Falsey mesajı çalışma sohbete gönderilen veya değil gerekiyorsa gösteren değerler.

kurallar

  • Bu kod parçasının periyodik olarak çağrıldığı varsayılır. Bununla birlikte, kesin periyodiklik önemsizdir.
  • Haftanın günü Salı veya Perşembe ise ve saat 10: 00'da (hata 7:50 - 8:10 dahil) hata payı ile doğruluk değeri döndürülmelidir.
  • Doğruluk değeri yalnızca, kodun belirtilen gün için bu saatler arasında ilk kez çağrılması durumunda gönderilmelidir. Botun aynı mesajı arka arkaya birkaç kez göndermesini istemiyoruz. Bu kısıtlamayı yönetme şekliniz tamamen size bağlı olacaktır.
  • Kodunuz art arda yürütülen bağımsız bir program olabilir veya her zaman çalışan daha büyük bir kodun parçası olabilir. Senin seçimin.
  • Kodun yürütülmesi arasında yeniden başlatma olmayacağını varsayabilirsiniz.
  • Tarihin her zaman doğru olacağını varsayabilirsiniz.
  • Kodunuz ve özellikle kalıcılık elde etmek için kullanılan yöntem hakkında açıklamalar teşvik edilir.

Örnekler

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

Bu , bu yüzden her dil için en kısa kod kazanabilir!


Bu sandbox'tan geliyor .
Charlie

Giriş biçiminde herhangi bir kısıtlama var mı? Tarihi tek bir parametre YYYYmmddve saat gibi alabilir miyim HHss?
Luis felipe De jesus Munoz

1
@LuisfelipeDejesusMunoz evet, isterseniz tarih ve saati bu biçimde alabilirsiniz. Bunu netleştirmek için soruyu güncelledim.
Charlie

1
@KamilDrakari program parametre olarak verilen tarihi kontrol etmelidir, geçerli tarihi alamazsınız. Bunu yaparsanız, kodun soruda önerdiğim gibi bir test pili geçirmesi imkansız olacaktır.
Charlie

2
Yani, bir senaryoyu günde en fazla bir kez, günün 2 / 7'sinde yararlı olmak için düzenli olarak sorgulayacak mısınız? Böyle tüm görevlerinizi otomatikleştirirseniz ...
Mast

Yanıtlar:


15

JavaScript (ES6), 43 bayt

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

Çevrimiçi deneyin!

Giriş

  • tarih yyyymmddbiçiminde dize olarak
  • hhmmbiçimdeki bir dize olarak zaman
  • haftanın günü 0 dizinli bir tamsayı olarak, 0= Salı, 1= Çarşamba, ..., 6= Pazartesi

Çıktı

0Veya döndürür 1.

Yorumlananlar

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 (ve ustalığınız) beni hep şaşırtacak.
Charlie

1
ES6 ile golf oynamak eğlenceli :) 2. giriş formatı geçerli mi?
Arnauld

Evet, bunu soru metninde belirtmiştim.
Charlie

5

Python 3 , 69 bayt

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

Çevrimiçi deneyin!

f(day of the week, date, hours, minutes)Tarihin herhangi bir tutarlı biçimde olabileceği şekilde girdiyi alır .


5

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

Anonim infix lambda. Çağırılır YYYYMMDD f hhmmve sonra hafta içi numarası istenir; 2 ve 4 Salı ve Perşembe. DTarihleri ​​hatırlamak için küresel olanı yeniden tanımlar .

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

Çevrimiçi deneyin!

D←⍬Dboş bir set olarak  başlangıç

{} Anonim lambda; olan YYYYMMDD, bir hhmm
780-⍵ 780 arasındaki fark (0750 ve 0810 arasında ortalama) ve zaman
| bunun mutlak değeri
30≥ 30 daha büyük ya da buna eşit mi?
()< Ve şu doğru değildir:
  ⍺∊D tarih bir üyedir D
()∧ ve şu doğrudur:
  ⎕∊2 4 hafta içi istemi {2,4} kümesinin bir üyesidir
⍺/⍨ , tarihi sıkıştırmak için bunu kullanır (yani, yanlışsa {} verir, {date} true ise) bunu
D,← ekleyin D
 ve sayımını döndürün (yani APL'nin yanlış ve doğru olan 0 veya 1)


4

Excel formülü, 85 bayt

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

Hafta içi hiçbir parametre 1 (Pazar) ile 7 (Cumartesi) arasındadır. İstediğimiz günler 3 ve 5'tir. 0,648 için tüm sayıları 1'den 7'ye bölmek, yalnızca 3 ve 5, ilk ondalık sayının 3 olduğu bir sonuç verir (rand () ile bölerek)

Giriş A1 hücresine eklenir


Sen kullanabilirsiniz MID(WEEKDAY(A1)/0,29;5;1)="4"da ve ;1;)yerine;TRUE)
adebunk

4

Temiz , 343 326 303 279 216 bayt

Temiz buna çok uygun değil, bir testere ile bir çit boyamaya çalışmak gibi.

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

Çevrimiçi deneyin!

Golf sonra açıklama.


1
+1 Sadece testere referanslı bir çitin boyanması için! : D
Emma - PerpetualJ

4

R , 114106 bayt

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

Çevrimiçi deneyin!

Kalıcılık:

Tarih, Lkodun DOĞRU döndürdüğü tarihlerin listesi ile karşılaştırılır. Kod TRUE döndürdüğünde, günün tarihi bu listeye eklenir. Aksi takdirde liste değiştirilmez.

@Giuseppe sayesinde 6 bayt tasarruf edildi!

@DigEmAll sayesinde kod gerçekten işe yaradı ve 2 bayt kaydedildi!


Bu yöntem, parametre olarak almak yerine şimdiki zamanı alır, değil mi?
Charlie

@Charlie görünüyor II meydan okumayı daha dikkatli okumalıydı ... hayatımı kolaylaştırırdı! Güncelleyeceğim.
JayCe

^daha yüksek önceliğe sahiptir, %any%ancak *daha düşük önceliğe sahiptir %any%, bu nedenle ^bazı parantezlerden kurtulabilirsiniz ve ben de birkaç tane daha golf oynadım! 108 bayt
Giuseppe

1
Ayrıca kullanabilirsiniz :yerine ^eğlence olsun, ve böylece kod milyon sahiptir :İçinde.
Giuseppe

@Giuseppe Artık bir ton var :!
JayCe

3

C (gcc) ,  78   50  49 bayt

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

Çevrimiçi deneyin!

Beklenen girdiler:

  • d: tarih, tek bir sayı olarak yyyymmdd
  • w: Pazartesi (0) ile başlayan haftanın günü
  • t: zaman, tek bir sayı olarak hhmm

açıklama

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
}

Düzenlemeler

  • Adám sayesinde 28 bayt tasarruf edildi
  • abs()Aslında yeni sürüme yardımcı olmadığından 1 bayt daha kaydetti

1
Neden alamaz YYYYMMDDve hhmmtek sayı olarak?
Adám

@ Adám Gerçekten ... Biraz zamanım olduğunda deneyeceğim
Annyo

Öner w<4&w%2&t>749&t<811yerinew<4&&w%2&&t>749&&t<811
ceilingcat

2

Toplu, 109 bayt

@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

Form girişi alır date time dow, örneğin 2018-09-04 08:10 2çıkış kodu ile ve çıkışları. Açıklama: Ortam değişkeni l(veya başka herhangi bir tek harf işe yarayacak) testi geçen son başarılı tarihi saklamak için kullanılır. (Tarih biçiminin kendisi tutarlı ve boşluk içermediği sürece önemli değildir.)



1

C # , 121 Bayt

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

Her üçünü de aynı satıra taşımak boyutu 117bayta indirir . hözellik olarak kullanıldığında, iletiyi göndermeden önce değeri okumanız yeterlidir:

if (h) SendMessage();

1

F #, 119 bayt

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 =

fparametrelerle çağrılan işlev w(haftanın günü) d(tarih) h(saat) m(dakika) l(çalıştırıldığı tarihlerin listesi)

if not(l|>Seq.contains d) tarih listesi geçilen tarihi içermiyorsa

&&[3;5]|>Seq.contains w ve gün Salı (3) veya Çarşamba (5)

&&(h=7&&m>49||h=8&&m<11) ve zaman (münhasır) 7:49 ve 8:11 arasındadır

then(l@[d],true) ardından geçerli tarih eklenmiş tarihlerin listesini içeren bir demet döndürün ve true

else(l,false) aksi halde, bugün ve yanlış olmayan tarihlerin listesini içeren bir demet döndürür


0

Bash 95 87 bayt

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

Düzenleme: Annyo'dan bir fikir çalarak 8 bayt kaydedildi

Pazartesi için D, 0'dan başlayan yyyymmdd HHMM D ile arayın.

Neden üçe ayarlanmış hat sayım kontrolüne sahip olduğumdan tam olarak emin değilim, iki olması gerekiyor gibi görünüyor, ancak iki işe yaramadı ve üç işe yarıyor gibi görünüyor.

Ayrıca, tarihi kullanmakla uğraşmadım, ancak gereksinimler tarihi kabul etmemiz gerektiğini gösteriyor, bu yüzden zamanı ayrı ayrı almak ve sadece tarih değerini göz ardı etmek için belirtilen seçeneği aldım.


Tarihi kullanmazsanız, mesajı aynı gün için iki kez göndermediğinizi nasıl kontrol edersiniz?
Charlie

20 dakika boyunca yapışır ve ilk kontrol, mevcut bir kopyanın olmadığından emin olur
crystalgecko
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.