下班同事的问候机器人


14

我有一个同事在工作,每个星期二和星期四在家工作。在大约8:00 AM,他向我们发送了以下消息:

你好,今天我在家工作

为了减轻他每天待在家里的负担,我们希望为他自动化此任务。

挑战

编写尽可能少的字节的一段代码:

  • 接收当前时间:您的代码可能会接收当前年,月(1-12),月(1-31),小时(0-23)和分钟(0-59)以及星期几的值(您可以选择此数字是从0还是1开始,如果0/1表示星期日,星期一或其他任何一天);另外,您可能会收到一个结构,如DateDateTimeCalendar或者任何其他时间相关的结构,如果你的语言允许它。yyyyMMddHHmm如果需要,您还可以接收带有日期的字符串,或者包含两个单独的日期和时间字符串,然后是带有星期几的整数。随便吧。
  • 返回两个一致的真实错误值,指示是否必须将消息发送到工作聊天室。

规则

  • 假定这段代码是定期调用的。尽管如此,确切的周期是无关紧要的。
  • 如果星期几是星期二或星期四,时间是8:00 AM,错误余量为10分钟(包括7:50至8:10),则必须返回真实值。
  • 只有在指定日期的这些小时之间第一次调用代码时,才必须发送真实值。我们不希望机器人连续发送多次相同的消息。您管理此限制的方式完全取决于您。
  • 您的代码可能是重复执行的独立程序,也可能是始终运行的较大代码的一部分。你的选择。
  • 您可以假设在执行代码之间不会重新启动。
  • 您可能会认为日期永远是正确的。
  • 鼓励对代码进行解释,尤其是对用于实现持久性的方法的解释。

例子

(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
路易斯·费利佩·德·耶稣·穆诺兹

1
@LuisfelipeDejesusMunoz是的,如果您愿意,可以使用该格式接收日期和时间。我已经更新了这个问题,以使其清楚。
查理

1
@KamilDrakari程序必须检查作为参数给出的日期,您不能采用当前日期。如果这样做,将不可能使代码像我在问题中建议的那样通过测试电池。
查理

2
因此,您要定期轮询脚本以每天最多2/7天最多使用一次?如果您像这样自动化所有任务……
Mast

Answers:


15

JavaScript(ES6),43个字节

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

在线尝试!

输入值

  • 日期yyyymmdd格式为字符串
  • 时间以字符串hhmm形式显示
  • 星期几,为0索引的整数,其中0= =星期二,1=星期三,...,6=星期一

输出量

返回01

已评论

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(以及您对Java的精通)将永远令我惊讶。
查理

1
ES6很有趣::)第二输入格式有效吗?
Arnauld

是的,我已经在问题文本中指出了这一点。
查理

5

Python 3,69个字节

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

在线尝试!

将输入作为f(day of the week, date, hours, minutes),其中日期可以是任何一致的格式。


5

APL(Dyalog Unicode)61 53 50 48 37 36 字节SBCS

匿名中缀lambda。致电,YYYYMMDD f hhmm然后提示输入工作日号码;2和4是星期二和星期四。重新定义全局D记忆日期。

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

在线尝试!

D←⍬ 初始化D为空集

{} 匿名lambda;YYYYMMDDhhmm
780-⍵ 780之间的差异(平均值为0750和0810)和时间
| 的该绝对值
30≥ 是30大于或等于该?
(...... )< ,这是不正确的:
  ⍺∊D 日期是成员D
(...... )∧ 而这是事实:
  ⎕∊2 4 在提示平日是集合{2,4}的成员
⍺/⍨ 使用该压缩的日期(即给出{}如有虚假, {date}(如果为true)
D,← ,则将D
 其附加并返回其计数(即0或1,这是APL的false和true)


4

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

4

干净343个 326 303 279 216字节

清洁不适用于此,就像试图用电锯在篱笆上油漆一样。

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

在线尝试!

打高尔夫球然后解释。


1
+1仅用于绘画以电锯为参考的篱笆!:D
永久性J

4

R114106字节

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

在线尝试!

持续性:

根据日期检查L日期,代码返回TRUE的日期列表。当代码返回TRUE时,今天的日期将附加到此列表中。否则,列表不会被修改。

@Giuseppe节省了6个字节!

通过@digEmAll,使代码实际工作并节省了2个字节!


此方法使用当前时间而不是将其作为参数接收,不是吗?
查理

@Charlie看起来我应该更仔细地阅读挑战...会让我的生活更轻松!我会更新。
JayCe

^具有比更高的优先级,%any%*具有比更低的优先级%any%,因此使用^可以消除一些括号,我也打了几下!可以肯定的是它可以处理108个字节
Giuseppe

1
您也可以使用:代替^,因为它很有趣,因此您的代码中有一百万:
朱塞佩

@Giuseppe现在确实有很多:
JayCe

3

C(gcc) 78   50  49字节

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

在线尝试!

预期的输入是:

  • d:日期,为单个数字 yyyymmdd
  • w:星期几,从星期一(0)开始
  • t:时间,以单个数字表示 hhmm

说明

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
}

编辑

  • 感谢Adám,节省了28个字节
  • 节省了1个字节,因为abs()实际上对新版本没有帮助

1
为什么不将YYYYMMDDhhmm作为一个数字?
亚当

@Adám确实...我会在有空的时候尝试一下
Annyo,

建议w<4&w%2&t>749&t<811而不是w<4&&w%2&&t>749&&t<811
ceilingcat '18

2

批次,109个字节

@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

以形式输入,date time dow例如2018-09-04 08:10 2通过退出代码输出。说明:环境变量l(或任何其他单个字母均可使用)用于存储通过测试的最后成功日期。(日期格式本身并不重要,只要它是一致的并且不包含空格即可。)



1

C#,121字节

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

将所有三个移动到同一行可将大小减小为117字节。h用作属性,只需在发送消息之前读取值:

if (h) SendMessage();

1

F#,119个字节

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 =

声明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:11之间

then(l@[d],true) 然后返回一个包含日期列表的元组,并附加当前日期,然后返回true

else(l,false) 否则返回一个包含日期列表的元组,其中不包含今天和false


0

重击95 87字节

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

编辑:通过窃取Annyo的想法保存了8个字节

周一致电yyyymmdd HHMM D,D从0开始。

我不完全确定为什么将行计数检查设置为3,似乎应该为2,但是2无效,而3似乎有效。

另外,我也没有使用日期,但要求似乎表明我们应该接受日期,因此我选择了上述选项,将时间分开,而忽略日期值。


如果您不使用日期,如何检查同一天没有两次发送消息?
查理

它会停留20分钟,并且首先检查以确保没有现有的副本在运行
crystalgecko
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.