ビッグベンはBONG


45

あなたの仕事は、Big Ben(Twitter)を模倣するプログラムを作成することです。

仕事

(コンピューターのローカル時間またはUTCに従って)新しい時間が始まるたびに、BONG繰り返しhour時間を(単語間にスペースを入れて)出力する必要があります。たとえば、3時の場合、を出力する必要がありますBONG BONG BONG。時間形式は12時間形式に従います。つまり、12時以降、13ではなく1になります。プログラム/関数は永久に実行する必要があります。

例:

カッコ内に出力しない

(start: 00:34 for example)
BONG               (01:00)
BONG BONG          (02:00)
(...)
BONG BONG BONG BONG BONG BONG BONG BONG BONG BONG BONG BONG (12:00)
BONG               (01:00 again)
(...)
(it continues forever)

ルール

  • BONGsの各シリーズは、改行で区切る必要があります
  • 先頭/末尾の改行が許可されます
  • しかし大手/末尾のスペースはされていない許可します
  • 提出は永久に実行する必要があります
  • 出力は、時間の開始から±3秒で印刷される場合があります
  • 特定の時間にプログラムが実行されると想定することはできません。

これはなので、バイトカウントが最も短いプログラムが勝ちます!


6
これらの提出物をテストするのは楽しいでしょう...:D
FlipTack

3
12/24の場合、0ボンまたは12ボンを印刷しますか?
マルティセン16

6
専用のコードゴルフ言語では容易に支配されないチャレンジに対して+1。
フィリップ

2
システムクロックが1859年以前に巻き戻された場合、プログラムはどのように動作しますか?
アマニキルマンガ16

3
:テストのために1時間関数をオーバーライドLD_PRELOADハック使用することができgithub.com/vi/timeskewをTIMESKEW="60 1"分が秒のように流れます。
Vi。

回答:


2

05AB1E、43バイト

3600žcžb60*+->Lvw}["BONG "ža<12%>×,5°36*.W]

オンラインでお試しください!(笑これは機能しません。60秒でタイムアウトします。このための05AB1Eインタープリターをダウンロードしてください

説明:

3600žcžb60*+->                          # Get amount of seconds (plus one) until next hour
              Lvw}                      # Wait said amount of seconds
                  [                     # Infinite loop start
                   "BONG "ža<12%>×,     # Print "BONG " multiplied by the amount of hours (12-hour clock)
                               5°36*.W  # Wait an hour (3600000 milliseconds)
                                      ] # Infinite loop end  

これは私にゴルフにしばらくかかりました!もう少しゴルフができるかもしれませんが、それは打つ*><>ので、それはクールです:)

クイックバージョン:

1Uw["BONG "X<12%>×,wX>U]

起動時に1秒、BONG間で1秒待機します


遅れて申し訳ありませんが、ようやくプログラムをローカルで実行することができました。よくやった、これはエソランに特に良い!
KritixiのLithos

18

バッシュ、 7170、69バイト

編集:

  • スリープ間隔の計算を少し、-1バイト最適化しました。
  • バックティックを-1バイトのxargsに置き換えました(ありがとう@ jrtc27!)。

ゴルフ

sleep `date +3600-%s%3600|bc`;yes BONG|sed $(date +%I)q|xargs;exec $0

説明した

#Compute the number of seconds left in the current hour and wait.
sleep `date +3600-%s%3600|bc`; 

#Print "hour" (1-12) worth of "BONG" strings, one per line,
#use xargs to merge them into a single space-separated string.
yes BONG|sed $(date +%I)q|xargs

#Re-execute itself (in the same process).
exec $0

テストバージョン

時間ではなく分で動作します

sleep `date +60-%s%60|bc`;yes BONG|sed $(date +%I)q|xargs;exec $0

2
@zeppeIin私はあなたを礼拝するという第一の目標でこのコミュニティに参加しました。特に-あなたのソリューションは、私はまだ素晴らしさから動揺してる卑劣なトリックがいっぱいですyes BONG|sed 12q
neonzeon

@neonzeonすごい:)
ツェッペリン

