Big Ben geht BONG


45

Ihre Aufgabe ist es, ein Programm zu erstellen, das Big Ben (Twitter) imitiert .

Aufgabe

Immer wenn eine neue Stunde begonnen hat (entsprechend der Ortszeit oder UTC Ihres Computers), müssen Sie BONGwiederholte hourZeiten ausgeben (mit einem Leerzeichen zwischen den Wörtern). Zum Beispiel, wenn es 3 Uhr ist, müssen Sie ausgeben BONG BONG BONG. Das Zeitformat folgt dem 12-Stunden-Format, dh nach 12 Uhr haben wir 1 und nicht 13. Das Programm / die Funktion muss für immer laufen.

Beispiel:

Gib nichts in den Klammern aus

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

Regeln

  • Jede Folge von BONGs muss durch eine neue Zeile getrennt werden
  • Führende / nachfolgende Zeilenumbrüche sind zulässig
  • Führende / nachfolgende Leerzeichen sind jedoch nicht zulässig
  • Die Einreichung muss für immer laufen
  • Ihre Ausgabe wird möglicherweise ± 3 Sekunden nach Beginn der Stunde gedruckt
  • Sie können nicht davon ausgehen, dass das Programm zu einer bestimmten Stunde ausgeführt wird

Das ist , also gewinnt das Programm mit dem kürzesten bytecount!


6
Das Testen dieser Einsendungen wird Spaß machen ...: D
FlipTack

3
drucken wir für den 24.12. 0 Bongs oder 12 Bongs?
Maltysen

6
+1 für eine Herausforderung, die nicht leicht von dedizierten Code-Golf-Sprachen beherrscht wird.
Philipp

2
Wie soll sich das Programm verhalten, wenn die Systemuhr auf vor 1859 zurückgestellt wird?
Amani Kilumanga

3
Zum Testen kann man die Zeitfunktionen des LD_PRELOAD-Hack verwenden: github.com/vi/timeskew . TIMESKEW="60 1"Minuten fließen wie Sekunden.
Vi.

Antworten:


2

05AB1E , 43 Bytes

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

Probieren Sie es online! (lol das wird nicht funktionieren, es wird eine Zeitüberschreitung in 60 Sekunden. Laden Sie den 05AB1E- Interpreter dafür herunter )

Erläuterung:

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  

Ich habe eine Weile zum Golfen gebraucht! Ich könnte ein bisschen mehr Golf spielen, aber es schlägt *><>, also ist das cool :)

Schnellversion:

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

Wartet beim Start eine Sekunde und zwischen den BONGs eine Sekunde


Entschuldigung für die Verzögerung, ich muss endlich dein Programm lokal ausführen. Gut gemacht, das ist besonders gut für einen Esolang!
Kritixi Lithos

18

Bash, 71, 7069 Bytes

EDITS:

  • Optimierte die Berechnung des Schlafintervalls ein Bit, -1 Byte;
  • Ersetzte Backticks durch xargs, -1 Byte (Danke @ jrtc27!).

Golf gespielt

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

Erklärt

#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

Testversion

Arbeitet mit Minuten statt Stunden

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

2
@zeppeIin Ich bin dieser Community beigetreten mit dem primären Ziel, dich anzubeten. Ihre Lösung ist so voller hinterhältiger Tricks, dass ich immer noch von der Großartigkeit - insbesondereyes BONG|sed 12q
Neonzeons

@neonzeon wow :)
Zeppelin

Sie können das Echo um 1 Byte reduzieren, indem Sie eine Pipeline an xargs senden, das standardmäßig Echo aufruft. 1 für Pipe + 5 für Xargs - 2 für Backticks - 4 für Echo - 1 für Space = -1 Byte.
jrtc27

@ jrtc27 Das ist ein exzellenter Rat! Dankeschön !
Zeppelin

8

*> <> , 48 47 44 Byte

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

Probieren Sie es hier aus! ( oder diese Version, die es jede Minute zum Testen macht )

Dies gibt eine Anzahl von BONGs aus, die basierend auf der aktuellen Stunde durch Leerzeichen getrennt sind (und 13 ist 1 usw.). Nach dem Finale gibt es kein Leerzeichen BONGund es gibt eine abschließende Zeile.

Technisch läuft das nicht ewig (aber im Grunde tut es das). Es verliert ~ 28 Bytes pro Tag (ohne Berücksichtigung des Interpreter-Overheads ...). Es würde ~ 105062 Jahre dauern, bis 1 GB durchgesickert sind.

