Un robot di saluto per un collega di lavoro


14

Ho un collega al lavoro che lavora da casa ogni martedì e giovedì. Verso le 8:00 ci invia un messaggio con il seguente testo:

Ciao oggi lavoro da casa

Per sollevarlo dall'onere di farlo ogni giorno che sta a casa, vorremmo automatizzare questo compito per lui.

La sfida

Scrivi nel minor numero di byte possibile un codice che:

  • Riceve l'ora corrente: il codice può ricevere valori per l'anno corrente, il mese (1-12), il giorno del mese (1-31), l'ora (0-23) e i minuti (0-59) e il giorno della settimana (puoi scegliere se questo numero inizia da 0 o 1 e se 0/1 significa domenica, lunedì o qualsiasi altro giorno); in alternativa, è possibile ricevere una struttura come Date, DateTime, Calendaro di qualsiasi altra struttura tempo-correlata, se la lingua lo permette. yyyyMMddHHmmSe lo desideri, puoi anche ricevere una stringa con la data oppure due stringhe separate per data e ora, quindi un numero intero con il giorno della settimana. Sentiti libero.
  • Restituisce due valori di verità e falsità coerenti , indicando se il messaggio deve essere inviato o meno alla chat di lavoro.

Regole

  • Si presume che questo pezzo di codice sia invocato periodicamente. La periodicità esatta è comunque irrilevante.
  • Il valore veritiero deve essere restituito se il giorno della settimana è martedì o giovedì e l'orario è 8:00 AM con un margine di errore di 10 minuti (dalle 7:50 alle 8:10 incluso).
  • Il valore di verità deve essere inviato solo se è la prima volta che il codice viene invocato tra quelle ore per il giorno specificato. Non vogliamo che il bot invii lo stesso messaggio più volte di seguito. Il modo in cui gestisci questa restrizione dipenderà interamente da te.
  • Il tuo codice potrebbe essere un programma indipendente eseguito ripetutamente o potrebbe far parte di un codice più grande che è sempre in esecuzione. La tua scelta.
  • Si può presumere che non ci saranno riavvii tra le esecuzioni del codice.
  • Puoi presumere che la data sia sempre corretta.
  • Sono incoraggiate le spiegazioni sul codice e in particolare sul metodo utilizzato per raggiungere la persistenza.

Esempi

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

Questo è , quindi può vincere il codice più breve per ogni lingua!


Questo viene dalla sandbox .
Charlie,

C'è qualche restrizione nel formato di input? Posso prendere la data come un singolo parametro YYYYmmdde anche l'ora HHss?
Luis felipe De jesus Munoz,

1
@LuisfelipeDejesusMunoz sì, se lo desideri puoi ricevere la data e l'ora in quel formato. Ho aggiornato la domanda per chiarirlo.
Charlie,

1
@KamilDrakari il programma deve controllare la data indicata come parametro, non è possibile prendere la data corrente. In tal caso, sarà impossibile far passare il codice a una batteria di prova come quella che propongo nella domanda.
Charlie,

2
Quindi, esegui regolarmente il polling di uno script per essere utile al massimo una volta al giorno, 2/7 dei giorni? Se automatizzi tutti i tuoi compiti in quel modo ...
Mast

Risposte:


15

JavaScript (ES6), 43 byte

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

Provalo online!

Ingresso

  • la data come una stringa in yyyymmddformato
  • l'ora come una stringa in hhmmformato
  • il giorno della settimana come numero intero indicizzato 0, con 0= martedì, 1= mercoledì, ..., 6= lunedì

Produzione

Restituisce 0o 1.

Commentate

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

7
Javascript (e la tua padronanza) mi stupirà sempre.
Charlie,

1
ES6 è divertente giocare a golf :) Il secondo formato di input è valido?
Arnauld,

Sì, l'ho già specificato nel testo della domanda.
Charlie,

5

Python 3 , 69 byte

f=lambda w,r,*t,l={0}:r not in l!=w in(2,4)<(7,49)<t<(8,11)!=l.add(r)

Provalo online!

Accetta input come f(day of the week, date, hours, minutes), dove la data può essere in qualsiasi formato coerente.


5

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

Infografica anonima lambda. Chiamato con YYYYMMDD f hhmme quindi richiede il numero del giorno della settimana; 2 e 4 sono martedì e giovedì. Ridefinisce il globale Dper ricordare le date.

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

Provalo online!

D←⍬ inizializzare D per essere un set vuoto

{... } lambda anonimo; è YYYYMMDD, è la hhmm
780-⍵ differenza tra 780 (media di 0750 e 0810) e il
| valore assoluto del tempo
30≥ è 30 maggiore o uguale a quello?
(... )< e non è vero che:
  ⍺∊D la data è un membro di D
(... )∧ ed è vero che:
  ⎕∊2 4 il prompt per il giorno della settimana è un membro dell'insieme {2,4}
⍺/⍨ usa quello per comprimere la data (cioè dà {} se falso, {data} se vero)
D,← aggiungilo a D
 e restituisce il suo conteggio (cioè 0 o 1, che sono falso e vero di APL)


4

Formula di Excel, 85 byte

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