デフォルトでechoを呼び出すxargsにパイピングすることにより、エコーから1バイト削ることができます。パイプの場合は1 + xargsの場合は5-バックティックの場合は2-エコーの場合は4-スペースの場合は1 = -1バイト。
jrtc27

@ jrtc27それは素晴らしいアドバイスです!ありがとうございました !
ツェッペリン

8

*> <>48 47 44バイト

>s?um?uhc%:?!c21.O
v$o" GNOB"oooo$1-:?!
\aofS

ここで試してみてください!またはテストのために毎分それを行うこのバージョン

これBONGは、何時か(13は1など)に基づいて、スペースで区切られたsの数を出力します。finalの後に末尾のスペースはなくBONG、末尾の改行があります。

技術的には、これは永久に実行されるわけではありません(ただし、基本的には実行されます)。1日あたり約28バイトのリークが発生します(インタープリターのオーバーヘッドは無視されます...)。1GiBがリークするまでに約105062年かかります。

インタープリターのオーバーヘッドを概算すると、スタックはfloat64Golangインタープリターのsのスライスにすぎません。だから、私は単純に28*81日あたり224バイトを思いついた。この数値をギビバイト(1073741824)のバイト数で割り、さらに365で割り、1 GiBをリークするには13132.85年かかると概算します。

通訳に関する注意

オンラインインタプリタはJavascriptにあります。現在の時刻を確認してBONGを出力するには、ページを開いて表示する必要があります。Golangインタプリタはそのような制限がありません。

説明

Main loop:

s?um?u          O     if seconds == 0 && minutes == 0:
      hc%               push hours % 12 (bongs) to the stack
         :?!c           if bongs is 0, push 12 to the stack
             21.        jump to "output bongs" coords (2, 1)


Output bongs:

Begins at `"` because of the jump.

   " GNOB"            push "BONG " to the stack
          oooo        output "BONG"
              $1-     subtract 1 from bongs
v                :?!  if bongs == 0, move to "newline and sleep"
 $o                   output " "


Newline and sleep:

\                     mirror the IP to the right
 ao                   output a newline
   fS                 sleep for 1.6s
\                     mirror to main loop

オンラインの言語通訳者の現地タイムゾーンは何ですか?新しい時間が来たとき、何も出力しなかったため
Kritixi Lithos

@KritixiLithos、残念ながらオンライン通訳者にとっては、ページが開いていて、表示される必要があります。これはJavascript /ブラウザの制限だと思います。インタプリタ自体がJavascriptに含まれているため、オンラインであるかどうかを心配する必要はありません。必要に応じて自分でダウンロードできます。ただし、Golangインタープリターは何に関係なく動作します。ご不便をおかけして申し訳ありませんが、答えを編集して明確にします。
redstarcoder 16

1
このチャレンジに勝ちました。おめでとうございます!これはこのチャレンジを完了した唯一のゴルフラングであり、それは印象的です:)
Kritixi Lithos

@KitixiLithosありがとう!! これは私が勝った最初の挑戦です:D
redstarcoder

7

JavaScript(ES6)、99 93バイト

f=_=>setTimeout('alert("BONG ".repeat(new Date/36e5%12|0||12).trim(f()))',36e5-new Date%36e5)

これはUTC時間を使用します(実際の時間と一致します)。コードのテスト不可能な性質のため、同じことを行うが、60秒ごとに次を試すことができます。

f=_=>setTimeout('alert("BONG ".repeat(new Date/36e5%12|0||12).trim(f()))',6e4-new Date%6e4)

f()

現地時間を使用するボーナス99バイトバージョンは次のとおりです。

f=_=>setTimeout('alert("BONG ".repeat(new Date().getHours()%12||12).trim(f()))',36e5-new Date%36e5)

この(スニペット)alert私のために毎分S(しかし、数BONGsが正しい)が、プログラムは、すべての時間だけ出力になっている
KritixiのLithos

@KritixiLithos「テスト不可能なコードの性質により、同じことを行うが、60秒ごとに以下を試すことができます。」
;

6

JavaScriptの(ES6)、125の 123 117 115バイト

5バイトを節約してくれた@ Flp.Tkcに感謝します!

さらに2バイトを節約してくれた@BenAstonに感謝します!