Ungefähr für den Interpreter-Overhead ist der Stack nur ein float64kleiner Teil des Golang-Interpreters. Also habe ich mir einfach 28*8224 Bytes pro Tag ausgedacht. Ich habe diese Zahl durch die Anzahl der Bytes in einem Gibibyte (1073741824) geteilt und dann durch 365, um zu schätzen, dass es 13132,85 Jahre dauern würde, bis 1 GiB verloren geht.

Anmerkung zu den Dolmetschern

Der Online-Dolmetscher ist in Javascript. Die Seite muss geöffnet und sichtbar sein, damit die aktuelle Uhrzeit überprüft und die BONGs ausgegeben werden können. Der Golang-Interpreter unterliegt keiner solchen Einschränkung.

Erläuterung

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

Wie lautet die lokale Zeitzone für den Online-Dolmetscher der Sprache? Denn als eine neue Stunde für mich schlug, gab sie nichts aus
Kritixi Lithos,

@KritixiLithos, leider muss die Seite für den Online-Dolmetscher geöffnet und sichtbar sein, damit sie funktioniert. Ich denke das ist eine Javascript / Browser Einschränkung. Sie brauchen sich keine Sorgen darüber zu machen, dass es online ist oder nicht, da der Dolmetscher selbst in Javascript ist. Sie können es auch selbst herunterladen, wenn Sie möchten! Der Golang-Interpreter funktioniert jedoch unabhängig von allem. Wir entschuldigen uns für die Unannehmlichkeiten. Ich werde die Antwort bearbeiten, um dies klarzustellen.
Redstarcoder

1
Herzlichen Glückwunsch zum Gewinn dieser Herausforderung! Dies ist die einzige Golf-Sprache, die diese Herausforderung
gemeistert hat

@KritixiLithos danke !! Dies ist die erste Herausforderung, die ich gewonnen habe: D
Redstarcoder

7

JavaScript (ES6), 99 93 Bytes

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

Hierbei wird die UTC-Zeit verwendet (die mit der tatsächlichen Zeit übereinstimmt). Aufgrund der nicht testbaren Natur des Codes können Sie Folgendes versuchen, was dasselbe bewirkt, jedoch alle 60 Sekunden:

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

f()

Hier ist eine 99-Byte-Bonusversion, die die Ortszeit verwendet:

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

Dies (das Snippet) ist alertjede Minute für mich (aber die Anzahl der BONGs ist korrekt), aber das Programm soll nur stündlich ausgegeben werden
Kritixi Lithos

@KritixiLithos "Da der Code nicht testbar ist, können Sie Folgendes versuchen, das dasselbe aber alle 60 Sekunden tut:" ;-)
ETHproductions

6

JavaScript (ES6), 125 123 117 115 Byte

Vielen Dank an @ Flp.Tkc für das Speichern von 5 Bytes!

Vielen Dank an @BenAston für das Speichern von 2 weiteren Bytes!

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

Snack Snippet

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


1
@BenAston Danke, dass du das bemerkt
hast

1
@BenAston Ohne das erste Semikolon geht es nicht
Kritixi Lithos

5

Batch, 142 Bytes

@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

Da die Datei als Endlosschleife ausgeführt wird, beginne ich mit einer Verzögerung von 1s, da ich nach den Bongs sowieso eine benötige, und dies spart CPU-Zyklen. Das >nulwird vorsichtig positioniert, um ein Byte zu speichern ( 1>nulwürde dazu führen, dass die 1 von der Umleitung gefressen wird). Wir schleifen dann, bis sowohl Minuten als auch Sekunden Null sind. Die Bongs werden konstruiert, indem das negative Stundenmodul 12 genommen und die letzten hZeichen aus einer 12-stelligen Zeichenfolge abgefragt werden. Wenn hNull ist, erhalten wir die gesamte Saite, also 12 Bongs. Es genügt dann, die Zeichen durch das Wort zu ersetzen BONG. Wenn es ausgeführt wird, sieht es ungefähr so ​​aus (beachten Sie, dass sich das Bild nicht in einer Schleife befindet, Sie müssen also einen Neustart erzwingen, um die Animation erneut anzuzeigen):

Beispielausgabe


Könnten Sie ein GIF davon bereitstellen, das läuft und ausgibt?
Kritixi Lithos

1
@KritixiLithos Nicht sicher, wonach Sie hier suchen. Ich kann Screenshots vor und nach der vollen Stunde machen und in einem animierten GIF eine Verzögerung von bis zu 11 Minuten hinzufügen, aber ich verstehe nicht, wie das irgendetwas beweist.
Neil

