Eu tenho um colega de trabalho que trabalha em casa toda terça e quinta-feira. Por volta das 8:00 da manhã, ele nos envia uma mensagem com o seguinte texto:
Olá hoje eu estou trabalhando em casa
Para aliviá-lo do fardo de fazer isso todos os dias em que ele fica em casa, gostaríamos de automatizar essa tarefa para ele.
O desafio
Escreva no mínimo de bytes possível um pedaço de código que:
- Recebe a hora atual: seu código pode receber valores para o ano atual, mês (1-12), dia do mês (1-31), hora (0-23) e minuto (0-59) e dia da semana (você pode escolher se esse número começa em 0 ou 1 e se 0/1 significa domingo, segunda ou qualquer outro dia); Alternativamente, você pode receber uma estrutura como
Date
,DateTime
,Calendar
ou qualquer outra estrutura relacionados com o tempo, se a sua linguagem permite isso. Você também pode receber uma sequência com a data,yyyyMMddHHmm
se desejar, ou duas sequências separadas para data e hora e, em seguida, um número inteiro com o dia da semana. Fique à vontade. - Devoluções dois consistentes truthy e Falsey valores, que indicam se a mensagem deve ser enviada para o bate-papo funcionar ou não.
Regras
- Presume-se que esse trecho de código seja chamado periodicamente. A periodicidade exata é irrelevante, no entanto.
- O valor de verdade deve ser retornado se o dia da semana for terça ou quinta-feira e o horário for 8:00, com uma margem de erro de 10 minutos (inclusive das 7:50 às 8:10).
- O valor de verdade deve ser enviado apenas se for a primeira vez que o código for chamado entre essas horas no dia especificado. Não queremos que o bot envie a mesma mensagem várias vezes seguidas. A maneira como você gerencia essa restrição depende inteiramente de você.
- Seu código pode ser um programa independente executado repetidamente ou pode fazer parte de um código maior que está sempre em execução. Sua escolha.
- Você pode assumir que não haverá reinicializações entre as execuções do código.
- Você pode assumir que a data sempre estará correta.
- Explicações sobre seu código e especificamente sobre o método usado para obter persistência são incentivadas.
Exemplos
(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 é o código-golfe , portanto, pode ganhar o código mais curto para cada idioma!
code-golf
decision-problem
date
stateful
Charlie
fonte
fonte
YYYYmmdd
e a hora tambémHHss
?Respostas:
JavaScript (ES6), 43 bytes
Experimente online!
Entrada
yyyymmdd
formatohhmm
formato0
= terça-feira,1
= quarta-feira, ...,6
= segunda-feiraResultado
Retorna
0
ou1
.Comentado
fonte
Python 3 , 69 bytes
Experimente online!
Aceita entrada como
f(day of the week, date, hours, minutes)
, onde a data pode estar em qualquer formato consistente.fonte
APL (Dyalog Unicode) ,
615350483736 bytes SBCSInfix anônimo lambda. Ligado com
YYYYMMDD f hhmm
e depois solicita o número do dia da semana; 2 e 4 são terça e quinta-feira. Redefine o globalD
para lembrar datas.Experimente online!
D←⍬
inicializeD
para ser um conjunto vazio{
...}
lambda anônima;⍺
éYYYYMMDD
,⍵
éhhmm
780-⍵
diferença entre 780 (média de 0750 e 0810) e o tempo de|
valor absoluto que30≥
é 30 maior ou igual a que?(
…)<
E não é verdade que:⍺∊D
a data é membro deD
(
…)∧
e é verdade que:⎕∊2 4
o dia da semana solicitado é um membro do conjunto {2,4}⍺/⍨
use isso para compactar a data (ou seja, dá {} se falso, {date} se true)D,←
anexa issoD
≢
e retorna sua contagem (ou seja, 0 ou 1, que são falsas e verdadeiras da APL)fonte
Fórmula do Excel, 85 bytes
=IF(AND(MID(WEEKDAY(A1)/0,684;3;1)="3";A1-INT(A1)>=0,32638;A1-INT(A1)<=0,34028);TRUE)
O dia da semana sem parâmetros é de 1 (domingo) a 7 (sábado). Os dias que queremos são 3 e 5. Dividindo todos os números de 1 a 7 para 0,648, apenas 3 e 5 dão um resultado em que a primeira casa decimal é 3 (Entendi, dividindo com rand ())
A entrada é inserida na célula A1
fonte
MID(WEEKDAY(A1)/0,29;5;1)="4"
e também em;1;)
vez de;TRUE)
Limpo ,
343326303279216 bytesLimpar é tão inadequado para isso que é como tentar pintar uma cerca com uma serra elétrica.
Experimente online!
Golfing então explicação.
fonte
R ,
114106 bytesExperimente online!
Persistência:
A data é verificada
L
, a lista de datas em que o código retornou TRUE. Quando o código retorna TRUE, a data de hoje é anexada a esta lista. Caso contrário, a lista não será modificada.Guardado 6 bytes graças a @Giuseppe!
Fez o código realmente funcionar e salvou 2 bytes graças a @digEmAll!
fonte
^
tem precedência mais alta que,%any%
mas*
tem precedência mais baixa que%any%
, portanto, usando^
você pode se livrar de alguns parênteses, e eu também joguei mais alguns! Certeza que ele funciona para 108 bytes:
vez de^
, para se divertir, e assim seu código possui um milhão:
.:
agora!C (gcc) ,
785049 bytesExperimente online!
As entradas esperadas são:
d
: a data, como um número únicoyyyymmdd
w
: o dia da semana, começando com segunda-feira (0)t
: a hora, como um número únicohhmm
Explicação
Editar% s
abs()
na verdade não estava ajudando na nova versãofonte
YYYYMMDD
ehhmm
como números únicos?w<4&w%2&t>749&t<811
vez dew<4&&w%2&&t>749&&t<811
Lote, 109 bytes
Recebe entradas no formato,
date
time
dow
por exemplo,2018-09-04 08:10 2
e saídas via código de saída. Explicação: A variável de ambientel
(ou qualquer outra letra única funcionaria) é usada para armazenar a última data bem-sucedida que passa no teste. (O formato da data em si não importa, desde que seja consistente e não contenha espaços.)fonte
Perl 6 , 33 bytes
Experimente online!
Fortemente inspirado na solução de Arnauld. Usa o mesmo formato de entrada.
fonte
C # , 121 bytes
Mover todos os três para a mesma linha reduz o tamanho para
117
bytes.h
é usado como uma propriedade, basta ler o valor antes de enviar a mensagem:fonte
F #, 119 bytes
let f w d h m l =
declarar função chamada
f
com parâmetrosw
(dia da semana)d
(data)h
(hora)m
(minuto)l
(lista de datas em que é executada)if not(l|>Seq.contains d)
se a lista de datas não contiver a data passada&&[3;5]|>Seq.contains w
e o dia é terça-feira (3) ou quarta-feira (5)&&(h=7&&m>49||h=8&&m<11)
e o tempo é entre (exclusivo) 7:49 e 8:11then(l@[d],true)
em seguida, retorne uma tupla contendo a lista de datas com a data atual anexada e trueelse(l,false)
caso contrário, retorne uma tupla contendo a lista de datas sem hoje e falsefonte
Bash
9587 bytesEditar: salvou 8 bytes roubando uma ideia do Annyo
Ligue com aaaammdd HHMM D, com D começando em 0, para segunda-feira.
Não sei bem por que tenho a verificação de contagem de linhas definida como três, parece que deve ser dois, mas dois não funcionam e três parecem funcionar.
Além disso, não me incomodei em usar a data, mas os requisitos parecem indicar que devemos aceitar a data, por isso tomei a opção mencionada para dedicar o tempo separadamente e simplesmente ignorar o valor da data.
fonte