a=eval(b=`(new Date).getHours()`);setInterval(w=>eval(b)!=a?console.log(Array(++a%12+1).join`BONG `.trim()):"",1e3)

スナックスニペット

a=eval(b=`(new Date).getHours()`);setInterval(w=>eval(b)!=a?console.log(Array(++a%12+1).join`BONG `.trim()):"",1e3)


1
@BenAston気づいてくれてありがとう:)
Kritixi Lithos

1
これは、最初のセミコロンなしでは動作しません@BenAston
KritixiのLithos

5

バッチ、142バイト

@timeout/t>nul 1
@if not %time:~3,5%==00:00 %0
@set/ah=-%time:~0,2%%12
@set s=............
@call set s=%%s:~%h%%%
@echo %s:.=BONG %
@%0

ファイルは無限ループとして実行されるため、bongの後に1秒の遅延が必要なので、1秒の遅延で開始します。これにより、CPUサイクルが節約されます。>nul(バイトを保存するために慎重に配置されている1>nul1を引き起こすリダイレクトで食べることにします)。次に、分と秒の両方がゼロになるまでループします。ボンは、12を法とする負の時間を取り、h12文字の文字列から最後の文字を要求することによって構築されます。場合はhゼロである、これは実際にはそのため12 bongs、私たちに文字列全体を与えます。次に、文字を単語に置き換えれば十分BONGです。実行すると、次のようになります(画像がループしないため、アニメーションを再度表示するには、強制的に再読み込みする必要があります)。

サンプル出力


実行および出力のgifを提供できますか?
クリティキシリトス

1
@KritixiLithosここで何を探しているのかわかりません。1時間前と1時間後のスクリーンショットを撮って、アニメーションGIFに最大11分の遅延を追加することはできますが、どのようにそれが証明されるのかわかりません。
ニール

私は自分のコンピューターでテストできないのでgifを要求しています(macです)
Kritixi Lithos

@KritixiLithosこのようなものは大丈夫ですか?
ニール

十分だ、私はあなたの言葉をそれを取る:)
Kritixi Lithos

5

Bash + Linux crontab、90

これが他のシェルの答えよりも短くなることを望んでいました。それでも、私はそれが面白いアプローチだと思う:

for i in {0..11};{
s+=\ BONG
echo "0 $i,$[i+12] * * * echo$s>/proc/$PPID/fd/1"
}|crontab -

スクリプトは1回実行され、crontabにデータを入力して終了します。ただし、cronjobsからの出力は、スクリプトの実行元の端末に送信されます。これは、提出が永遠に実行する必要があるという要件を満たすと思います。

警告 -これにより、既存のcrontabエントリがすべて消去されるため、既存のものがバックアップされていることを確認してください。

これは、デフォルトでVixie を使用しているUbuntu 16.04で機能しcronます。


私はそれを実行し、「メール」を受け取りました。メールをチェックアウトすると、BONG必要なものが1つありました。
Kritixi Lithos

@KritixiLithosそれは奇妙です。どのLinuxディストリビューションを使用していますか?どちらcronを使用していますか?
デジタル外傷

私は、LinuxではないのMac、待機、上だ
KritixiのLithos

@KritixiLithosうん;-)。この答えはLinuxに依存してい/proc/<PID>/fd/<N>ます。
デジタル外傷

3

Ruby、112 99バイト

loop{sleep 2;n=Time.now;if(n.min==0);puts ('BONG '*n.strftime('%I').to_i).chop;sleep 60-n.sec end}

旧版

loop{sleep(2);n=Time.now; if(n.min.zero?) then puts ('BONG ' * n.strftime('%I').to_i).chop;sleep(60-n.sec) end}

ヒントについてはQPaysTaxesに感謝します


@ Flp.Tkcそうそう、いいキャッチ!最後の文字を削除し忘れた
Jatin Dhankhar

ルビーはわかりませんが、プログラムは新しい時間の開始から3秒以内に出力する必要があります。私はないと思うsleep(60)が起こる可能
KritixiのLithos

@KritixiLithosプログラムを3秒ごとにスリープ状態にしてから、計算ループ-> 3秒ごとにウェイクすることができます。時間を確認して何かをする?
ジャティンダンカー