Ich bitte um ein GIF, weil ich es nicht auf meinem Computer testen kann (es ist ein Mac)
Kritixi Lithos

@KritixiLithos So etwas OK?
Neil

Gut genug, ich nehme dein Wort dafür :)
Kritixi Lithos

5

Bash + Linux crontab, 90

Ich hatte gehofft, dass dies kürzer sein würde als die anderen Shell-Antworten. Trotzdem halte ich es für einen interessanten Ansatz:

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

Das Skript wird einmal ausgeführt, füllt die Crontab und wird dann beendet. Die Ausgabe der Cronjobs wird jedoch an das Terminal gesendet, von dem aus das Skript ausgeführt wurde. Ich denke das genügt um die Einreichung für immer laufen zu lassen.

Warnung - Hierdurch werden alle vorhandenen crontab-Einträge gelöscht. Stellen Sie daher sicher, dass Sie bereits vorhandene gesichert haben.

Dies funktioniert unter Ubuntu 16.04, das standardmäßig Vixie verwendet cron .


Ich ließ es laufen und erhielt etwas "Post". Als ich die Post auscheckte, gab es eine mehr BONGals nötig.
Kritixi Lithos

@KritixiLithos Das ist seltsam. Welche Linux-Distribution verwenden Sie? Welches verwenden cronSie?
Digital Trauma

Ich bin auf einem Mac, warte, das ist nicht Linux
Kritixi Lithos

@KritixiLithos Yup ;-). Diese Antwort basiert auf Linux /proc/<PID>/fd/<N>.
Digital Trauma

3

Ruby, 112 99 Bytes

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

Alte Version

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

Vielen Dank an QPaysTaxes für die Tipps


@ Flp.Tkc Oh ja, schöner Fang!
Ich habe

Ich kenne Ruby nicht, aber das Programm muss innerhalb von 3 Sekunden nach Beginn der neuen Stunde ausgegeben werden. Ich glaube nicht, sleep(60)dass das passiert
Kritixi Lithos

@KritixiLithos Wir können das Programm alle 3 Sekunden in den Ruhezustand versetzen und dann die Berechnungsschleife ausführen -> Alle 3 Sekunden aufwecken; Zeit überprüfen und Sachen machen?
Jatin Dhankhar

@ JatinDhankhar Oder Sie können es für 2 Sekunden schlafen lassen (nur um etwas
Luft zu lassen

@KritixiLithos Ja, die Änderung auf 2 Sekunden als Danke
Jatin Dhankhar

3

Cheddar v1.0.5, 162 Bytes

Cheddar hat keinen eingebauten Time Reader / Cmd Output Reader, also musste ich improvisieren!

Golf gespielt:

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);}}

Ungolfed:

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);
    }
}

Erläuterung:

Aufgrund der begrenzten Standardbibliothek von Cheddar musste ich cmd verwenden, um die Zeit zu generieren. Ich habe dazu die Ausgabe von "time / t", die die Uhrzeit im 12-Stunden-Format ausgibt, in einer Datei mit dem Namen "c" gespeichert. IO.read gibt einen Puffer zurück, den ich in einen String umgewandelt und durch ":" geteilt habe, wodurch sichergestellt wurde, dass die Stunde immer im Index Null ist. Ich habe diese ganze Operation in einem Lambda-Ausdruck gespeichert, der mir 44 Bytes ersparte. Danach folgt die Logik: "Wenn die gespeicherte Stunde nicht der aktuellen Stunde entspricht, stellen Sie die vorherige Stunde auf die aktuelle Stunde ein und drucken Sie den BONG n-mal. Schneiden Sie das Leerzeichen nach."

Cheddar ist vielleicht nicht die am wenigsten gesprochene Sprache, aber es kann Spaß machen, solche Problemumgehungen zu finden!

Leider ist dies eine reine Windows-Lösung.

Edit 1: Zwei Bytes wurden gespeichert, indem "0 <1" in der for-Bedingung durch "1" ersetzt wurde. Ich habe nicht erwartet, dass 1 in dieser Sprache als wahr bewertet wird!


3

Ruby, 82 81 Bytes

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

Jede Sekunde prüfen wir, ob es die letzte Sekunde der Stunde ist und BONG entsprechend. Könnte wahrscheinlich mit ein paar schmutzigen Tricks weitergolfen werden, aber ich kenne nicht allzu viele. Es funktioniert auch anders als die andere Ruby-Antwort.

