Un robot d'accueil pour un collègue de travail

14

J'ai un collègue au travail qui travaille à domicile tous les mardis et jeudis. Vers 8h00, il nous envoie un message avec le texte suivant:

Bonjour, je travaille de la maison

Afin de le soulager du fardeau de le faire chaque jour qu'il reste à la maison, nous aimerions automatiser cette tâche pour lui.

Le défi

Écrivez le moins d'octets possible un morceau de code qui:

  • Reçoit l'heure actuelle: votre code peut recevoir des valeurs pour l'année en cours, le mois (1-12), le jour du mois (1-31), l'heure (0-23) et les minutes (0-59) et le jour de la semaine (vous pouvez choisir si ce nombre commence à 0 ou 1, et si 0/1 signifie dimanche, lundi ou tout autre jour); Sinon , vous pouvez recevoir une structure telle que Date, DateTime, Calendarou toute autre structure liée à temps, si votre langue permet. Vous pouvez également recevoir une chaîne avec la date yyyyMMddHHmmsi vous le souhaitez, ou deux chaînes distinctes pour la date et l'heure, puis un entier avec le jour de la semaine. N'hésitez pas.
  • Renvoie deux valeurs de vérité et de falsey cohérentes , indiquant si le message doit être envoyé au chat professionnel ou non.

Règles

  • Ce morceau de code est supposé être invoqué périodiquement. La périodicité exacte est néanmoins sans importance.
  • La valeur véridique doit être retournée si le jour de la semaine est le mardi ou le jeudi et l'heure est à 8h00 avec une marge d'erreur de 10 minutes (de 7h50 à 8h10 inclus).
  • La valeur véridique ne doit être envoyée que si c'est la première fois que le code est invoqué entre ces heures pour le jour spécifié. Nous ne voulons pas que le bot envoie le même message plusieurs fois de suite. La façon dont vous gérerez cette restriction dépendra entièrement de vous.
  • Votre code peut être un programme indépendant exécuté de manière répétée ou il peut faire partie d'un code plus volumineux qui est toujours en cours d'exécution. Votre choix.
  • Vous pouvez supposer qu'il n'y aura pas de redémarrage entre les exécutions du code.
  • Vous pouvez supposer que la date sera toujours correcte.
  • Des explications sur votre code et en particulier sur la méthode utilisée pour obtenir la persistance sont encouragées.

Exemples

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

C'est le , donc le code le plus court pour chaque langue peut gagner!

Charlie
la source
Cela vient du bac à sable .
Charlie
Y a-t-il une restriction dans le format d'entrée? Puis-je prendre la date comme un seul paramètre comme YYYYmmddet l'heure aussi HHss?
Luis felipe De jesus Munoz
1
@LuisfelipeDejesusMunoz oui, si vous le souhaitez, vous pouvez recevoir la date et l'heure dans ce format. J'ai mis à jour la question pour que ce soit clair.
Charlie
1
@KamilDrakari le programme doit vérifier la date donnée en paramètre, vous ne pouvez pas prendre la date actuelle. Si vous le faites, il sera impossible de faire passer le code à une batterie de test comme celle que je propose dans la question.
Charlie
2
Vous interrogez donc régulièrement un script pour être utile au maximum une fois par jour, les 2/7 des jours? Si vous automatisez toutes vos tâches comme ça ...
Mast

Réponses:

15

JavaScript (ES6), 43 octets

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

Essayez-le en ligne!

Contribution

  • la date sous forme de chaîne au yyyymmddformat
  • l'heure sous forme de chaîne au hhmmformat
  • le jour de la semaine sous la forme d'un entier indexé 0, avec 0= mardi, 1= mercredi, ..., 6= lundi

Production

Renvoie 0ou 1.

Commenté

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
la source
7
Javascript (et votre maîtrise de celui-ci) me surprendra toujours.
Charlie
1
ES6 est amusant à jouer au golf avec :) Le 2ème format d'entrée est-il valide?
Arnauld
Oui, je l'ai déjà précisé dans le texte de la question.
Charlie
5

Python 3 , 69 octets

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

Essayez-le en ligne!

Prend l'entrée comme f(day of the week, date, hours, minutes), où la date peut être dans n'importe quel format cohérent.

ovs
la source
5

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

Infixe anonyme lambda. Appelé avecYYYYMMDD f hhmm puis demande le numéro du jour de la semaine; 2 et 4 sont mardi et jeudi. Redéfinit le global Dpour se souvenir des dates.

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

Essayez-le en ligne!

D←⍬ initialiser Dpour être un ensemble vide

{} Lambda anonyme; est YYYYMMDD, est-ce que la hhmm
780-⍵ différence entre 780 (moyenne de 0750 et 0810) et la
| valeur absolue en temps de
30≥ 30 est supérieure ou égale à cela?
()< Et il n'est pas vrai que:
  ⍺∊D la date est un membre de D
()∧ et il est vrai que:
  ⎕∊2 4 l'invité pour le jour de la semaine est un membre de l'ensemble {2,4}
