У меня есть коллега на работе, который работает дома каждый вторник и четверг. Около 8:00 утра он отправляет нам сообщение со следующим текстом:
Привет сегодня работаю из дома
Чтобы избавить его от бремени делать это каждый день, когда он остается дома, мы хотели бы автоматизировать эту задачу для него.
Соревнование
Запишите как можно меньше байт кода, который:
- Получает текущее время: ваш код может получать значения для текущего года, месяца (1-12), дня месяца (1-31), часа (0-23) и минуты (0-59) и дня недели. (вы можете выбрать, будет ли этот номер начинаться с 0 или 1, и если 0/1 означает воскресенье, понедельник или любой другой день); в качестве альтернативы вы можете получить структуру , такую как
Date
,DateTime
,Calendar
или в любое другое время , связанной структурой, если ваш язык позволяет. Вы также можете получить строку с датой в,yyyyMMddHHmm
если хотите, или две отдельные строки для даты и времени, а затем целое число с днем недели. Не стесняйтесь. - Возвращает два непротиворечивых значения true и falsey , указывающие, нужно ли отправлять сообщение в рабочий чат или нет.
правила
- Предполагается, что этот фрагмент кода вызывается периодически. Тем не менее точная периодичность не имеет значения.
- Истинное значение должно быть возвращено, если днем недели является вторник или четверг, а время - 8:00 с погрешностью 10 минут (с 7:50 до 8:10 включительно).
- Значение truey должно быть отправлено только в том случае, если код впервые вызывается между этими часами для указанного дня. Мы не хотим, чтобы бот отправлял одно и то же сообщение несколько раз подряд. То, как вы справитесь с этим ограничением, будет зависеть только от вас.
- Ваш код может быть независимой программой, выполняемой повторно, или он может быть частью большого кода, который всегда выполняется. Твой выбор.
- Вы можете предположить, что между выполнениями кода перезагрузок не будет.
- Вы можете предположить, что дата всегда будет правильной.
- Пояснения о вашем коде и особенно о методе, используемом для достижения постоянства, приветствуются.
Примеры
(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)
Это код-гольф , поэтому может выиграть самый короткий код для каждого языка!
YYYYmmdd
и времяHHss
?Ответы:
JavaScript (ES6), 43 байта
Попробуйте онлайн!
вход
yyyymmdd
форматеhhmm
формате0
= вторник,1
= среда, ...,6
= понедельникВыход
Возвращает
0
или1
.комментарии
источник
Python 3 , 69 байт
Попробуйте онлайн!
Принимает данные как
f(day of the week, date, hours, minutes)
, где дата может быть в любом согласованном формате.источник
APL (Dyalog Unicode) ,
615350483736 байт SBCSАнонимный инфикс лямбда. Вызывается
YYYYMMDD f hhmm
и затем запрашивает номер дня недели; 2 и 4 вторник и четверг. Переопределяет глобальные,D
чтобы запомнить даты.Попробуйте онлайн!
D←⍬
инициализировать,D
чтобы быть пустым набором{
...}
анонимная лямбда;⍺
этоYYYYMMDD
,⍵
этоhhmm
780-⍵
разница между 780 (среднее значение из 0750 и 0810) , а время|
абсолютное значение , что30≥
является 30 больше или равно , что?(
...)<
и это не так:⍺∊D
дата является членомD
(
...)∧
и это правда, что:⎕∊2 4
запрос дня недели является членом набора {2,4}, который⍺/⍨
используется для сжатия даты (т. Е. Дает {}, если ложно, {date}, если true)D,←
добавить этоD
≢
и вернуть его счет (то есть 0 или 1, которые являются ложными и истинными для APL)источник
Формула Excel, 85 байт
=IF(AND(MID(WEEKDAY(A1)/0,684;3;1)="3";A1-INT(A1)>=0,32638;A1-INT(A1)<=0,34028);TRUE)
День недели без параметров: от 1 (воскресенье) до 7 (суббота). Дни, которые мы хотим, - это 3 и 5. Разделив все числа от 1 до 7 на 0 648, только 3 и 5 дают результат, где первое десятичное число равно 3 (Получилось делением с помощью rand ())
Вход вставлен в ячейку A1
источник
MID(WEEKDAY(A1)/0,29;5;1)="4"
а также;1;)
вместо;TRUE)
Чистый ,
343326303279216 байтЧистота настолько плохо подходит для этого, что это все равно что пытаться нарисовать забор бензопилой.
Попробуйте онлайн!
Гольф тогда объяснение.
источник
R ,
114106 байтПопробуйте онлайн!
Упорство:
Дата сверяется с
L
списком дат, где код вернул TRUE. Когда код возвращает TRUE, сегодняшняя дата добавляется в этот список. В противном случае список не изменяется.Сохранено 6 байтов благодаря @Giuseppe!
Сделал код на самом деле работать и сэкономил 2 байта благодаря @digEmAll!
источник
^
имеет более высокий приоритет, чем,%any%
но*
имеет более низкий приоритет, чем%any%
, поэтому с помощью^
вы можете избавиться от некоторых круглых скобок, и я также проиграл несколько больше! Уверен, что он работает на 108 байтов:
вместо этого^
, для удовольствия, и поэтому ваш код содержит миллион:
.:
сейчас!C (gcc) ,
785049 байтовПопробуйте онлайн!
Ожидаемые входные данные:
d
: дата, как одно числоyyyymmdd
w
: день недели, начиная с понедельника (0)t
: время, как одно числоhhmm
объяснение
Правки
abs()
как фактически не помогло с новой версиейисточник
YYYYMMDD
иhhmm
как отдельные цифры?w<4&w%2&t>749&t<811
вместоw<4&&w%2&&t>749&&t<811
Пакетный, 109 байтов
Принимает ввод в форме,
date
time
dow
например,2018-09-04 08:10 2
и выводит через код выхода. Объяснение: Переменная средыl
(или любая другая отдельная буква будет работать) используется для хранения последней успешной даты, прошедшей тест. (Сам формат даты не имеет значения, если он согласован и не содержит пробелов.)источник
Perl 6 , 33 байта
Попробуйте онлайн!
Сильно вдохновлен решением Арно. Использует тот же формат ввода.
источник
C # , 121 байт
Перемещение всех трех строк в одну строку уменьшает размер до
117
байтов.h
используется как свойство, просто прочитайте значение перед отправкой сообщения:источник
F #, 119 байт
let f w d h m l =
объявить функцию, вызываемую
f
с параметрамиw
(день недели)d
(дата)h
(час)m
(минута)l
(список дат, в которые она запускается)if not(l|>Seq.contains d)
если список дат не содержит пройденную дату&&[3;5]|>Seq.contains w
а вторник (3) или среда (5)&&(h=7&&m>49||h=8&&m<11)
и время между (эксклюзивно) 7:49 и 8:11then(l@[d],true)
затем вернуть кортеж, содержащий список дат с добавленной текущей датой, и trueelse(l,false)
иначе вернуть кортеж, содержащий список дат без сегодняшнего дня и falseисточник
Bash
9587 байтРедактировать: сэкономил 8 байт, украдя идею от Annyo
Звоните с ггггммдд ЧЧММ D, с D, начиная с 0, на понедельник.
Я не совсем уверен, почему для проверки количества строк установлено значение три, кажется, что должно быть два, но два не работает, а три, кажется, работает.
Кроме того, я не удосужился использовать дату, но требования, по-видимому, указывают на то, что мы должны принять дату, поэтому я выбрал упомянутый вариант, чтобы взять время отдельно и просто игнорировать значение даты.
источник