@JatinDhankharまたは、2秒間スリープ状態にすることができます(呼吸スペースを確保するため)
Kritixi Lithos

@KritixiLithosはい、ありがとうより2秒に変更します
ジャティン・ダンカー

3

チェダーv1.0.5、162バイト

チェダーには組み込みのタイムリーダー/ cmd出力リーダーがないため、即興で演奏する必要がありました。

ゴルフ:

var f=->{IO.exec("time/t>c");(String::IO.read("c")).split(":")};var a=f()[0];for(;1;){var b=f();if(b[0]!=a){var c=Number::(a=b[0]);print("BONG "*c).head(5*c-1);}}

ゴルフをしていない:

var f=->{
    IO.exec("time/t>c");
    (String::IO.read("c")).split(":")};
var a=f()[0];
for(;1;){
    var b=f();
    if(b[0]!=a){
        var c=Number::(a=b[0]);
        print("BONG "*c).head(5*c-1);
    }
}

説明:

チェダーの標準ライブラリが限られているため、cmdを使用して時間を生成する必要がありました。これは、12時間形式で時刻を出力する「time / t」の出力を「c」という名前のファイルに保存することで行いました。IO.readは、文字列にキャストして「:」で分割したバッファを返します。これにより、時間は常にインデックス0になります。その操作全体をラムダ式に保存して、44バイト節約しました。その後、「格納されている時間が現在の時間と等しくない場合、前の時間を現在に設定し、BONGをn回印刷し、末尾のスペースを切り捨てる」というロジックに入ります。

チェダーは最も冗長な言語ではないかもしれませんが、このような回避策を見つけるのは楽しいかもしれません!

残念ながら、これはWindows専用のソリューションです。

編集1: for-conditionの「0 <1」を「1」に置き換えることで2バイトを保存しました。この言語では1がtrueと評価されるとは思いませんでした!


3

ルビー、82 81バイト

loop{l=Time.new
puts ("BONG "*(l.hour%12+1)).chop if(l+1).hour!=l.hour
sleep 1}

毎秒、最後の1秒かどうかを確認し、それに応じてBONGします。おそらくいくつかの汚いトリックでさらにゴルフをすることができますが、私はあまり知りません。また、他のRubyの回答とは異なる動作をします。

QPaysTaxesのおかげで1バイト節約できました。


Rubyに入る必要があります。ゴルフのPythonよりも少し冗長です。
エルペドロ16

直後にスペースが必要ifですか?
ニックハートリー

@QPaysTaxesしません、ありがとうございます。私はそのことputsを忘れてから、スペースにとても夢中になりました。
ボルスニョ16

3

パイソン2105の 106バイト

import time
h=0
while 1:
 l=time.localtime();c=l[3]%12
 if l[4:6]==(0,0)and h!=c:print('BONG '*c)[:-1];h=c

編集

@ pinkfloydx33からのフィードバック後に<を!=に変更して1バイトを追加しました。良いスポット。

可能な限りローカルでテストしましたが、TIOが(明らかに)60秒の実行制限を超えているため、TIOで動作しません。ローカルで自由にテストしてください:-)

ちなみに、その厄介な後続スペースを失うと、7バイトのコストがかかります。そうでなければ、これは100未満でした。

TIOがない場合、1時間待ってから出力されます。Progは15:27に開始され、追加のデバッグコードを使用して印刷の時間を表示しました(12時間形式)。

python bigben.py
time is 4:0:0
BONG BONG BONG BONG
time is 5:0:0
BONG BONG BONG BONG BONG

かなり簡単ですが、ここに興味のある人のための説明があります。

import time                 #Import the time module
h=0                         #Create a variable to store the hour that has just been printed
while 1:                    #Loop forever
 l=time.localtime()         #Get the local time from the time module
 c=l[3]%12                  #Set a variable to the current hour in 12 hour format
 if l[4:6]==(0,0)and h!=c:   #If minutes=0 and hours=0 and the last hour that was printed is not the current hour
  print "time is "+`c`+":"+`l[4]`+":"+`l[5]`    #Debug code to show hour
  print('BONG '*c)[:-1]     #Print 'BONG '*number of hours and lose the space from the end 
  h=c                       #Update the last hour that was printed

