Mam w pracy kolegę, który pracuje z domu w każdy wtorek i czwartek. Około 8:00 wysyła nam wiadomość z następującym tekstem:
Witam dzisiaj Pracuję z domu
Aby uwolnić go od ciężaru wykonywania codziennych czynności w domu, chcielibyśmy zautomatyzować to zadanie.
Wyzwanie
Wpisz jak najmniej bajtów fragmentu kodu, który:
- Odbiera bieżącą godzinę: Twój kod może odbierać wartości dla bieżącego roku, miesiąca (1-12), dnia miesiąca (1-31), godziny (0-23) i minuty (0-59) oraz dnia tygodnia (możesz wybrać, czy ten numer zaczyna się od 0 czy 1, a jeśli 0/1 oznacza niedzielę, poniedziałek lub inny dzień); alternatywnie można otrzymać struktury takie jak
Date
,DateTime
,Calendar
lub jakakolwiek inna struktura czasu powiązanymi, jeżeli język na to pozwala. Możesz również otrzymać ciąg z datą,yyyyMMddHHmm
jeśli chcesz, lub dwa osobne ciągi dla daty i godziny, a następnie liczbę całkowitą z dniem tygodnia. Nie krępuj się. - Zwraca dwie spójne wartości true i falsey , wskazując, czy wiadomość musi zostać wysłana do czatu roboczego, czy nie.
Zasady
- Zakłada się, że ten fragment kodu jest okresowo wywoływany. Dokładna okresowość nie ma jednak znaczenia.
- Prawdziwa wartość musi zostać zwrócona, jeśli dniem tygodnia jest wtorek lub czwartek, a godzina 8:00 z marginesem błędu wynoszącym 10 minut (od 7:50 do 8:10 włącznie).
- Prawdziwa wartość musi zostać wysłana tylko wtedy, gdy kod jest wywoływany po raz pierwszy między tymi godzinami dla określonego dnia. Nie chcemy, aby bot wysyłał tę samą wiadomość kilka razy z rzędu. Sposób zarządzania tym ograniczeniem zależy wyłącznie od Ciebie.
- Twój kod może być niezależnym programem wykonywanym wielokrotnie lub może być częścią większego kodu, który zawsze działa. Twój wybór.
- Możesz założyć, że między uruchomieniami kodu nie będzie restartów.
- Możesz założyć, że data będzie zawsze poprawna.
- Zalecane są objaśnienia dotyczące Twojego kodu, a zwłaszcza metody zastosowanej do uzyskania trwałości.
Przykłady
(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)
To jest golf golfowy , więc wygra najkrótszy kod dla każdego języka!
code-golf
decision-problem
date
stateful
Charlie
źródło
źródło
YYYYmmdd
również godzinęHHss
?Odpowiedzi:
JavaScript (ES6), 43 bajty
Wypróbuj online!
Wejście
yyyymmdd
formaciehhmm
formacie0
= wtorek,1
= środa, ...,6
= poniedziałekWynik
Zwraca
0
lub1
.Skomentował
źródło
Python 3 , 69 bajtów
Wypróbuj online!
Pobiera dane wejściowe jako
f(day of the week, date, hours, minutes)
, gdzie data może być w dowolnym spójnym formacie.źródło
APL (Dyalog Unicode) ,
615350483736 bajtów SBCSAnonimowy przyrostek lambda. Zadzwoniono z,
YYYYMMDD f hhmm
a następnie monituje o numer dnia tygodnia; 2 i 4 to wtorek i czwartek. Na nowo definiuje globalne,D
aby zapamiętać daty.Wypróbuj online!
D←⍬
zainicjowaćD
aby być pustym zestawem{
…}
Anonimowa lambda;⍺
jestYYYYMMDD
,⍵
tohhmm
780-⍵
różnica pomiędzy 780 (średnia z 0750 i 0810), a w czasie|
wartość ta bezwzględna30≥
jest większa lub równa 30 do?(
…)<
I nie jest prawdą, że:⍺∊D
data jest członkiemD
(
…)∧
i prawdą jest, że:⎕∊2 4
monitowany o dzień tygodnia jest członkiem zestawu {2,4}⍺/⍨
używającego tego do kompresji daty (tzn. Daje {} jeśli fałsz, {date} jeśli prawda)D,←
dołącz toD
≢
i zwróć jej sumę (tj. 0 lub 1, które są fałszem i prawdą APL-a)źródło
Formuła Excel, 85 bajtów
=IF(AND(MID(WEEKDAY(A1)/0,684;3;1)="3";A1-INT(A1)>=0,32638;A1-INT(A1)<=0,34028);TRUE)
Dzień tygodnia bez parametrów to od 1 (niedziela) do 7 (sobota). Potrzebne dni to 3 i 5. Dzieląc wszystkie liczby od 1 do 7 dla 0,648, tylko 3 i 5 daje wynik, w którym pierwsza liczba dziesiętna to 3 (Zdobądź to, dzieląc za pomocą rand ())
Dane wejściowe są wstawiane do komórki A1
źródło
MID(WEEKDAY(A1)/0,29;5;1)="4"
a także;1;)
zamiast;TRUE)
Czysty ,
343326303279216 bajtówClean jest do tego nieodpowiedni, to tak, jakby próbować pomalować płot piłą łańcuchową.
Wypróbuj online!
Gra w golfa, a następnie wyjaśnienie.
źródło
R ,
114106 bajtówWypróbuj online!
Trwałość:
Data jest porównywana z
L
listą dat, w których kod zwrócił wartość PRAWDA. Gdy kod zwraca wartość PRAWDA, dzisiejsza data jest dołączana do tej listy. W przeciwnym razie lista nie zostanie zmodyfikowana.Zaoszczędź 6 bajtów dzięki @Giuseppe!
Sprawił, że kod faktycznie działał i zaoszczędził 2 bajty dzięki @digEmAll!
źródło
^
ma wyższy priorytet niż,%any%
ale*
ma niższy priorytet%any%
, więc używając^
możesz pozbyć się nawiasów, a ja też grałem w golfa jeszcze trochę! Całkiem pewne, że działa dla 108 bajtów:
zamiast^
, dla zabawy, a więc twój kod zawiera milion:
.:
teraz mnóstwo !C (gcc) ,
785049 bajtówWypróbuj online!
Oczekiwane dane wejściowe to:
d
: data, jako pojedynczy numeryyyymmdd
w
: dzień tygodnia, począwszy od poniedziałku (0)t
: czas jako pojedynczy numerhhmm
Wyjaśnienie
Edycje
abs()
tak naprawdę nie pomagał w nowej wersjiźródło
YYYYMMDD
ihhmm
jako pojedyncze liczby?w<4&w%2&t>749&t<811
zamiastw<4&&w%2&&t>749&&t<811
Partia, 109 bajtów
Pobiera dane wejściowe w postaci
date
time
dow
np.2018-09-04 08:10 2
I dane wyjściowe za pomocą kodu wyjścia. Objaśnienie: Zmienna środowiskowal
(lub dowolna inna pojedyncza litera będzie działać) służy do przechowywania ostatniej pomyślnej daty, która pozytywnie przejdzie test. (Sam format daty nie ma znaczenia, dopóki jest spójny i nie zawiera spacji.)źródło
Perl 6 , 33 bajtów
Wypróbuj online!
Mocno zainspirowany rozwiązaniem Arnaulda. Używa tego samego formatu wejściowego.
źródło
C # , 121 bajtów
Przeniesienie wszystkich trzech do tej samej linii zmniejsza rozmiar do
117
bajtów.h
jest używany jako właściwość, po prostu przeczytaj wartość przed wysłaniem wiadomości:źródło
F #, 119 bajtów
let f w d h m l =
deklaruj wywołaną funkcję
f
z parametramiw
(dzień tygodnia)d
(data)h
(godzina)m
(minuta)l
(lista dat, w których jest uruchamiana)if not(l|>Seq.contains d)
jeśli lista dat nie zawiera daty minionej&&[3;5]|>Seq.contains w
a dzień to wtorek (3) lub środa (5)&&(h=7&&m>49||h=8&&m<11)
a czas jest pomiędzy (wyłączny) 7:49 a 8:11then(l@[d],true)
następnie zwróć krotkę zawierającą listę dat z dołączoną bieżącą datą i trueelse(l,false)
w przeciwnym razie zwróć krotkę zawierającą listę dat bez dzisiaj i fałszźródło
Bash
9587 bajtówEdycja: zapisano 8 bajtów poprzez kradzież pomysłu od Annyo
Zadzwoń do HYMM D rrrrmmdd, z D rozpoczynającym się od 0, w poniedziałek.
Nie jestem do końca pewien, dlaczego ustawiłem sprawdzanie liczby wierszy na trzy, wydaje się, że powinny być dwa, ale dwa nie działają, a trzy działają.
Poza tym nie zawracałem sobie głowy użyciem daty, ale wymagania wydają się wskazywać, że powinniśmy zaakceptować datę, więc wybrałem wspomnianą opcję, aby wziąć czas osobno i po prostu zignorować wartość daty.
źródło