Il giorno della settimana senza parametri va da 1 (domenica) a 7 (sabato). I giorni che vogliamo sono 3 e 5. Dividendo tutti i numeri da 1 a 7 per 0,648, solo 3 e 5 danno un risultato in cui il primo decimale è 3 (Capito dividendo con rand ())

L'ingresso è inserito nella cella A1


È possibile utilizzare MID(WEEKDAY(A1)/0,29;5;1)="4"e anche ;1;)invece di;TRUE)
adebunk il

4

Pulito , 343 326 303 279 216 byte

Clean è così inadatto a questo che è come cercare di dipingere una recinzione con una motosega.

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

Provalo online!

Golf quindi spiegazione.


1
+1 Solo per dipingere una recinzione con un riferimento a motosega! : D
Perpetual J

4

R , 114 106 byte

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

Provalo online!

Persistenza:

La data è verificata rispetto L all'elenco di date in cui il codice ha restituito VERO. Quando il codice restituisce VERO, la data odierna viene aggiunta a questo elenco. Altrimenti l'elenco non viene modificato.

6 byte salvati grazie a @Giuseppe!

Ha reso il codice effettivamente funzionante e salvato 2 byte grazie a @digEmAll!


Questo metodo richiede l'ora corrente invece di riceverla come parametro, vero?
Charlie,

@Charlie sembra che avrei dovuto leggere la sfida con più attenzione ... mi avrebbe semplificato la vita! Aggiornerò.
JayCe,

^ha una precedenza più alta di %any%ma *ha una precedenza più bassa di %any%, quindi usando ^puoi sbarazzarti di alcune parentesi, e ne ho giocate anche altre! Abbastanza sicuro che funzioni per 108 byte
Giuseppe,

1
Puoi anche usarlo al :posto di ^, per divertirti, e quindi il tuo codice ne contiene un milione :.
Giuseppe,

@Giuseppe Ha un sacco di :ora!
JayCe,

3

C (gcc) ,  78   50  49 byte

D;f(d,w,t){w=d-D&&w<4&&w%2&&t>749&&t<811&&(D=d);}

Provalo online!

Gli input previsti sono:

  • d: la data, come un singolo numero yyyymmdd
  • w: il giorno della settimana, a partire da lunedì (0)
  • t: l'ora, come un singolo numero hhmm

Spiegazione

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
}

Le modifiche

  • Risparmiato 28 byte grazie ad Adám
  • Salvato 1 byte in più, poiché in abs()realtà non ha aiutato con la nuova versione

1
Perché non prendere YYYYMMDDe hhmmcome numeri singoli?
Adám,

@Adám In effetti ... Ci proverò quando avrò del tempo
Annyo,

Suggerisci w<4&w%2&t>749&t<811invece diw<4&&w%2&&t>749&&t<811
ceilingcat il

2

Lotto, 109 byte

@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

Accetta input nel formato date time dowes. 2018-09-04 08:10 2E output tramite il codice di uscita. Spiegazione: La variabile di ambiente l(o qualsiasi altra lettera singola funzionerebbe) viene utilizzata per memorizzare l'ultima data corretta che ha superato il test. (Il formato della data stesso non ha importanza finché è coerente e non contiene spazi.)



1

C # , 121 byte

int[] d=new int[]{2,4};
double s=>Now.TimeOfDay.TotalSeconds;
bool h=>d.Contains((int)Now.DayOfWeek)&&s>=470&&s<=490;

Spostando tutti e tre sulla stessa riga si riducono le dimensioni in 117byte. hviene utilizzato come proprietà, basta leggere il valore prima di inviare il messaggio:

if (h) SendMessage();

1

F #, 119 byte

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 =

dichiarare la funzione chiamata fcon parametri w(giorno della settimana) d(data) h(ora) m(minuti) l(elenco di date in cui viene eseguito)

if not(l|>Seq.contains d) se l'elenco delle date non contiene la data passata

&&[3;5]|>Seq.contains w e il giorno è martedì (3) o mercoledì (5)

&&(h=7&&m>49||h=8&&m<11) e il tempo è tra (esclusivo) 7:49 e 8:11

then(l@[d],true) quindi restituisce una tupla contenente l'elenco di date con la data corrente aggiunta e vera

else(l,false) else restituisce una tupla contenente l'elenco di date senza oggi e false


0

Bash 95 87 byte

[ $(ps -ef|grep $0|wc -l) -gt 3 -o $2 -lt 750 -o $2 -gt 810 ]||((10>>$3&1))&&sleep 20m

Modifica: salvato 8 byte rubando un'idea da Annyo

Chiama con yyyymmdd HHMM D, con D a partire da 0, per lunedì.

Non sono del tutto sicuro del perché il controllo del conteggio delle righe sia impostato su tre, sembra che dovrebbero essere due, ma due non funzionano e tre sembrano funzionare.

Inoltre, non mi sono preoccupato di usare la data, ma i requisiti sembrano indicare che dovremmo accettare la data, quindi ho preso l'opzione menzionata per prendere il tempo separatamente e semplicemente ignorare il valore della data.


Se non si utilizza la data, come si fa a verificare di non inviare due volte il messaggio per lo stesso giorno?
Charlie,

Rimane in funzione per 20 minuti e il primo controllo assicura che non ci sia una copia esistente in esecuzione
crystalgecko
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.