1
分が0であるかどうかを確認できます:l [4] == 0and h <c。
カーラ

考えてみると、20:00:01にタイマーを開始すると動作しないという小さな問題があります。分はゼロであり、秒ではなく、bongを出力します
Carra

これはいない、私はそれをローカルに走った何も出力
KritixiのLithos

@KritixiLithos出力が得られない理由はわかりません。Ubuntu 14とPython 2.7.9を使用しています。さらに議論するためにこれをチャットに取りたいですか?
エルペドロ

2
これは11h-> 12hから機能しますか。(12%12 = 0)?11>0それのようだ、h>cそれとも私は何かを見逃していますか?
pinkfloydx33 16

3

Pythonの3 - 100の 97の 92バイト

from time import*
while 1:x=3600;sleep(x-time()%x);print(('BONG '*int(strftime("%I")))[:-1])[:-1])

説明:

import time;
while 1:
 t=time;x=3600;
 t.sleep(x-t.time()%x);#sleep for the remaining seconds until the next hour
 print(('BONG '*int(t.strftime("%I")))[:-1])#strftime("%")=nr of hours (1-12). Print the bongs and remove the last char

from time import*<NL>while 1:x=3600;sleep(x-time()%x);print(('BONG '*int(strftime("%I")))[:-1]) は93バイトです
ローマングラフ

最初の行の最後にセミコロンが必要だとは思わない。
ニックハートリー

末尾を削除しました。
カーラ

あなたがしなければ92バイトfrom time import*のように、この
FlipTack

ヒントをありがとう、私はそれを追加しました。Pythonについて毎日新しいことを学ぶ:)
Carra

2

C、238バイト

#include<time.h>
#include<unistd.h>
i,j;f(){time_t t=time(0);struct tm l=*localtime(&t);for(;;){t=time(0),l=*localtime(&t),j=l.tm_hour;sleep(1);if(!(l.tm_min+l.tm_sec)){j=j%12?j<12?j:j-12:12;for(i=0;i<=j;i++)printf("BONG%c",i^j?32:10);}}}

これが正しく機能するかどうかはわかりませんが、私はモバイルで、私の携帯電話にはCコンパイラがありません。(UNIXのようなシステムでのみ機能します)


この生成無限出力私はそれを試してみました(改行)
KritixiのLithos

@KritixiLithosはい、もう使用しない部分を削除するのを忘れました。7分でテストできますか?:)
betseg 16

f代わりにmain?これはどのように機能するはずですか?
トーマスパドロン-マッカーシー

1
@ ThomasPadron-McCarthy完全なプログラムとは対照的に、関数を提供することは問題ないと確信しています。
ニックハートリー

2

sh、66バイト

yes 'echo `yes BONG|sed $(date +%I)q`'|sh -s|awk '$0!=a&&a;{a=$0}'

説明した

#Pipe a command into a subshell repeatedly
yes 'some command'|sh -s

#Print "hour" (1-12) worth of "BONG" strings, one per line,
#use backticks to merge them into a single space-separated string.
#(stolen from zeppelin's answer)
echo `yes BONG|sed $(date +%I)q`

#Print every time the output changes
awk '$0!=a&&a;{a=$0}

これは、プログラムが実行されるとすぐに出力されますが、実行しないでください。プログラムは、新しい時間が始まっただけで出力しなければならない
KritixiのLithos

同じ問題がまだ表示されます
Kritixi Lithos

@KritixiLithos私の悪い。実際のコードではなく、説明とバイトカウントのみを更新しました。
レイナーP.

私は時間でそれをテストするために今残っていることすべてがある
KritixiのLithos

@KritixiLithos Replace %Iwith %Mで数分間動作します。
レイナーP.

1

C、198バイト

#import<time.h>
h,i;f(){time_t t=time(0);struct tm l=*localtime(&t);for(h=l.tm_hour;;t=time(0),l=*localtime(&t))if(h-l.tm_hour%12){h=l.tm_hour%12;for(i=h?h%12:12;--i;)printf("BONG ");puts("BONG");}}

1

Javascript ES6 87バイト