Ein Byte gespart dank QPaysTaxes.


Müssen in Ruby bekommen. Es scheint ein bisschen weniger ausführlich als Python zum Golfen.
ElPedro

Benötigen Sie den Platz gleich danach if?
Nic Hartley

@ QPaysTaxes Ich weiß nicht, danke. Ich war so wütend auf den Weltraum, nachdem putsich diesen vergessen hatte.
Borsunho

3

Python 2 , 105 106 Bytes

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

Bearbeiten

Ein Byte durch Ändern von <to! = Nach Rückmeldung von @ pinkfloydx33 hinzugefügt. Gute Stelle.

Es wurde so oft wie möglich lokal getestet, funktioniert jedoch nicht mit TIO, da es (offensichtlich) das Ausführungslimit von 60 Sekunden überschreitet. Bitte zögern Sie nicht, vor Ort zu testen :-)

Übrigens hat der Verlust dieses lästigen Speicherplatzes mich 7 Bytes gekostet, sonst wäre dies unter 100 gewesen.

Bei Abwesenheit von TIO wird hier nach einer Stunde Wartezeit ausgegeben. Prog wurde um 15:27 Uhr mit zusätzlichem Debug-Code gestartet, um die Druckzeit anzuzeigen (12-Stunden-Format).

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

Ziemlich einfach, aber hier ist eine Erklärung für alle, die interessiert sind.

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
Sie können nur überprüfen, ob die Minuten 0 sind: l [4] == 0 und h <c.
Carra

Nun, da ich darüber nachdenke, gibt es das kleine Problem, dass es nicht funktioniert, wenn Sie den Timer um 20:00:01 Uhr starten. Minuten sind Null, Sekunden nicht und es werden die Bongs gedruckt
Carra

Dies gibt nichts aus, wenn ich es lokal ausgeführt habe
Kritixi Lithos

@KritixiLithos Keine Ahnung warum du keine Ausgabe bekommst. Ich bin auf Ubuntu 14 und Python 2.7.9. Möchten Sie dies zum Chatten nutzen, um weitere Diskussionen zu führen?
ElPedro

2
Funktioniert das von 11h-> 12h. (12% 12 = 0)? Scheint 11>0so, h>coder vermisse ich etwas?
Pinkfloydx33

3

Python 3 - 100 97 92 Bytes

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

Erläuterung:

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]) ist 93 Bytes
Roman Gräf

Ich glaube nicht, dass Sie das Semikolon am Ende der ersten Zeile brauchen.
Nic Hartley

Das Nachziehen wurde entfernt.
Carra

92 Bytes , wenn Sie tun from time import*, wie diese
FlipTack

Danke für den Tipp, ich habe es hinzugefügt. Jeden Tag Neues über Python lernen :)
Carra

2

C 238 Bytes

#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);}}}

Ich bin nicht sicher, ob dies korrekt funktioniert, und ich bin mobil und mein Telefon verfügt nicht über einen C-Compiler. (Funktioniert nur auf UNIX-ähnlichen Systemen)


Dies erzeugte eine unendliche Ausgabe (Newlines), als ich es versuchte
Kritixi Lithos,

@KritixiLithos ja, ich habe vergessen, das Teil zu entfernen, das ich nicht mehr benutze. Können Sie in 7 Minuten testen? :)
Betseg

fstatt main? Wie soll das gehen?
Thomas Padron-McCarthy

1
@ ThomasPadron-McCarthy Ich bin mir ziemlich sicher, dass die Bereitstellung einer Funktion im Gegensatz zu einem vollständigen Programm in Ordnung ist.
Nic Hartley

2

sh, 66 Bytes

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

Erklärt

#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}

Dies wird sofort gedruckt, sobald das Programm ausgeführt wird. Dies sollte nicht geschehen. Das Programm darf nur ausgegeben werden, wenn eine neue Stunde begonnen hat
Kritixi Lithos

Das gleiche Problem tritt immer noch auf
Kritixi Lithos

@KritixiLithos Mein schlechtes. Ich hatte nur Erklärung und Byteanzahl aktualisiert, nicht den tatsächlichen Code.
Rainer P.

Jetzt muss ich es nur noch zur vollen Stunde
testen

@KritixiLithos Ersetzen %Imit %Mund es funktioniert für Minuten.
Rainer P.

1

C 198 Bytes

#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 Bytes

