Ein Grußbot für einen Kollegen von der Arbeit

14

Ich habe einen Kollegen bei der Arbeit, der jeden Dienstag und Donnerstag von zu Hause aus arbeitet. Gegen 8:00 Uhr schickt er uns eine Nachricht mit folgendem Text:

Hallo, heute arbeite ich von zu Hause aus

Um ihn davon zu entlasten, dass er jeden Tag zu Hause bleibt, möchten wir diese Aufgabe für ihn automatisieren.

Die Herausforderung

Schreiben Sie in möglichst wenigen Bytes einen Code, der:

  • Erhält die aktuelle Uhrzeit: Ihr Code erhält möglicherweise Werte für das aktuelle Jahr, den Monat (1-12), den Tag des Monats (1-31), die Stunde (0-23) und die Minute (0-59) sowie den Wochentag (Sie können wählen, ob diese Zahl bei 0 oder 1 beginnt und ob 0/1 Sonntag, Montag oder einen anderen Tag bedeutet); alternativ können Sie eine Struktur erhalten, wie Date, DateTime,Calendar oder andere zeitbezogene Struktur, wenn Ihre Sprache zulässt. Sie können auch eine Zeichenfolge mit dem yyyyMMddHHmmgewünschten Datum oder zwei separate Zeichenfolgen für Datum und Uhrzeit und anschließend eine Ganzzahl mit dem Wochentag erhalten. Fühlen Sie sich frei.
  • Gibt zwei konsistente Wahrheit und Falschheit zurück , die angeben, ob die Nachricht an den werden muss oder nicht.

Regeln

  • Es wird davon ausgegangen, dass dieser Code regelmäßig aufgerufen wird. Die genaue Periodizität ist jedoch unerheblich.
  • Der Wahrheitswert muss zurückgegeben werden, wenn der Wochentag Dienstag oder Donnerstag ist und die Uhrzeit 8:00 Uhr mit einer Fehlerspanne von 10 Minuten (von 7:50 bis einschließlich 8:10 Uhr) ist.
  • Der Wahrheitswert muss nur gesendet werden, wenn der Code zum ersten Mal zwischen diesen Stunden für den angegebenen Tag aufgerufen wird. Wir möchten nicht, dass der Bot dieselbe Nachricht mehrmals hintereinander sendet. Die Art und Weise, wie Sie mit dieser Einschränkung umgehen, liegt ganz bei Ihnen.
  • Ihr Code kann ein unabhängiges Programm sein, das wiederholt ausgeführt wird, oder er kann Teil eines größeren Codes sein, der immer ausgeführt wird. Deine Entscheidung.
  • Sie können davon ausgehen, dass zwischen den Ausführungen des Codes keine Neustarts stattfinden.
  • Sie können davon ausgehen, dass das Datum immer korrekt ist.
  • Erklärungen zu Ihrem Code und speziell zu der Methode, mit der die Persistenz erreicht wird, werden empfohlen.

Beispiele

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

Das ist , also kann der kürzeste Code für jede Sprache gewinnen!

Charlie
quelle
Das kommt aus dem Sandkasten .
Charlie
Gibt es eine Einschränkung im Eingabeformat? Kann ich das Datum als einen einzigen Parameter wie YYYYmmddund die Uhrzeit auch nehmen HHss?
Luis Felipe De Jesus Munoz
1
@ LuisfelipeDejesusMunoz ja, wenn Sie möchten, können Sie das Datum und die Uhrzeit in diesem Format erhalten. Ich habe die Frage aktualisiert, um dies zu verdeutlichen.
Charlie
1
@KamilDrakari Das Programm muss das als Parameter angegebene Datum prüfen, Sie können das aktuelle Datum nicht übernehmen. In diesem Fall ist es unmöglich, den Code durch eine Testbatterie wie die in der Frage vorgeschlagene zu führen.
Charlie
2
Sie rufen also regelmäßig ein Skript ab, damit es höchstens einmal am Tag, also am 7. Tag, nützlich ist? Wenn Sie alle Ihre Aufgaben so automatisieren ...
Mast