⍺/⍨ utilisez-le pour compresser la date (c'est-à-dire donne {} si faux, {date} si vrai)
D,← ajoutez cela à D
 et retournez son décompte (ie 0 ou 1, qui sont faux et vrai d'APL)

Adam
la source
4

Formule Excel, 85 octets

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

Les jours de la semaine sans paramètres sont de 1 (dimanche) à 7 (samedi). Les jours que nous voulons sont 3 et 5. En divisant tous les nombres de 1 à 7 pour 0,648, seulement 3 et 5 donne un résultat où la première décimale est 3 (obtenu en divisant avec rand ())

L'entrée est insérée dans la cellule A1

Moacir
la source
Vous pouvez utiliser MID(WEEKDAY(A1)/0,29;5;1)="4"et aussi ;1;)au lieu de;TRUE)
adebunk
4

Propre , 343 326 303 279 216 octets

La propreté est si mal adaptée à cela que c'est comme essayer de peindre une clôture avec une tronçonneuse.

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

Essayez-le en ligne!

Golf puis explication.

Οurous
la source
1
+1 Juste pour la peinture d'une clôture avec une référence de tronçonneuse! : D
Perpetual J
4

R , 114 106 octets

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

Essayez-le en ligne!

Persistance:

La date est vérifiée L la liste des dates où le code a renvoyé VRAI. Lorsque le code renvoie VRAI, la date du jour est ajoutée à cette liste. Sinon, la liste n'est pas modifiée.

6 octets enregistrés grâce à @Giuseppe!

Fait fonctionner le code et économisé 2 octets grâce à @digEmAll!

JayCe
la source
Cette méthode prend l'heure actuelle au lieu de la recevoir comme paramètre, n'est-ce pas?
Charlie
@Charlie looks II aurait dû lire le défi plus attentivement ... aurait facilité ma vie! Je mettrai à jour.
JayCe
^a une priorité plus élevée que %any%mais *a une priorité inférieure à %any%, donc en utilisant, ^vous pouvez vous débarrasser de certaines parenthèses, et j'en ai joué un peu plus! Je suis sûr que ça marche pour 108 octets
Giuseppe
1
Vous pouvez également utiliser à la :place de ^, pour le plaisir, et donc votre code en contient un million :.
Giuseppe
@Giuseppe Il en a une tonne :maintenant!
JayCe
3

C (gcc) ,  78   50  49 octets

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

Essayez-le en ligne!

Les intrants attendus sont:

  • d: la date, sous forme de chiffre unique yyyymmdd
  • w: le jour de la semaine, en commençant par lundi (0)
  • t: l'heure, en un seul chiffre hhmm

Explication

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
}

Modifications

  • 28 octets enregistrés grâce à Adám
  • Enregistré 1 octet de plus, car abs()n'aidait en fait pas avec la nouvelle version
Annyo
la source
1
Pourquoi ne pas prendre YYYYMMDDet hhmmcomme des numéros uniques?
Adám
@ Adám En effet ... j'essaierai ça quand j'aurai du temps
Annyo
Suggérer à la w<4&w%2&t>749&t<811place dew<4&&w%2&&t>749&&t<811
plafondcat
2

Lot, 109 octets

@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

Prend l'entrée dans le formulaire date time dowpar exemple 2018-09-04 08:10 2et les sorties via le code de sortie. Explication: La variable d'environnement l(ou toute autre lettre unique fonctionnerait) est utilisée pour stocker la dernière date de réussite qui réussit le test. (Le format de date lui-même n'a pas d'importance tant qu'il est cohérent et ne contient pas d'espaces.)

Neil
la source
2

Perl 6 , 33 octets

{811>$^t>749>5+>$^w%2>(%){$^d}++}

Essayez-le en ligne!

Fortement inspiré par la solution d'Arnauld. Utilise le même format d'entrée.

nwellnhof
la source
1

C # , 121 octets

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

Déplacer les trois sur la même ligne réduit la taille en 117octets. hest utilisé comme une propriété, il suffit de lire la valeur avant d'envoyer le message:

if (h) SendMessage();
Perpetual J
la source
1

F #, 119 octets

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 =

déclarer une fonction appelée favec des paramètres w(jour de la semaine) d(date) h(heure)m (minute) l(liste des dates d'exécution)

if not(l|>Seq.contains d) si la liste des dates ne contient pas la date passée

&&[3;5]|>Seq.contains w et le jour est mardi (3) ou mercredi (5)

&&(h=7&&m>49||h=8&&m<11) et le temps est entre (exclusif) 7h49 et 8h11

then(l@[d],true) puis retourne un tuple contenant la liste des dates avec la date actuelle ajoutée, et true

else(l,false) sinon retourner un tuple contenant la liste des dates sans aujourd'hui et faux

pseudo
la source
0

Bash 95 87 octets

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

Edit: économisé 8 octets en volant une idée à Annyo

Appelez avec aaaammjj HHMM D, avec D commençant à 0, pour lundi.

Je ne suis pas tout à fait sûr de la raison pour laquelle la vérification du nombre de lignes est définie sur trois, il semble que cela devrait être deux, mais deux ne fonctionnent pas et trois semblent fonctionner.

De plus, je n'ai pas pris la peine d'utiliser la date, mais les exigences semblent indiquer que nous devrions accepter la date, j'ai donc pris l'option mentionnée pour prendre le temps séparément et ignorer la valeur de la date.

crystalgecko
la source
Si vous n'utilisez pas la date, comment vérifiez-vous que vous n'envoyez pas le message deux fois le même jour?
Charlie
Il reste en place pendant 20 minutes et le premier contrôle garantit qu'il n'y a pas de copie existante en cours d'exécution
crystalgecko