Un saludo bot para un colega del trabajo

14

Tengo un colega en el trabajo que trabaja desde casa todos los martes y jueves. Alrededor de las 8:00 a.m., nos envía un mensaje con el siguiente texto:

Hola hoy estoy trabajando desde casa

Para liberarlo de la carga de hacer esto todos los días que se queda en casa, nos gustaría automatizar esta tarea para él.

El reto

Escriba en el menor número de bytes posible un código que:

  • Recibe la hora actual: su código puede recibir valores para el año actual, mes (1-12), día del mes (1-31), hora (0-23) y minuto (0-59) y el día de la semana (puede elegir si este número comienza desde 0 o 1, y si 0/1 significa domingo, lunes o cualquier otro día); alternativamente, puede recibir una estructura tal como Date, DateTime, Calendaro cualquier otra estructura relacionada con el tiempo, si el idioma lo permita. También puede recibir una cadena con la fecha yyyyMMddHHmmsi lo desea, o dos cadenas separadas para la fecha y la hora, y luego un número entero con el día de la semana. Sentirse libre.
  • Devuelve dos valores de verdad y falsa coherentes , lo que indica si el mensaje debe enviarse al chat de trabajo o no.

Reglas

  • Se supone que este código se invoca periódicamente. La periodicidad exacta es irrelevante, no obstante.
  • El valor verdadero debe devolverse si el día de la semana es martes o jueves y la hora es a las 8:00 a.m. con un margen de error de 10 minutos (de 7:50 a 8:10 inclusive).
  • El valor verdadero debe enviarse solo si es la primera vez que se invoca el código entre esas horas para el día especificado. No queremos que el bot envíe el mismo mensaje varias veces seguidas. La forma en que maneje esta restricción dependerá completamente de usted.
  • Su código puede ser un programa independiente ejecutado repetidamente o puede ser parte de un código más grande que siempre se está ejecutando. Tu elección.
  • Puede suponer que no habrá reinicios entre las ejecuciones del código.
  • Puede suponer que la fecha siempre será correcta.
  • Se alientan las explicaciones sobre su código y específicamente sobre el método utilizado para lograr la persistencia.

Ejemplos

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

Este es el , ¡así que puede ganar el código más corto para cada idioma!

Charlie
fuente
Esto viene de la caja de arena .
Charlie
¿Hay alguna restricción en el formato de entrada? ¿Puedo tomar la fecha como un solo parámetro YYYYmmddy la hora también HHss?
Luis felipe De jesus Munoz
1
@LuisfelipeDejesusMunoz sí, si lo desea, puede recibir la fecha y la hora en ese formato. He actualizado la pregunta para aclararlo.
Charlie
1
@KamilDrakari el programa debe verificar la fecha dada como parámetro, no puede tomar la fecha actual. Si lo hace, será imposible hacer que el código pase una batería de prueba como la que propongo en la pregunta.
Charlie
2
Entonces, ¿estás sondeando un script regularmente para que sea útil como máximo una vez al día, 2/7 de los días? Si automatizas todas tus tareas así ...
Mástil

Respuestas:

15

JavaScript (ES6), 43 bytes

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

Pruébalo en línea!

Entrada

  • la fecha como una cadena en yyyymmddformato
  • el tiempo como una cadena en hhmmformato
  • el día de la semana como un entero indexado 0, con 0= martes, 1= miércoles, ..., 6= lunes

Salida

Devoluciones 0o 1.

Comentado

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
fuente
77
Javascript (y tu dominio de él) siempre me sorprenderán.
Charlie
1
ES6 es divertido para jugar al golf :) ¿Es válido el segundo formato de entrada?
Arnauld
Sí, ya lo especifiqué en el texto de la pregunta.
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)

Pruébalo en línea!

Toma entrada como f(day of the week, date, hours, minutes), donde la fecha puede estar en cualquier formato consistente.

ovs
fuente
5

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

Anónimo infijo lambda. Llamado con YYYYMMDD f hhmmy luego solicita el número del día de la semana; 2 y 4 son martes y jueves. Redefine las Dfechas globales para recordar.

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

Pruébalo en línea!

D←⍬ Inicializar Dpara ser un conjunto vacío

{... } lambda anónimo; es decir YYYYMMDD, ¿ hay hhmm
780-⍵ diferencia entre 780 (media de 0750 y 0810) y el
| valor absoluto de tiempo de eso
30≥ es 30 mayor o igual a eso?
(... )< y no es cierto que:
  ⍺∊D la fecha es un miembro de D
(... )∧ y es cierto que:
  ⎕∊2 4 la pregunta solicitada para el día de la semana es un miembro del conjunto {2,4}
⍺/⍨ usar eso para comprimir la fecha (es decir, da {} si es falso, {fecha} si es verdadero)
D,← agrega eso D
 y devuelve su cuenta (es decir, 0 o 1, que son falsos y verdaderos de APL)

Adán
fuente
4

Fórmula Excel, 85 bytes

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

