직장 동료를위한 인사 봇


14

매주 화요일과 목요일마다 집에서 일하는 동료가 있습니다. 오전 8 시경 그는 다음과 같은 내용의 메시지를 우리에게 보냅니다.

안녕하세요 오늘 집에서 일 해요

그가 집에 머무르는 매일 이렇게하는 부담에서 그를 구호하기 위해, 우리는 그를 위해이 일을 자동화하고 싶습니다.

도전

가능한 한 적은 바이트로 다음과 같은 코드를 작성하십시오.

  • 현재 시간 수신 : 코드에서 현재 연도, 월 (1-12), 월 (1-31), 시간 (0-23) 및 분 (0-59) 및 요일에 대한 값을 수신 할 수 있습니다. (이 숫자는 0에서 시작하는지, 1에서 시작하는지, 0/1이 일요일, 월요일 또는 다른 요일을 선택할 경우)을 선택할 수 있습니다. 또는 당신은 같은 구조를 수신 할 수있다 Date, DateTime, Calendar또는 기타 시간 관련 구조, 언어가 허용하는 경우. yyyyMMddHHmm원하는 경우 날짜가 포함 된 문자열을 받거나 날짜와 시간에 대해 두 개의 개별 문자열을받은 다음 요일이있는 정수를받을 수도 있습니다. 부담없이
  • 메시지를 작업 채팅으로 보내야하는지 여부를 나타내는 두 개의 일관된 진실거짓 값을 리턴 합니다.

규칙

  • 이 코드는 주기적으로 호출되는 것으로 가정합니다. 그럼에도 불구하고 정확한 주기성은 관계가 없습니다.
  • 요일이 화요일이나 목요일이고 시간이 오전 8시이면 오류 마진이 10 분 (7시 50 분에서 8시 10 분까지)으로 true 값을 반환해야합니다.
  • 지정된 날짜에 해당 시간 사이에 코드를 처음 호출 한 경우에만 정확한 값을 보내야합니다. 우리는 봇이 같은 메시지를 여러 번 연속해서 보내지 않기를 원합니다. 이 제한을 관리하는 방법은 전적으로 귀하에게 달려 있습니다.
  • 코드는 독립적으로 반복적으로 실행되는 프로그램이거나 항상 실행되는 더 큰 코드의 일부일 수 있습니다. 당신의 선택.
  • 코드 실행간에 재부팅이 없다고 가정 할 수 있습니다.
  • 날짜가 항상 정확하다고 가정 할 수 있습니다.
  • 코드와 지속성을 달성하는 데 사용되는 방법에 대한 설명이 권장됩니다.

(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?
Luis felipe De jesus Munoz

1
@LuisfelipeDejesusMunoz 예, 원하는 경우 해당 형식으로 날짜와 시간을받을 수 있습니다. 나는 그것을 명확히하기 위해 질문을 업데이트했습니다.
Charlie

1
@KamilDrakari 프로그램은 매개 변수로 주어진 날짜를 확인해야합니다, 당신은 현재 날짜를 취할 수 없습니다. 그렇게하면 코드가 문제에서 제안한 것과 같은 테스트 배터리를 통과시키는 것이 불가능합니다.
찰리

2
따라서 하루에 2/7 일 하루에 한 번 유용하도록 스크립트를 정기적으로 폴링하고 있습니까? 당신이 그런 모든 작업을 자동화한다면 ...
마스트

답변:


15

자바 스크립트 (ES6), 43 바이트

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

온라인으로 사용해보십시오!

입력

  • yyyymmdd형식 의 문자열로서의 날짜
  • hhmm형식 의 문자열로서의 시간
  • 0= 화요일, 1= 수요일, ..., 6= 월요일 을 포함한 0 인덱스 정수로서의 요일

산출

반환 0또는 1.

댓글

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
자바 스크립트 (그리고 당신의 숙달)는 항상 나를 놀라게 할 것입니다.
Charlie

1
ES6은 다음과 함께 골프를 치는 재미가 있습니다. :) 두 번째 입력 형식이 유효합니까?
Arnauld

예, 질문의 텍스트에 이미 지정했습니다.
Charlie


5

APL (Dyalog Unicode) , 61 53 50 48 37 36 바이트 SBCS

익명의 람다. 로 전화 YYYYMMDD f hhmm를 걸어 주중 전화 번호를 묻습니다. 2와 4는 화요일과 목요일입니다. D날짜를 기억하기 위해 세계 를 재정의합니다 .

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

온라인으로 사용해보십시오!

D←⍬D빈 세트로  초기화

{} 익명의 람다; 이고 YYYYMMDD, 이다 hhmm
780-⍵ (780) 간의 차이는 (0750 및 0810의 평균)과 시간
| 그 절대 값이
30≥ 30 이상을 또는 그 동등?
(... )< : 사실 아닌
  ⍺∊D 날짜가 구성원 인 D
(... )∧ : 사실이다
  ⎕∊2 4 평일를 입력하라는 메시지가 세트 {2,4}의 구성원
⍺/⍨ , 거짓 경우 즉, {} 제공 (날짜를 압축하는 것을 사용 {date}이면 true로
D,← 추가 D
 하고 Tally를 반환합니다 (예 : APL의 false 및 true 인 0 또는 1).


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입니다. 0,648에 대해 1에서 7까지의 모든 숫자를 나누면 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
Emma-PerpetualJ

4

R , 114106 바이트

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

@Charlie는 II가 도전을 더주의 깊게 읽었어야한다고 생각한다. 업데이트하겠습니다.
JayCe

^보다 높은 우선 순위를 가지고 %any%있지만, *보다 낮은 우선 순위를 가지고 %any%, 그래서 사용하는 ^일부 괄호를 제거 얻을 수 있고, 나도 더 아래로 몇 golfed! 108 바이트에서
Giuseppe

1
:대신 ^재미 대신에을 사용할 수 있으므로 코드에 백만 개가 :있습니다.
주세페

@ 주세페 그것은 :지금 의 톤이 없습니다 !
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 바이트 절약
  • abs()실제로 새 버전을 지원하지 않았기 때문에 1 바이트를 더 절약했습니다.

1
왜하지 YYYYMMDDhhmm하나의 번호와 같은?
Adám

@ Adám Indeed ... 시간이 좀
남으면 해보도록하겠습니다

w<4&w%2&t>749&t<811대신 추천w<4&&w%2&&t>749&&t<811
천장 고양이

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) 그렇지 않으면 오늘이없고 날짜가없는 날짜 목록이 포함 된 튜플을 반환합니다.


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.