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 demyyyyMMddHHmm
gewü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 Code-Golf , also kann der kürzeste Code für jede Sprache gewinnen!
code-golf
decision-problem
date
stateful
Charlie
quelle
quelle
YYYYmmdd
und die Uhrzeit auch nehmenHHss
?Antworten:
JavaScript (ES6), 43 Byte
Probieren Sie es online!
Eingang
yyyymmdd
Formathhmm
Format0
= Dienstag,1
= Mittwoch, ...,6
= MontagAusgabe
Rückgabe
0
oder1
.Kommentiert
quelle
Python 3 , 69 Bytes
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.quelle
APL (Dyalog Unicode) ,
615350483736 Byte SBCSAnonymes Infix Lambda. Wird mit
YYYYMMDD f hhmm
angerufen und fordert dann zur Eingabe der Wochentagsnummer auf. 2 und 4 sind Dienstag und Donnerstag. Definiert das globaleD
Datum neu, um sich Daten zu merken.Probieren Sie es online!
D←⍬
initialisierenD
, um eine leere Menge zu sein{
…}
Anonymes Lambda;⍺
istYYYYMMDD
,⍵
ist diehhmm
780-⍵
Differenz zwischen 780 (Mittelwert von 0750 und 0810) und dem Zeitabsolutwert|
von30≥
30 größer oder gleich?(
...)<
und es ist nicht wahr, dass:⍺∊D
das Datum ein Mitglied vonD
(
... ist)∧
und es ist wahr, dass:⎕∊2 4
der aufgerufene Wochentag ein Mitglied der Menge⍺/⍨
ist {date} falls wahr)D,←
füge das anD
≢
und gib seine Tally zurück (dh 0 oder 1, die falsch und wahr von APL sind)quelle
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
quelle
MID(WEEKDAY(A1)/0,29;5;1)="4"
und auch;1;)
anstelle von;TRUE)
Sauber ,
343326303279216 BytesClean ist dafür so ungeeignet, als würde man versuchen, einen Zaun mit einer Kettensäge zu streichen.
Probieren Sie es online!
Golfen dann Erklärung.
quelle
R ,
114106 BytesProbieren Sie es online!
Beharrlichkeit:
Das Datum wird
L
mit 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!
quelle
^
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:
anstelle von verwenden^
, um Spaß zu haben, und so ist in Ihrem Code eine Million enthalten:
.:
jetzt!C (GCC) ,
785049 BytesProbieren Sie es online!
Die erwarteten Eingaben sind:
d
: das Datum als einzelne Zahlyyyymmdd
w
: der Wochentag, beginnend mit Montag (0)t
: die Zeit als einzelne Zahlhhmm
Erläuterung
Bearbeitungen
abs()
mit der neuen Version eigentlich nicht geholfen wurdequelle
YYYYMMDD
undhhmm
als einzelne Zahlen nehmen?w<4&w%2&t>749&t<811
stattdessen vorw<4&&w%2&&t>749&&t<811
Batch, 109 Bytes
Übernimmt Eingaben in der Form
date
time
dow
zB2018-09-04 08:10 2
und gibt sie über Exit-Code aus. Erläuterung: Die Umgebungsvariablel
(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.)quelle
Perl 6 , 33 Bytes
Probieren Sie es online!
Stark inspiriert von Arnauld's Lösung. Verwendet dasselbe Eingabeformat.
quelle
C # , 121 Bytes
Wenn Sie alle drei Zeilen in dieselbe Zeile verschieben, wird die Größe auf
117
Byte reduziert .h
wird als Eigenschaft verwendet, lesen Sie einfach den Wert, bevor Sie die Nachricht senden:quelle
F #, 119 Bytes
let f w d h m l =
Deklarieren Sie die aufgerufene Funktion
f
mit Parameternw
(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:11then(l@[d],true)
Geben Sie dann ein Tupel mit der Liste der Datumsangaben mit dem aktuellen angehängten Datum und true zurückelse(l,false)
Andernfalls wird ein Tupel mit der Liste der Datumsangaben ohne today und false zurückgegebenquelle
Bash
9587 BytesBearbeiten: 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.
quelle