Edit: Schamlos @ETHProductions ' new Date/36e5%12|0||12Code entlehnt , um 6 Bytes zu sparen

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


1

R, 104 105 Bytes

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

Jede Sekunde wird (sollte) geprüft, ob wir am Ende einer Stunde sind, und dann diese Menge an BONGs ausgegeben.


Wann wird dieses Programm ausgegeben, wenn das Programm ausgeführt wird 12:00:01?
Kritixi Lithos

Ich kenne R nicht, aber das Programm muss innerhalb von 3 Sekunden nach Beginn der neuen Stunde ausgegeben werden. Ich bin mir nicht wirklich sicher, ob Sys.sleep(60)das möglich ist
Kritixi Lithos

Sie können ersetzen while(1)durch repeat.
Plannapus

Das Ruheintervall muss aus Gründen der Korrektheit kürzer als die Nachfrist nach der vollen Stunde sein. Wie wäre es mit Sys.sleep (2)?
Newcoder

1
@newcoder Jede Schleife ruht jetzt 1 Sekunde lang, da sie sonst BONG1 Sekunde lang anstatt nur einmal gedruckt würde . Dadurch wird sichergestellt, dass nur einmal pro Sekunde überprüft wird.
JAD

1

JavaScript ES2015, 100 99 98 96 94 88 Bytes

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

Erläuterung:

hist eine Funktion, die die auf 12 Stunden basierende Stunde des Tages mit dem Restoperator ( %12) abruft . 36e5ist die Anzahl der Millisekunden in einer Stunde, in der Zeichen mithilfe der Exponentialsyntax gespeichert werden. Der newOperator verlangt daher nicht, dass bei Funktionen Klammern verwendet werden, wenn keine Argumente vorhanden sind new Date. JavaScript hat nur Gleitkomma-Arithmetik. Der |bitweise OR-Operator erzwingt, dass die Zahl eine Ganzzahl ist, da bitweise JS-Operatoren mit der Ganzzahl-Teilmenge der durch IEEE 754-Gleitkomma dargestellten Zahlen arbeiten.

Das Komma kennzeichnet Unterausdrücke. pwird auf die aktuelle Stunde initialisiert ( p=h()).

for(;;)wird verwendet, um wiederholt zu prüfen, ob irgendwelche BONGs alarmiert werden sollen. Die Überprüfung erfolgt so schnell wie es die Laufzeit zulässt.

Wenn sich die Stunde geändert hat ( h()!=p), aktualisieren wir p und alarmieren dann das BONGs. Der logische AND-Operator wird als Guard verwendet (er schließt if kurz h()===p), um zu bestimmen, ob die BONGs ausgegeben werden.

String.prototype.repeatist neu in ES2015 und speichert einige Zeichen mit etwas wie ES5 Array.prototype.join.

hgibt für exakte Vielfache von 12 (dh 12 Uhr, 12 Uhr morgens) Null zurück, daher ändern wir es mit dem logischen ODER in 12 p||12.

Mit Dank an Kritixi Lithos und ETHProductions für die Ideen.


Ich denke, Sie können das letzte
Semikolon

1

Excel VBA, 143 Bytes

Code-Ausgaben in das VBE-Direktfenster

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

Spaßversion, 143 Bytes (nicht konkurrierend)

Während es ziemlich schwierig wäre, Excel für BONG zu bekommen, ist es ziemlich einfach, Excel für BONG zu bekommen Beep. Der BeepAnruf erzeugt einen Piepton und der folgende Code verwendet diesen, um Pieptöne zu erzeugen, die die Stunde in der Stunde angeben, getrennt durch Pausen von 1 Sekunde.

Wie oben, lässt dieser Code Excel nicht mehr reagieren, und es :DoEventswird empfohlen , einen Aufruf am Ende der ersten Zeile einzufügen, da dies die Benutzerfreundlichkeit verbessert. Dies ist jedoch für die korrekte Codeausführung nicht erforderlich.

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

Ungolfed Version

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

Ist es möglich, dies auf einem Nicht-Windows-Computer zu testen? Wenn nicht, können Sie ein GIF der Ausgabe bereitstellen, wenn eine neue Stunde beginnt?
Kritixi Lithos

Um ganz ehrlich zu sein, bin ich mir nicht sofort sicher. Es ist nicht möglich, diesen Code auf einem Linux-Computer zu testen, er sollte jedoch auf einem Mac ordnungsgemäß funktionieren. Es kann jedoch sein, dass die Beepoder DoEventsAnrufe auf Mac-Computern nicht richtig funktionieren.
Taylor Scott