編集:new Date/36e5%12|0||126バイトを節約するために@ETHProductionsのコードを恥知らずに借りた

setInterval('Date().match`:00:00`?alert("BONG ".repeat(new Date/36e5%12|0||12)):5',1e3)


1

R、104の 105バイト

f=format;repeat{Sys.sleep(1);q=Sys.time();if(f(q,"%M%S")=="0000")print(rep("BONG",as.double(f(q,"%I"))))}

毎秒、1時間の終わりであるかどうかをテスト(すべき)し、その量のBONGsを出力します。


プログラムが実行されるときに、このプログラムはいつ出力され12:00:01ますか?
Kritixi Lithos

Rはわかりませんが、プログラムは新しい時間の開始から3秒以内に出力する必要があります。私がもし本当にわからないSys.sleep(60)が起こる可能
KritixiのLithos

あなたは置き換えることができますwhile(1)によってrepeat
プランナパス16

正確を期すため、スリープ間隔は1時間後の猶予期間よりも短くする必要があります。Sys.sleep(2)はどうですか?
newcoder 16

1
@newcoder各ループは1秒間スリープします。そうしないとBONG、1回だけではなく1秒間印刷されます。これは、毎秒1回だけチェックするようにするためです。
JAD

1

JavaScriptのES2015、100の 99 98 96 94 88バイト

h=_=>new Date/36e5%12|0,p=h();for(;;)h()!=p&&(p=h(),alert('BONG '.repeat(p||12).trim()))

説明:

hは、剰余演算子(%12)を使用して12時間ベースの時間を取得する関数です。36e5は、指数構文を使用して文字を保存する1時間のミリ秒数です。newオペレータは、引数がない場合は、括弧は、したがって、関数で使用されていることを必要としませんnew Date。JavaScriptには浮動小数点演算のみがあり、|ビット単位のOR演算子は数値を強制的に整数にします。これは、JSビット単位の演算子がIEEE 754浮動小数点で表される数値の整数サブセットで機能するためです。

コンマは部分式を表します。p現在の時間(p=h())に初期化されます。

for(;;)BONG警告する必要があるかどうかを繰り返しチェックするために使用されます。チェックは、ランタイムが許す限り迅速に実行されます。

時間が変更された場合(h()!=p)、pを更新してからBONGsに警告します。論理AND演算子はh()===pBONGsが出力されるかどうかを判断するためのガードとして使用されます(ifの場合は短絡します)。

String.prototype.repeatES2015の新機能で、ES5のようなものを使用するよりもいくつかのキャラクターを節約しArray.prototype.joinます。

h12の正確な倍数(つまり、12pm、12am)に対してゼロを返すため、論理ORを使用して12に変更しp||12ます。

Kritixi LithosとETHProductionsのアイデアに感謝します。


私はあなたが最後にセミコロン削除することができると思う
KritixiのLithos

1

Excel VBA、143バイト

VBEイミディエイトウィンドウへのコード出力

Sub b:Do:n=Now
If Minute(n)=0 Then:s="":For i=1To Hour(n) Mod 12:s=s &"BONG ":Next:Debug.?Trim(s):Application.Wait n+#0:1#:End If:Loop:End Sub

楽しいバージョン、143バイト(非競合)

BONGに成功するのはかなり難しいですが、Excelに行くのは非常に簡単ですBeepBeepコールがビープ音を生成し、時間を示す農産物のビープ音に使用するこれを以下のコードは、時間上で、1秒休止によって分離しました。

上記と同様に、このコードによりExcelが応答しなくなり:DoEvents、ユーザーエクスペリエンスが向上するため、最初の行の最後に呼び出しを追加することをお勧めしますが、これは正しいコードの実行には必要ありません。