Los días de semana sin parámetros son de 1 (domingo) a 7 (sábado). Los días que queremos son 3 y 5. Dividiendo todos los números del 1 al 7 para 0,648, solo 3 y 5 dan un resultado donde el primer decimal es 3 (Lo obtuve dividiendo con rand ())

La entrada se inserta en la celda A1

Moacir
fuente
Podrías usar MID(WEEKDAY(A1)/0,29;5;1)="4"y también en ;1;)lugar de;TRUE)
adebunk
4

Limpias , 343 326 303 279 216 bytes

Clean es tan inadecuado para esto que es como tratar de pintar una cerca con una motosierra.

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

Pruébalo en línea!

Golf y luego explicación.

Οurous
fuente
1
+1 ¡Solo para pintar una valla con una referencia de motosierra! : D
Perpetuo 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

Pruébalo en línea!

Persistencia:

La fecha se compara con Lla lista de fechas donde el código devuelve VERDADERO. Cuando el código devuelve VERDADERO, la fecha de hoy se agrega a esta lista. De lo contrario, la lista no se modifica.

¡Guardado 6 bytes gracias a @Giuseppe!

¡El código realmente funcionó y ahorró 2 bytes gracias a @digEmAll!

JayCe
fuente
Este método toma el tiempo actual en lugar de recibirlo como parámetro, ¿no?
Charlie
@Charlie parece que II debería haber leído el desafío con más cuidado ... ¡me hubiera hecho la vida más fácil! Voy a actualizar.
JayCe
^tiene una precedencia más alta que, %any%pero *tiene una precedencia más baja que %any%, por lo que usarlo ^puede eliminar algunos paréntesis, ¡y también jugué un poco más! Bastante seguro de que funciona para 108 bytes
Giuseppe
1
También podría usar en :lugar de ^, por diversión, y por lo tanto su código tiene un millón :.
Giuseppe
@Giuseppe ¡Tiene un montón de :ahora!
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);}

Pruébalo en línea!

Las entradas esperadas son:

  • d: la fecha, como un solo número yyyymmdd
  • w: el día de la semana, comenzando con el lunes (0)
  • t: la hora, como un solo número hhmm

Explicación

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
}

Ediciones

  • Guardado 28 bytes gracias a Adám
  • Se guardó 1 byte más, ya que en abs()realidad no estaba ayudando con la nueva versión
Annyo
fuente
1
¿Por qué no tomar YYYYMMDDy hhmmcomo números individuales?
Adám
@ Adám De hecho ... lo intentaré cuando tenga algo de tiempo
Annyo
Sugerir en w<4&w%2&t>749&t<811lugar dew<4&&w%2&&t>749&&t<811
ceilingcat
2

Lote, 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

Toma entrada en el formulario, date time dowpor ejemplo, 2018-09-04 08:10 2y sale a través del código de salida. Explicación: La variable de entorno l(o cualquier otra letra única funcionaría) se utiliza para almacenar la última fecha exitosa que pasa la prueba. (El formato de fecha en sí mismo no importa siempre que sea coherente y no contenga espacios).

Neil
fuente
2

Perl 6 , 33 bytes

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

Pruébalo en línea!

Muy inspirado por la solución de Arnauld. Utiliza el mismo formato de entrada.

nwellnhof
fuente
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;

Mover los tres a la misma línea reduce el tamaño a 117bytes. hse usa como una propiedad, solo lea el valor antes de enviar el mensaje:

if (h) SendMessage();
J perpetuo
fuente
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 =

declara la función llamada fcon parámetros w(día de la semana) d(fecha) h(hora) m(minuto) l(lista de fechas en que se ejecuta)

if not(l|>Seq.contains d) si la lista de fechas no contiene la fecha pasada

&&[3;5]|>Seq.contains w y el día es martes (3) o miércoles (5)

&&(h=7&&m>49||h=8&&m<11) y el tiempo es entre (exclusivo) 7:49 y 8:11

then(l@[d],true) luego devuelve una tupla que contiene la lista de fechas con la fecha actual adjunta y verdadera

else(l,false) de lo contrario, devuelve una tupla que contiene la lista de fechas sin hoy y falsa

mella
fuente
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

Editar: ahorró 8 bytes al robar una idea de Annyo

Llame con aaaammdd HHMM D, con D a partir de 0, para el lunes.

No estoy completamente seguro de por qué tengo la verificación de recuento de líneas establecida en tres, parece que deberían ser dos, pero dos no funcionan y tres parecen funcionar.

Además, no me he molestado en usar la fecha, pero los requisitos parecen indicar que debemos aceptar la fecha, así que tomé la opción mencionada para tomar el tiempo por separado e ignorar el valor de la fecha.

crystalgecko
fuente
Si no usa la fecha, ¿cómo verifica que no envíe el mensaje dos veces para el mismo día?
Charlie
Permanece durante 20 minutos y la primera verificación asegura que no hay una copia en ejecución
crystalgecko