Antworten:

15

JavaScript (ES6), 43 Byte

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

Probieren Sie es online!

Eingang

  • das Datum als Zeichenfolge in yyyymmdd Format
  • die Zeit als Zeichenfolge in hhmm Format
  • Der Wochentag als 0-indizierte Ganzzahl mit 0= Dienstag, 1= Mittwoch, ..., 6= Montag

Ausgabe

Rückgabe 0oder1 .

Kommentiert

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
quelle
7
Javascript (und Ihre Beherrschung davon) wird mich immer in Erstaunen versetzen.
Charlie
1
Mit ES6 macht Golfen Spaß :) Ist das 2. Eingabeformat gültig?
Arnauld
Ja, das habe ich bereits im Fragetext angegeben.
Charlie
5

Python 3 , 69 Bytes

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

Probieren Sie es online!

Übernimmt die Eingabe als f(day of the week, date, hours, minutes), wobei das Datum in einem beliebigen konsistenten Format vorliegen kann.

ovs
quelle
5

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

Anonymes Infix Lambda. Wird mit YYYYMMDD f hhmmangerufen und fordert dann zur Eingabe der Wochentagsnummer auf. 2 und 4 sind Dienstag und Donnerstag. Definiert das globale DDatum neu, um sich Daten zu merken.

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

Probieren Sie es online!

D←⍬ initialisieren D , um eine leere Menge zu sein

{} Anonymes Lambda; ist YYYYMMDD, ist die hhmm
780-⍵ Differenz zwischen 780 (Mittelwert von 0750 und 0810) und dem Zeitabsolutwert
| von
30≥ 30 größer oder gleich?
(... )< und es ist nicht wahr, dass:
  ⍺∊D das Datum ein Mitglied von D
(... ist )∧ und es ist wahr, dass:
  ⎕∊2 4 der aufgerufene Wochentag ein Mitglied der Menge
⍺/⍨ ist {date} falls wahr)
D,← füge das an D
 und gib seine Tally zurück (dh 0 oder 1, die falsch und wahr von APL sind)

Adam
quelle
4

Excel-Formel, 85 Bytes

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

Wochentag ohne Parameter sind von 1 (Sonntag) bis 7 (Samstag). Die Tage, die wir wollen, sind 3 und 5. Das Teilen aller Zahlen von 1 bis 7 für 0,648, nur 3 und 5 ergibt ein Ergebnis, bei dem die erste Dezimalstelle 3 ist (Erhältlich durch Teilen mit rand ())

Die Eingabe wird in Zelle A1 eingefügt

Moacir
quelle
Sie könnten MID(WEEKDAY(A1)/0,29;5;1)="4"und auch ;1;)anstelle von;TRUE)
Adebunk
4

Sauber , 343 326 303 279 216 Bytes

Clean ist dafür so ungeeignet, als würde man versuchen, einen Zaun mit einer Kettensäge zu streichen.

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

Probieren Sie es online!

Golfen dann Erklärung.

Οurous
quelle
1
+1 Nur für die Malerei einen Zaun mit einem Kettensägenbezug! : D
Perpetual J
4

R , 114 106 Bytes

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

Probieren Sie es online!

Beharrlichkeit:

Das Datum wird Lmit der Liste der Daten verglichen, an denen der Code WAHR zurückgegeben hat. Wenn der Code TRUE zurückgibt, wird das heutige Datum an diese Liste angehängt. Andernfalls wird die Liste nicht geändert.

6 Bytes gespart dank @Giuseppe!

Der Code funktionierte tatsächlich und sparte dank @digEmAll 2 Bytes!

JayCe
quelle
Diese Methode verwendet die aktuelle Zeit, anstatt sie als Parameter zu empfangen, nicht wahr?
Charlie
@ Charlie sieht aus, als hätte ich die Herausforderung genauer lesen sollen ... hätte mir das Leben leichter gemacht! Ich werde aktualisieren.
JayCe
^hat eine höhere Priorität als %any%, *hat aber eine niedrigere Priorität als %any%, so dass ^Sie mit ein paar Klammern loswerden können, und ich habe auch ein paar mehr nach unten gespielt! Ziemlich sicher, dass es für 108 Bytes
Giuseppe
1
Sie können auch :anstelle von verwenden ^, um Spaß zu haben, und so ist in Ihrem Code eine Million enthalten :.
Giuseppe
@ Giuseppe Es hat eine Tonne von :jetzt!
JayCe
3

