仕事仲間からの挨拶ボット


14

毎週火曜日と木曜日に自宅で仕事をしている同僚がいます。午前8:00頃、彼は次のテキストを含むメッセージを送信します。

こんにちは今日は自宅で仕事をしています

彼が毎日家にいるという負担から彼を解放するために、私たちは彼のためにこの仕事を自動化したいと思います。

チャレンジ

次のようなコードをできるだけ少ないバイトで記述します。

  • 現在の時刻を受け取る:コードは、現在の年、月(1〜12)、日(1〜31)、時間(0〜23)、分(0〜59)、および曜日の値を受け取ることができます。 (この番号が0から始まるか1から始まるかを選択できます。0/ 1が日曜日、月曜日、またはその他の日を意味する場合)。代わりに次のような構造を受け取ることがDateDateTimeCalendarまたは他の時間関連の構造は、あなたの言語がそれを許可している場合。yyyyMMddHHmm必要に応じて日付を含む文字列、または日付と時刻の2つの個別の文字列、および曜日を含む整数を受け取ることもできます。お気軽に。
  • メッセージを仕事のチャットに送信する必要があるかどうかを示す、2つの一貫した真実偽の値を返します。

ルール

  • このコードは定期的に呼び出されると想定されています。それにもかかわらず、正確な周期性は無関係です。
  • 曜日が火曜日または木曜日で、時刻が午前8時でエラーマージンが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
それでは、スクリプトを定期的にポーリングして、最大でも1日に1回、2/7日に役立つでしょうか?そのようなすべてのタスクを自動化する場合
マスト

回答:


15

JavaScript(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
Javascript(およびその使いやすさ)は常に私を驚かせるでしょう。
チャーリー

1
ES6はゴルフを楽しむのに最適です:) 2番目の入力形式は有効ですか?
アーナルド

はい、質問の本文で既に指定しています。
チャーリー


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}セットのメンバーである(すなわち、falseの場合{}を与える、 {date} trueの場合)
D,← それをD
 その集計に追加して返します(つまり、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です。1から7までのすべての数値を0,648で除算すると、最初の小数が3である結果は3と5だけになります(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

R114 106バイト

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 looks IIはチャレンジをもっと注意深く読むべきだった...私の人生を楽にしてくれただろう!更新します。
JayCe

^より高い優先順位を持っている%any%が、*より低い優先順位を持っている%any%ので、使用して^あなたには、いくつかの括弧を取り除くことができ、そして私も、より多くのダウン数をgolfed!それが108バイト
ジュゼッペ

1
また、面白さのためにの:代わりにを使用することもでき^ます:。そのため、コードには100万個が含まれています。
ジュゼッペ

@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バイト節約
  • abs()実際に新しいバージョンを助けていなかったため、さらに1バイト節約しました

1
取ってみませんか YYYYMMDDhhmm、単一の数字として?
アダム

@Adám確かに...時間があれば試してみます
-Annyo

提案するw<4&w%2&t>749&t<811代わりにw<4&&w%2&&t>749&&t<811
ceilingcat

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文字が機能します)を使用して、テストに合格した最後の正常な日付を保存します。(日付形式自体は、一貫性があり、スペースを含まない限り重要ではありません。)



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;

3つすべてを同じ行に移動すると、サイズが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

Bash 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つは機能しているようです。

また、私は日付を使用して気にしませんでしたが、要件は日付を受け入れる必要があることを示しているようですので、時間を個別に取り、日付値を無視するように言及したオプションを取りました。


日付を使用しない場合、同じ日にメッセージを2回送信しないことをどのように確認しますか?
チャーリー

20分間保持され、最初のチェックで既存のコピーが実行されていないことが確認されます
crystalgecko
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.