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
,Calendar
ou toute autre structure liée à temps, si votre langue permet. Vous pouvez également recevoir une chaîne avec la dateyyyyMMddHHmm
si 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 code-golf , donc le code le plus court pour chaque langue peut gagner!
code-golf
decision-problem
date
stateful
Charlie
la source
la source
YYYYmmdd
et l'heure aussiHHss
?Réponses:
JavaScript (ES6), 43 octets
Essayez-le en ligne!
Contribution
yyyymmdd
formathhmm
format0
= mardi,1
= mercredi, ...,6
= lundiProduction
Renvoie
0
ou1
.Commenté
la source
Python 3 , 69 octets
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.la source
APL (Dyalog Unicode) ,
615350483736 octets SBCSInfixe anonyme lambda. Appelé avec
YYYYMMDD f hhmm
puis demande le numéro du jour de la semaine; 2 et 4 sont mardi et jeudi. Redéfinit le globalD
pour se souvenir des dates.Essayez-le en ligne!
D←⍬
initialiserD
pour être un ensemble vide{
…}
Lambda anonyme;⍺
estYYYYMMDD
,⍵
est-ce que lahhmm
780-⍵
différence entre 780 (moyenne de 0750 et 0810) et la|
valeur absolue en temps de30≥
30 est supérieure ou égale à cela?(
…)<
Et il n'est pas vrai que:⍺∊D
la date est un membre deD
(
…)∧
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)la source
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
la source
MID(WEEKDAY(A1)/0,29;5;1)="4"
et aussi;1;)
au lieu de;TRUE)
Propre ,
343326303279216 octetsLa propreté est si mal adaptée à cela que c'est comme essayer de peindre une clôture avec une tronçonneuse.
Essayez-le en ligne!
Golf puis explication.
la source
R ,
114106 octetsEssayez-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!
la source
^
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:
place de^
, pour le plaisir, et donc votre code en contient un million:
.:
maintenant!C (gcc) ,
785049 octetsEssayez-le en ligne!
Les intrants attendus sont:
d
: la date, sous forme de chiffre uniqueyyyymmdd
w
: le jour de la semaine, en commençant par lundi (0)t
: l'heure, en un seul chiffrehhmm
Explication
Modifications
abs()
n'aidait en fait pas avec la nouvelle versionla source
YYYYMMDD
ethhmm
comme des numéros uniques?w<4&w%2&t>749&t<811
place dew<4&&w%2&&t>749&&t<811
Lot, 109 octets
Prend l'entrée dans le formulaire
date
time
dow
par exemple2018-09-04 08:10 2
et les sorties via le code de sortie. Explication: La variable d'environnementl
(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.)la source
Perl 6 , 33 octets
Essayez-le en ligne!
Fortement inspiré par la solution d'Arnauld. Utilise le même format d'entrée.
la source
C # , 121 octets
Déplacer les trois sur la même ligne réduit la taille en
117
octets.h
est utilisé comme une propriété, il suffit de lire la valeur avant d'envoyer le message:la source
F #, 119 octets
let f w d h m l =
déclarer une fonction appelée
f
avec des paramètresw
(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 8h11then(l@[d],true)
puis retourne un tuple contenant la liste des dates avec la date actuelle ajoutée, et trueelse(l,false)
sinon retourner un tuple contenant la liste des dates sans aujourd'hui et fauxla source
Bash
9587 octetsEdit: é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.
la source