0

C # 234 Bytes

Ich plane hier keine Preise zu gewinnen, aber eine C # -Implementierung ist obligatorisch.

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;}}}}

Ungolfed mit Kommentaren:

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
Verwenden Sie for(;;), ändern Sie h=()=>1+(DateTime.Now.Hour-1)%12;(notieren Sie auch kein Leerzeichen) und dann Enumerable.Repeat wird ("BONG",t)(spart entweder zwei oder drei) und entfernt dann zusätzliches Leerzeichen. if(...)Beachten Sie auch, dass hierdurch alle verketteten Bongs gedruckt werden mit einem Leerzeichen als erstes Argument.
Pinkfloydx33

0

Groovy, 72 Bytes

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

Wie?

Speichern Sie eine Methode, um die aktuellen Stunden abzurufen.

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

Speichern Sie die ersten Stunden.

y=x();

Wenn die aktuelle Stunde nicht der vorherigen Stunde entspricht, wird die aktuelle Stunde mit "BONG" multipliziert, um die aktuelle Stunde der Bongs auszugeben.

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

+3 Bytes %12für nichtmilitärische Bongs.


0

Perl, 60 Bytes

Aktualisieren

Ersetzt " "durch $", entfernt CORE::, korrigierte Anzahl.

Golf

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

Dies muss mit ausgeführt werden perl -E.

Bemerkungen

  • In Perl x while yist äquivalent zu while(y){x}(wobei xes sich um eine einzelne Anweisung handelt), benötigt jedoch keine eckigen Klammern. sleepwird das erste Mal ausgeführt, bevor etwas gedruckt wird.
  • timeverwendet UTC. Der ursprüngliche Big Ben ist von Ende März bis Ende Oktober in der Sommerzeit (British Summer Time, BST).
  • Zur Wartezeit wird eine Sekunde addiert, um sicherzustellen, dass das Programm mindestens eine Sekunde wartet. Dies bedeutet, dass die BONGs immer eine Sekunde zu spät gedruckt werden, was nach den Regeln zulässig ist. Nehmen wir an, Sie stehen auf der Westminster Bridge. 300 m von Big Ben entfernt. Auf der positiven Seite bedeutet dies auch, dass das Programm die richtige Anzahl von BONGs druckt, wenn es genau zu Beginn einer Stunde gestartet wird (anstatt 3600 Sekunden zu warten).
  • sleepGibt die Anzahl der Sekunden zurück, die gewartet wurde. Das wird immer wahr sein.

1
2 Dinge. 1 , ich bin mir ziemlich sicher, dass das -EFlag +1 Byte ist (irgendwo gibt es eine Seite über das Messen von Flags ...). 2 , ich bin nicht sicher, wie ich das ausführen soll, da es so perl -E golf.plaussieht, als würde es sofort beendet.
Redstarcoder

0

QBIC , 82 Bytes

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

Wirklich müssen Sie das Token für Code-Literale ( $) ändern und eine Teilzeichenfolge-Funktion implementieren ( left$(x,y)kann kürzer sein).

Das Innenleben:

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>

Update (NC): Der $Befehlssatz wird in QBICs nicht mehr verwendet, sodass er jetzt frei als Code für QBasic verwendet werden kann, ohne dass Code-Literale erforderlich sind. In diesem Fall werden 4 Bytes gespart, wodurch der QBIC auf 78 Bytes erhöht wird:

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 Bytes

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

Gibt große Mengen von "nachgestellten" Zeilenumbrüchen aus;)

Bearbeiten: 7 Bytes mit einem besseren 24-> 12-Stunden-Algorithmus gespeichert.


0

PHP, 63 Bytes

Ich könnte zwei weitere Bytes mit erweitertem ASCII speichern. Dafür bin ich aber momentan zu faul.

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

druckt die BONGs mit einem führenden Zeilenumbruch genau zur vollen Stunde. Laufen Sie mit -nr.


Sie müssen die Flaggen in Ihr bytecount aufnehmen
Kritixi Lithos

@KritixiLithos Nein, das tue ich nicht. -nist implizit (ignoriere php.und greife auf die Standardkonfigurationswerte zurück); -rWeist PHP an, Code von einem Befehlszeilenparameter anstatt von einer Datei auszuführen.
Titus

Ah, mein Schlechtes, ich kenne PHP nicht.
Kritixi Lithos

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();}

Lesbar:

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();
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.