Sub b:Set a=Application:Do:n=Now
If Minute(n)=0 Then:For i=1To Hour(n) Mod 12:Beep:a.Wait(Now+#0:0:1#):Next:a.Wait(n+#0:1#):End If:Loop:End Sub

非ゴルフバージョン

Public Sub BigBen()
    Dim i As Byte
    Dim n As Date
    Dim w As Worksheet
    Dim a As Excel.Application
    Set a = Application
    Set w = a.ThisWorkbook.Sheets(1)
    Let w.Name = "Big Ben"

    Let w.[A1] = Now
    w.Columns("A:A").AutoFit

    Do
        DoEvents
        Let n = Now
        If Minute(n) = 0 Then

            ''  Print BONG
            Let s = ""
            For i = 1 To Hour(n) Mod 12 Step 1
                Let s = s & "BONG "
            Next i
            Debug.Print Trim(s)

            ''  Go Beep
            For i = 1 To Hour(n) Mod 12 Step 1
                Beep
                a.Wait (Now + #12:00:01 AM#) ''  <- #0:0:1# resolves to #12:00:01 AM#
            Next i

            ''  Keep Ticking After Going BONG
            While Now < n + #12:01:00 AM#    ''  <- #0:1# resolves to #12:01:00 AM#
                Let w.[A1] = Now
                Let a.StatusBar = IIf(Second(Now) Mod 2, "Tick", "Tock")
                DoEvents
            Wend
        End If

        ''  Tick Tock until its time to Go BONG again
        Let a.StatusBar = IIf(Second(n) Mod 2, "Tick", "Tock")
        Let w.[A1] = Now
    Loop

End Sub

Windows以外のコンピューターでこれをテストすることはできますか?そうでない場合、新しい時間が始まるときに出力のgifを提供できますか?
Kritixi Lithos

正直に言うと、すぐにはわかりません。このコードをLinuxマシンでテストすることはできませんが、Macでは正常に機能するはずです。ただし、MacマシンではBeepor DoEvents呼び出しが正しく機能しない可能性があります。
テイラースコット

0

C#234バイト

ここで賞品を獲得するつもりはありませんが、C#の実装は必須です。

using System;
using System.Linq;namespace B{class P{static void Main(){Func<int> h=()=>DateTime.Now.Hour % 12;var p=h();while (true){var t=h();if (t!=p)Console.WriteLine(string.Concat(Enumerable.Repeat("BONG",t== 0?12:t)));p=t;}}}}

コメントなしでゴルフ:

using System;
using System.Linq;

namespace B
{
    class P
    {
        static void Main()
        {
            Func<int> h = () => DateTime.Now.Hour % 12; // h(): the hour in the range [0, 11], making this a lambda saves a few chars
            var p = h(); // p: Previous time
            while (true)
            {
                var t = h(); // t: Current time
                if (t != p) // If current hour is different to previous hour
                    Console.WriteLine(string.Concat(Enumerable.Repeat("BONG", t == 0 ? 12 : t))); // Print "BONG" t times (also correcting t = 0 to 12)
                p = t; // Current time is now previous time
            } // Repeat ad nauseum
        }
    }
}

1
使用しfor(;;)、変更しますh=()=>1+(DateTime.Now.Hour-1)%12;(空白もありません)、そしてEnumerable.Repeatは("BONG",t)(2つまたは3つのいずれかを節約します)そして余分な空白を取り除きif(...)ます。最初の引数としてスペースを使用します。
pinkfloydx33

0

Groovy、72バイト

{x={new Date().getHours()};y=x();while(1){if(y!=(y==x()){print "BONG "*y}}​}​​​

どうやって?

現在の時間を取得するメソッドを保存します。

x={new Date().getHours()};

初期時間を保存します。

y=x();

trueの場合、現在の時間が前の時間と等しくない場合、現在の時間を「BONG」で乗算して、bongの現在の時間を出力します。

while(1){if(y!=(y==x()){print "BONG "*y}}

%12軍隊以外のボンの場合は+3バイト。


0

perl、60バイト

更新

交換し " "$"、削除CORE::、カウント修正。

ゴルフ

say join$",(BONG)x(time/3600%12||12)while sleep -time%3600+1

これはで実行する必要がありますperl -E

備考

  • perlでは、(where は単一のステートメントです)x while yと同等ですが、括弧は不要です。何かが印刷される前に初めて実行されます。while(y){x}xsleep
  • timeUTCを使用します。オリジナルのビッグベンは、3月末から10月末まで夏時間(British Summer Time、BST)です。
  • プログラムが少なくとも1秒間待機することを保証するために、待機時間に1秒が追加されます。これは、BONGが常に1秒遅れて印刷されることを意味します。これは規則に従って有効です。ウェストミンスター橋の上に立っているとしましょう。ビッグベンから300メートル。プラス面では、これは、1時間の正確な開始時に(3600秒待機する代わりに)プログラムが正しい量のBONGを出力することも意味します。
  • sleep待機した秒数を返します。これは常に真実です。

1
2つのこと。1-Eフラグが+1バイトであると確信しています(フラグの測定についてのページがあります...)。2perl -E golf.plすぐに終了するように見えるため、これを実行する方法がわかりません。
redstarcoder 16

0

QBIC、82バイト

X=$left$|(_d,2){Y=left$$|(_d,2)~Y<>X|x=!Y!%12~x=0|x=12]B=C[x|B=B+@BONG |]?_tB|]X=Y

本当にコードリテラル($)のトークンを変更し、サブストリング機能を実装する必要があります(left$(x,y)短くすることもできます)。

内部の仕組み:

In the first part, we want to set X$ to the hour-component
of our system's time. The DATE is implemented in QBIC, but
Substring (LEFT$, RIGHT$ and MID$ in QBasic) is not (yet).
We need to use the QBasic LEFT$ function, and QBIC can do 
that using a 'code literal': everything from '$' to '|'
is not parsed by QBIC but passed on to QBasic.
X=               Set X$ to
$left$|(         the leftmost (note the '$' and '|' for the code literal)
_d,2)            2 characters of TIME$ (hh:mm format)
{                DO - infinite loop
Y=left$$|(_d,2)  Set Y$ in the same way
~Y<>X            If Y$ is not equal to X$ the hour has changed
|x=!Y!%12        THEN set x to the modulo 12 of Y$ cast to number
~x=0|x=12]       If Y% happens to be divisible by 12, set x to 12
B=C              Clear B$ (c$ never gets assiged a value)
[x|B=B+@BONG |]  For the given number of hours, add "BONG " to B$
?_tB|            Print B$, trim the trailing space
]                end if
X=Y              Update X$
<DO LOOP is implicitly closed>

更新(NC):$はQBIC命令セットでは使用されなくなったため、コードリテラルを必要とせずにQBasicのコードとして自由に使用できるようになりました。この場合、4バイトを節約し、QBICを78バイトにします。

X=left$(_d,2){Y=left$(_d,2)~Y<>X|x=!Y!%12~x=0|x=12]B=C[x|B=B+@BONG `]?_tB|]X=Y

0

SmileBASIC、74 67バイト

WAIT 61TMREAD OUT H,M,S?("BONG"+" BONG"*((H+11)MOD 12))*!(M+S)EXEC.

大量の「末尾」改行を出力します;)

編集:より良い24時間以上12時間のアルゴリズムで7バイトを節約しました。


0

PHP、63バイト

拡張ASCIIを使用すると、さらに2バイト節約できます。しかし、私は現在それが面倒です。

for(;;sleep(1))+date(is)?:print str_pad("
",5*date(h),"BONG ");

1時間前に正確に先頭に改行を入れてBONGを出力します。で実行し-nrます。


あなたは:バイトのフラグを含める必要があります
KritixiのLithos

@KritixiLithosいいえ、ありません。-n一種の暗黙的です(phpを無視し、デフォルトの構成値にフォールバックします)。-rPHPに、ファイルからではなくコマンドラインパラメーターからコードを実行するように指示します。
タイタス

ああ、私の悪い、私はPHPを知りません。
クリチキシリトス

0

C、152

int a=0,i,L=25;main(){char s[9];for(i=-1;++i<48;){sprintf(s,"%02i:00:00",i);if(!strcmp(s,__TIME__)&&i!=L)a=L=i,i=-1;printf(a-->0?"BONG ":"\n");}main();}

読みやすい:

int a=0,i,L=25;

main(){
    char s[9];
    for(i=-1;++i<48;){
        sprintf(s,"%02i:00:00",i);
        if(!strcmp(s,__TIME__)&&i!=L)
            a=L=i,i=-1;
        printf(a-->0?"BONG ":"\n");
    }
    main();
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.