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 fechayyyyMMddHHmmsi 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 código de golf , ¡así que puede ganar el código más corto para cada idioma!
code-golf
decision-problem
date
stateful
Charlie
fuente
fuente

YYYYmmddy la hora tambiénHHss?Respuestas:
JavaScript (ES6), 43 bytes
Pruébalo en línea!
Entrada
yyyymmddformatohhmmformato0= martes,1= miércoles, ...,6= lunesSalida
Devoluciones
0o1.Comentado
fuente
Python 3 , 69 bytes
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.fuente
APL (Dyalog Unicode) ,
615350483736 bytes SBCSAnó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 lasDfechas globales para recordar.Pruébalo en línea!
D←⍬InicializarDpara ser un conjunto vacío{...}lambda anónimo;⍺es decirYYYYMMDD, ¿⍵hayhhmm780-⍵diferencia entre 780 (media de 0750 y 0810) y el|valor absoluto de tiempo de eso30≥es 30 mayor o igual a eso?(...)<y no es cierto que:⍺∊Dla fecha es un miembro deD(...)∧y es cierto que:⎕∊2 4la 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 esoD≢y devuelve su cuenta (es decir, 0 o 1, que son falsos y verdaderos de APL)fuente
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
fuente
MID(WEEKDAY(A1)/0,29;5;1)="4"y también en;1;)lugar de;TRUE)Limpias ,
343326303279216 bytesClean es tan inadecuado para esto que es como tratar de pintar una cerca con una motosierra.
Pruébalo en línea!
Golf y luego explicación.
fuente
R ,
114106 bytesPrué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!
fuente
^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:lugar de^, por diversión, y por lo tanto su código tiene un millón:.:ahora!C (gcc) ,
785049 bytesPruébalo en línea!
Las entradas esperadas son:
d: la fecha, como un solo númeroyyyymmddw: el día de la semana, comenzando con el lunes (0)t: la hora, como un solo númerohhmmExplicación
Ediciones
abs()realidad no estaba ayudando con la nueva versiónfuente
YYYYMMDDyhhmmcomo números individuales?w<4&w%2&t>749&t<811lugar dew<4&&w%2&&t>749&&t<811Lote, 109 bytes
Toma entrada en el formulario,
datetimedowpor ejemplo,2018-09-04 08:10 2y sale a través del código de salida. Explicación: La variable de entornol(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).fuente
Perl 6 , 33 bytes
Pruébalo en línea!
Muy inspirado por la solución de Arnauld. Utiliza el mismo formato de entrada.
fuente
C # , 121 bytes
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:fuente
F #, 119 bytes
let f w d h m l =declara la función llamada
fcon parámetrosw(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 wy 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:11then(l@[d],true)luego devuelve una tupla que contiene la lista de fechas con la fecha actual adjunta y verdaderaelse(l,false)de lo contrario, devuelve una tupla que contiene la lista de fechas sin hoy y falsafuente
Bash
9587 bytesEditar: 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.
fuente