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
,Calendar
o cualquier otra estructura relacionada con el tiempo, si el idioma lo permita. También puede recibir una cadena con la fechayyyyMMddHHmm
si 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
YYYYmmdd
y la hora tambiénHHss
?Respuestas:
JavaScript (ES6), 43 bytes
Pruébalo en línea!
Entrada
yyyymmdd
formatohhmm
formato0
= martes,1
= miércoles, ...,6
= lunesSalida
Devoluciones
0
o1
.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 hhmm
y luego solicita el número del día de la semana; 2 y 4 son martes y jueves. Redefine lasD
fechas globales para recordar.Pruébalo en línea!
D←⍬
InicializarD
para ser un conjunto vacío{
...}
lambda anónimo;⍺
es decirYYYYMMDD
, ¿⍵
hayhhmm
780-⍵
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:⍺∊D
la fecha es un miembro deD
(
...)∧
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 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
L
la 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úmeroyyyymmdd
w
: el día de la semana, comenzando con el lunes (0)t
: la hora, como un solo númerohhmm
Explicación
Ediciones
abs()
realidad no estaba ayudando con la nueva versiónfuente
YYYYMMDD
yhhmm
como números individuales?w<4&w%2&t>749&t<811
lugar dew<4&&w%2&&t>749&&t<811
Lote, 109 bytes
Toma entrada en el formulario,
date
time
dow
por ejemplo,2018-09-04 08:10 2
y 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
117
bytes.h
se 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
f
con 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 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: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