C (GCC) ,  78   50  49 Bytes

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

Probieren Sie es online!

Die erwarteten Eingaben sind:

  • d: das Datum als einzelne Zahl yyyymmdd
  • w: der Wochentag, beginnend mit Montag (0)
  • t: die Zeit als einzelne Zahl hhmm

Erläuterung

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
}

Bearbeitungen

  • 28 Bytes gespart dank Adám
  • 1 Byte mehr gespart, da abs()mit der neuen Version eigentlich nicht geholfen wurde
Annyo
quelle
1
Warum nicht YYYYMMDDund hhmmals einzelne Zahlen nehmen?
Adám
@Adam In der Tat ... Ich werde es versuchen, wenn ich etwas Zeit habe
Annyo
Schlagen Sie w<4&w%2&t>749&t<811stattdessen vorw<4&&w%2&&t>749&&t<811
ceilingcat
2

Batch, 109 Bytes

@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

Übernimmt Eingaben in der Form date time dowzB 2018-09-04 08:10 2und gibt sie über Exit-Code aus. Erläuterung: Die Umgebungsvariable l(oder jeder andere einzelne Buchstabe würde funktionieren) wird verwendet, um das letzte erfolgreiche Datum zu speichern, das den Test besteht. (Das Datumsformat selbst spielt keine Rolle, solange es konsistent ist und keine Leerzeichen enthält.)

Neil
quelle
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;

Wenn Sie alle drei Zeilen in dieselbe Zeile verschieben, wird die Größe auf 117Byte reduziert . hwird als Eigenschaft verwendet, lesen Sie einfach den Wert, bevor Sie die Nachricht senden:

if (h) SendMessage();
Perpetual J
quelle
1

F #, 119 Bytes

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 =

Deklarieren Sie die aufgerufene Funktion fmit Parametern w(Wochentag) d(Datum) h(Stunde) m(Minute) l(Liste der Daten, an denen sie ausgeführt wird)

if not(l|>Seq.contains d) wenn die Liste der Daten das übergebene Datum nicht enthält

&&[3;5]|>Seq.contains w und der Tag ist Dienstag (3) oder Mittwoch (5)

&&(h=7&&m>49||h=8&&m<11) und die Zeit liegt zwischen (exklusiv) 7:49 und 8:11

then(l@[d],true) Geben Sie dann ein Tupel mit der Liste der Datumsangaben mit dem aktuellen angehängten Datum und true zurück

else(l,false) Andernfalls wird ein Tupel mit der Liste der Datumsangaben ohne today und false zurückgegeben

Nick
quelle
0

Bash 95 87 Bytes

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

Bearbeiten: 8 Bytes durch Diebstahl einer Idee von Annyo gespeichert

Rufen Sie mit yyyymmdd HHMM D an, wobei D für Montag bei 0 beginnt.

Ich bin mir nicht ganz sicher, warum ich die Zeilenzahl auf drei gesetzt habe. Es scheint, dass es zwei sein sollten, aber zwei funktionieren nicht und drei scheinen zu funktionieren.

Ich habe mich auch nicht darum gekümmert, das Datum zu verwenden, aber die Anforderungen scheinen darauf hinzudeuten, dass wir das Datum akzeptieren sollten. Deshalb habe ich die erwähnte Option gewählt, die Zeit separat zu nehmen und den Datumswert einfach zu ignorieren.

crystalgecko
quelle
Wie stellen Sie sicher, dass Sie die Nachricht nicht zweimal am selben Tag senden, wenn Sie das Datum nicht verwenden?
Charlie
Es bleibt 20 Minuten lang bestehen und die erste Überprüfung stellt sicher, dass keine Kopie ausgeführt wird
crystalgecko