Big Ben idzie BONG

45

Twoim zadaniem jest stworzenie programu, który ma naśladować Big Bena (Twitter) .

Zadanie

Za każdym razem, gdy zaczyna się nowa godzina (zgodnie z czasem lokalnym komputera lub czasem UTC), musisz podawać BONGpowtarzające się hourczasy (ze spacją między słowami). Na przykład, gdy jest godzina trzecia, musisz wyprowadzać dane BONG BONG BONG. Format czasu jest zgodny z 12-godzinnym formatem czasu, tzn. Po godzinie 12 mamy 1, a nie 13. Program / funkcja musi działać wiecznie.

Przykład:

nie wysyłaj rzeczy w nawiasach

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

Zasady

  • Każda seria BONGs musi być oddzielona nową linią
  • Wiodące / końcowe znaki nowej linii są dozwolone
  • Jednak spacje wiodące / końcowe nie są dozwolone
  • Przesyłanie musi trwać wiecznie
  • Twój wynik może być wydrukowany ± 3 sekundy od początku godziny
  • Być może nie przyjąć program do uruchomienia w każdej konkretnej godziny

To jest , więc wygrywa program z najkrótszą liczbą bajtów!

Kritixi Lithos
źródło
6
Testowanie tych zgłoszeń będzie zabawne ...: D
FlipTack
3
czy dla 12/24 drukujemy 0 bongów czy 12 bongów?
Maltysen,
6
+1 za wyzwanie, które nie jest łatwo zdominowane przez dedykowane języki gry w golfa.
Filipiny,
2
Jak powinien zachowywać się program, jeśli zegar systemowy został cofnięty przed rokiem 1859?
Amani Kilumanga,
3
Do testowania można użyć hakowania LD_PRELOAD, zastępującego funkcje czasowe: github.com/vi/timeskew . TIMESKEW="60 1"sprawia, że ​​minuty płyną jak sekundy.
Vi.

Odpowiedzi:

2

05AB1E , 43 bajty

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

Wypróbuj online! (lol to nie zadziała, upłynie limit czasu za 60 sekund. Pobierz do tego interpreter 05AB1E )

Wyjaśnienie:

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  

Zajęło mi to trochę czasu na golfa! Mogę trochę bardziej zagrać w golfa, ale to bije *><>, więc fajnie :)

Szybka wersja:

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

Poczeka jedną sekundę na starcie i jedną sekundę między BONG

Okx
źródło
Przepraszam za opóźnienie, w końcu udało mi się uruchomić Twój program lokalnie. Dobra robota, jest to szczególnie dobre dla esolang!
Kritixi Lithos
18

Grzmotnąć, 71, 70, 69 bajtów

EDYCJE:

  • Zoptymalizowano nieco obliczanie przedziału uśpienia, -1 bajt;
  • Zastąpiono backticks xargs, -1 bajt (Thanks @ jrtc27!).

Grał w golfa

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

Wyjaśniono

#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

Wersja testowa

Działa z minutami zamiast godzinami

sleep `date +60-%s%60|bc`;yes BONG|sed $(date +%I)q|xargs;exec $0
zepelin
źródło
2
@zeppeIin Dołączyłem do tej społeczności, której głównym celem było oddawanie Ci czci. Twoje rozwiązanie jest tak pełne podstępnych sztuczek, że wciąż yes BONG|sed 12q
kręcę się po niesamowitości
@neonzeon wow :)
zeppelin
Możesz ogolić 1 bajt z echa, przesyłając do xargs, który domyślnie wywołuje echo. 1 dla potoku + 5 dla xargs - 2 dla wstecznych - 4 dla echa - 1 dla spacji = -1 bajt.
jrtc27
@ jrtc27 To doskonała rada! Dziękuję Ci !
zeppelin
8

*> <> , 48 47 44 bajtów

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

Wypróbuj tutaj! ( lub ta wersja, która wykonuje test co minutę )

Daje to liczbę BONGs oddzieloną spacjami w zależności od godziny (a 13 to 1 itd.). Po finale nie ma spacji końcowych BONGi jest nowa linia spływowa.

Technicznie nie działa to wiecznie (ale w zasadzie tak się dzieje). Wycieka ~ 28 bajtów dziennie (ignorując narzut tłumacza ...). Wyciek 1GiB zajęłby około 105062 lat.

Zbliżając się do narzutu tłumacza, stos jest tylko kawałkiem float64s na tłumaczu Golanga. Więc po prostu 28*8wymyśliłem 224 bajty dziennie. Podzieliłem tę liczbę przez liczbę bajtów w gibibajcie (1073741824), a następnie 365, aby oszacować, że wyciek 1 GiB zajmie 13132,85 lat.

Uwaga na temat tłumaczy

Tłumacz online jest w JavaScript. Strona musi być otwarta i widoczna, aby mogła sprawdzić aktualny czas i wygenerować BONG. Golang interpretera ma takich ograniczeń.

Wyjaśnienie

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
redstarcoder
źródło
Jaka jest lokalna strefa czasowa dla tłumacza języka online? Ponieważ kiedy
nadeszła
@KritixiLithos, niestety dla tłumacza internetowego strona musi być otwarta i widoczna, aby działała. Myślę, że to ograniczenie Javascript / przeglądarki. Nie musisz się martwić, że jest on online, lub nie, ponieważ sam tłumacz jest w JavaScript, możesz go pobrać sam, jeśli chcesz! Tłumacz Golang działa jednak bez względu na wszystko. Przepraszam za niedogodności, zredaguję odpowiedź, aby to wyjaśnić.
redstarcoder
1
Gratulujemy wygranej w tym wyzwaniu! To jedyny golf-lang, który ukończył to wyzwanie i to imponujące :)
Kritixi Lithos
@KritixiLithos dzięki !! To pierwsze wyzwanie, które w ogóle wygrałem: D
redstarcoder
7

JavaScript (ES6), 99 93 bajtów

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

Wykorzystuje czas UTC (który odpowiada rzeczywistej rzeczy). Ze względu na niestabilny charakter kodu możesz wypróbować następujące czynności, które robią to samo, ale co 60 sekund:

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

f()

Oto dodatkowa 99-bajtowa wersja wykorzystująca czas lokalny:

f=_=>setTimeout('alert("BONG ".repeat(new Date().getHours()%12||12).trim(f()))',36e5-new Date%36e5)
ETHprodukcje
źródło
To (fragment) alerts dla mnie co minutę (ale liczba BONGs jest poprawna), ale program ma generować tylko co godzinę
Kritixi Lithos
@KritixiLithos „Ze względu na niestabilny charakter kodu możesz wypróbować następujące czynności, które robią to samo, ale co 60 sekund:” ;-)
ETHproductions
6

JavaScript (ES6), 125 123 117 115 bajtów

Dzięki @ Flp.Tkc za oszczędność 5 bajtów!

Dzięki @BenAston za oszczędność 2 dodatkowych bajtów!

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)

Kritixi Lithos
źródło
1
@BenAston Dzięki, że to zauważyłeś :)
Kritixi Lithos,
1
@BenAston To nie działa bez pierwszego średnika
Kritixi Lithos
5

Partia, 142 bajty

@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

Ponieważ plik działa jako nieskończona pętla, zaczynam z opóźnieniem 1s, ponieważ i tak potrzebuję go po bongach, co oszczędza cykle procesora. >nulJest umieszczony dokładnie zapisać bajt ( 1>nulspowodowałoby 1 do spożycia przez przekierowania). Następnie zapętlamy, dopóki minuty i sekundy nie będą równe zero. Bongi są konstruowane przez wzięcie ujemnego modulo godziny 12 i proszenie o ostatnie hznaki z ciągu 12 znaków. Kiedy hwynosi zero, to faktycznie daje nam cały ciąg, dlatego 12 bongów. Wystarczy więc zastąpić znaki słowem BONG. Po uruchomieniu wygląda mniej więcej tak (zwróć uwagę, że obraz nie zapętla się, więc musisz ponownie załadować, aby ponownie zobaczyć animację):

Przykładowe dane wyjściowe

Neil
źródło
Czy możesz podać gif z uruchomieniem i wyjściem?
Kritixi Lithos
1
@KritixiLithos Nie wiesz, czego tu szukasz; Mogę robić zrzuty ekranu przed godziną i po godzinie oraz dodawać opóźnienie do 11 minut w animowanym pliku GIF, ale nie wiem, jak to cokolwiek dowodzi.
Neil
Proszę o gif, ponieważ nie mogę go przetestować na moim komputerze (to Mac)
Kritixi Lithos
@KritixiLithos Coś w tym stylu OK?
Neil,
Dość dobrze,
uwierzę
5

Bash + Linux crontab, 90

Miałem nadzieję, że będzie to krótsze niż inne odpowiedzi powłoki. Mimo to uważam, że to ciekawe podejście:

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

Skrypt uruchamia się raz, wypełnia crontab, a następnie kończy działanie. Jednak dane wyjściowe z cronjobs są wysyłane do terminala, z którego skrypt został uruchomiony. Myślę, że to wystarcza, aby przesłanie musiało trwać wiecznie .

Ostrzeżenie - spowoduje to usunięcie wszystkich istniejących wpisów crontab, więc upewnij się, że masz już utworzone kopie zapasowe.

Działa to na Ubuntu 16.04, który domyślnie używa Vixie cron .

Cyfrowa trauma
źródło
Uruchomiłem go i dostałem trochę „poczty”. Kiedy sprawdzam pocztę, było jeszcze jedno, co było BONGkonieczne.
Kritixi Lithos
@KritixiLithos Thats odd. Jakiej dystrybucji Linux używasz? Których cronużywasz?
Cyfrowy uraz
Jestem na komputerze Mac, czekaj, to nie Linux
Kritixi Lithos
@KritixiLithos Yup ;-). Ta odpowiedź zależy od systemu Linux /proc/<PID>/fd/<N>.
Cyfrowy uraz
3

Ruby, 112 99 bajtów

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

Stara wersja

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

Dzięki QPaysTaxes za wskazówki

Jatin Dhankhar
źródło
@ Flp.Tkc O tak, niezły chwyt! Zapomniałem usunąć ostatni znak
Jatin Dhankhar,
Nie znam ruby, ale program musi wypisać się w ciągu 3 sekund od rozpoczęcia nowej godziny. Nie sądzę, żeby sleep(60)tak się stało
Kritixi Lithos,
@KritixiLithos Możemy uśpić program co 3 sekundy, a następnie wykonać pętlę obliczeniową -> Obudź co 3 sekundy; Sprawdź czas i rób rzeczy?
Jatin Dhankhar,
@JatinDhankhar Lub możesz spać przez 2 sekundy (tylko po to, aby dać trochę oddechu)
Kritixi Lithos
@KritixiLithos Tak, zmiana na 2 sekundy niż dzięki
Jatin Dhankhar,
3

Cheddar v1.0.5, 162 bajty

Cheddar nie ma wbudowanego czytnika czasu / czytnika wyjściowego cmd, więc musiałem improwizować!

Gra w golfa:

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

Nie golfowany:

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

Wyjaśnienie:

Z powodu ograniczonej standardowej biblioteki Cheddara musiałem użyć cmd do wygenerowania czasu. Zrobiłem to, zapisując wynik „time / t”, który drukuje czas w formacie 12-godzinnym, do pliku o nazwie „c”. IO.read zwraca bufor, który rzuciłem na ciąg i podzieliłem przez „:”, co zapewniało, że godzina jest zawsze w indeksie zero. Całą operację zapisałem w wyrażeniu lambda, które zaoszczędziło mi 44 bajty. Po tym punkcie następuje logika „jeśli przechowywana godzina nie jest równa bieżącej godzinie, ustaw poprzednią godzinę na bieżącą i wydrukuj BONG n razy, odetnij odstęp końcowy”.

Cheddar może nie jest najmniej gadatliwym językiem, ale znalezienie takich obejść może być zabawne!

Niestety jest to rozwiązanie tylko dla systemu Windows.

Edycja 1: Zapisałem dwa bajty, zastępując „0 <1” w warunku warunkowym „1” Nie spodziewałem się, że 1 oceni się jako prawda w tym języku!

Zavada
źródło
3

Rubin, 82 81 bajtów

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

Co sekundę sprawdzamy, czy jest to ostatnia sekunda godziny i odpowiednio BONG. Prawdopodobnie można by grać w golfa za pomocą brudnych sztuczek, ale nie znam zbyt wielu. Działa również inaczej niż inna odpowiedź Ruby.

Jeden bajt zaoszczędzony dzięki uprzejmości QPaysTaxes.

Borsunho
źródło
Musisz dostać się do Ruby. Wydaje się, że golf jest nieco mniej gadatliwy niż Python.
ElPedro,
Czy potrzebujesz miejsca zaraz po if?
Nic Hartley,
@QPaysTaxes Nie, dziękuję. Tak bardzo zwariowałem na punkcie kosmosu, putskiedy zapomniałem o tym.
Borsunho,
3

Python 2 , 105 106 bajtów

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

Edytować

Dodano jeden bajt, zmieniając <na! = Po informacji zwrotnej z @ pinkfloydx33. Dobre miejsce.

Testowane jak najwięcej lokalnie, ale nie działa na TIO, ponieważ (oczywiście) przekracza 60 sekundowy limit wykonania. Testuj lokalnie :-)

btw, utrata tego irytującego końcowego miejsca kosztowała mnie 7 bajtów, w przeciwnym razie byłoby to poniżej 100.

W przypadku braku TIO tutaj jest generowane po odczekaniu godziny. Program Prog został uruchomiony o 15:27 z dodatkowym kodem debugowania, który pokazuje czas wydruku (format 12-godzinny).

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

Całkiem proste, ale oto wyjaśnienie dla każdego, kto jest zainteresowany.

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
ElPedro
źródło
1
Możesz po prostu sprawdzić, czy minuty wynoszą 0: l [4] == 0 i h <c.
Carra,
Teraz, gdy o tym myślę, jest mały problem, że nie działa, jeśli uruchomisz stoper o godzinie 20:00:01. Minuty będą wynosić zero, sekundy nie, i wydrukuje bongi
Carra
To nie wyświetla niczego, gdy uruchomiłem to lokalnie
Kritixi Lithos
@KritixiLithos Nie mam pojęcia, dlaczego nie otrzymujesz danych wyjściowych. Używam Ubuntu 14 i Python 2.7.9. Chcesz porozmawiać o tym na czacie?
ElPedro,
2
Czy to działa od 11h do 12h. (12% 12 = 0)? Wygląda na to 11>0, h>cczy coś mi brakuje?
pinkfloydx33
3

Python 3 - 100 97 92 bajty

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

Wyjaśnienie:

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
Carra
źródło
from time import*<NL>while 1:x=3600;sleep(x-time()%x);print(('BONG '*int(strftime("%I")))[:-1]) ma 93 bajty
Roman Gräf
Nie sądzę, żebyś potrzebował średnika na końcu pierwszego wiersza.
Nic Hartley,
Usunięto końcowe;
Carra
92 bajty, jeśli tak from time import*, to
FlipTack
Dzięki za wskazówkę, dodałem go. Codzienne uczenie się nowych rzeczy o Pythonie :)
Carra
2

C, 238 bajtów

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

Nie jestem pewien, czy to działa poprawnie i jestem mobilny, a mój telefon nie ma kompilatora C. (Działa tylko na systemach typu UNIX)

betseg
źródło
To
dało
@KritixiLithos tak, zapomniałem usunąć część, z której już nie korzystam. Czy możesz przetestować w 7 minut? :)
betseg
fzamiast main? Jak to ma działać?
Thomas Padron-McCarthy
1
@ ThomasPadron-McCarthy Jestem całkiem pewien, że zapewnianie funkcji, w przeciwieństwie do pełnego programu, jest w porządku.
Nic Hartley,
2

sh, 66 bajtów

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

Wyjaśniono

#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}
Rainer P.
źródło
Drukuje się natychmiast po uruchomieniu programu, nie powinien tego robić. Program musi zostać uruchomiony dopiero po rozpoczęciu nowej godziny
Kritixi Lithos
Ten sam problem nadal pojawia się
Kritixi Lithos
@KritixiLithos My bad. Zaktualizowałem tylko wyjaśnienie i liczbę bajtów, a nie rzeczywisty kod.
Rainer P.,
Teraz pozostało mi tylko przetestować go o godzinie
Kritixi Lithos
@KritixiLithos Wymień %Iz %Mi działa przez kilka minut.
Rainer P.,
1

C, 198 bajtów

#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");}}
Steadybox
źródło
1

JavaScript ES6 87 bajtów

Edycja: bezwstydnie pożyczyłem new Date/36e5%12|0||12kod @ETHProductions, aby zaoszczędzić 6 bajtów

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

Kuilin Li
źródło
1

R 104 104 bajtów

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

Co sekundę będzie (powinien) sprawdzać, czy jesteśmy pod koniec godziny, a następnie wydrukować tę liczbę sekund BONG.

JAD
źródło
Kiedy program uruchomi się, gdy program zostanie uruchomiony 12:00:01?
Kritixi Lithos,
Nie znam R, ale program musi wyjść w ciągu 3 sekund od rozpoczęcia nowej godziny. Nie jestem do końca pewien, czy Sys.sleep(60)tak się stanie
Kritixi Lithos,
Można zastąpić while(1)przez repeat.
plannapus,
Interwał snu musi być krótszy niż okres karencji po godzinie dla poprawności. Co powiesz na Sys.sleep (2)?
newcoder
1
@newcoder Każda pętla śpi teraz przez 1 sekundę, ponieważ w przeciwnym razie drukowałaby BONGprzez 1 sekundę, a nie tylko raz. Ma to na celu zapewnienie, że sprawdza tylko raz na sekundę.
JAD
1

JavaScript ES2015, 100 99 98 96 94 88 bajtów

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

Wyjaśnienie:

h to funkcja, która pobiera 12-godzinną godzinę dnia za pomocą operatora reszty (%12 ). 36e5to liczba milisekund w ciągu jednej godziny przy użyciu składni wykładniczej do zapisywania znaków. newOperator nie wymaga, nawiasy są używane funkcje, jeśli istnieją żadne argumenty, stąd new Date. JavaScript ma tylko arytmetykę zmiennoprzecinkową, |bitowy operator OR wymusza liczbę całkowitą, ponieważ bitowe operatory JS działają z podzbiorem liczb całkowitych liczb reprezentowanych przez zmiennoprzecinkowy IEEE 754.

Przecinek określa podwyrażenia. pjest inicjowany na bieżącą godzinę ( p=h()).

for(;;)służy do wielokrotnego sprawdzania, czy ktoś BONGpowinien zostać ostrzeżony. Sprawdzanie odbywa się tak szybko, jak pozwala na to środowisko wykonawcze.

Jeśli godzina się zmieniła ( h()!=p), aktualizujemy p, a następnie powiadamiamy BONGs. Logiczny operator AND służy jako osłona (powoduje zwarcie, jeślih()===p ) w celu ustalenia, czy BONGs są wyprowadzane.

String.prototype.repeat jest nowością w ES2015 i ratuje niektóre postacie przed użyciem czegoś takiego jak ES5 Array.prototype.join .

hzwraca zero dla dokładnych wielokrotności 12 (tj. 12:00, 12:00), więc zmieniamy go na 12 za pomocą logicznego OR p||12.

Dzięki Kritixi Lithos i ETHProductions za pomysły.

Ben
źródło
Myślę, że możesz usunąć ostatni średnik
Kritixi Lithos
1

Excel VBA, 143 bajty

Kod wysyła do okna natychmiastowego 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

Zabawna wersja, 143 bajtów (niekonkurencyjna)

Chociaż trudno byłoby uzyskać wyróżnienie na BONG, jest całkiem proste, aby uzyskać wyróżnienie na start Beep. BeepPołączenia wytwarza sygnał dźwiękowy, a kod poniżej zastosowań to wytwarzają sygnałów wskazujących na godzinę, na godzinę, oddzielonych przerwami co 1 sekundę.

Tak jak w przypadku powyższego, kod ten powoduje, że program Excel nie wydaje się odpowiadać, dlatego :DoEventszalecane jest dodanie wywołania na końcu pierwszego wiersza, ponieważ poprawia to wrażenia użytkownika, jednak nie jest to konieczne do poprawnego wykonania kodu.

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

Wersja bez golfa

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
Taylor Scott
źródło
Czy można to przetestować na komputerze innym niż Windows? Jeśli nie, czy możesz podać gif wyjścia, gdy zaczyna się nowa godzina?
Kritixi Lithos
Szczerze mówiąc, nie jestem od razu pewien. Nie będzie można przetestować tego kodu na komputerze z systemem Linux, ale powinien on poprawnie działać na komputerze Mac. Może się jednak zdarzyć, że połączenia Beeplub DoEventsPołączenia nie działają poprawnie na komputerach Mac.
Taylor Scott
0

C # 234 bajtów

Nie planuję tutaj wygrywać żadnych nagród, ale implementacja C # jest obowiązkowa.

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

Niegolfowany z komentarzami:

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
        }
    }
}
Pharap
źródło
1
Użyj for(;;), zmień h=()=>1+(DateTime.Now.Hour-1)%12;(zauważ też, że nie ma białych znaków), a następnie Wylicz. Powtórz staje się ("BONG",t)(oszczędza dwa lub trzy), a następnie pozbądź się dodatkowych białych znaków, tj. if(...)Zwróć też uwagę, że to wydrukuje wszystkie połączone bongi, prawdopodobnie weź te oszczędności bajtów, aby przekształcić concat w złączenie ze spacją jako pierwszym argumentem.
pinkfloydx33
0

Groovy, 72 bajty

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

W jaki sposób?

Zapisz metodę, aby uzyskać bieżące godziny.

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

Przechowuj początkowe godziny.

y=x();

Chociaż prawda, jeśli bieżąca godzina nie jest równa poprzedniej godzinie, bieżąca godzina wyjściowa jest pomnożona przez „BONG”, aby wyprowadzić bieżącą godzinę bonga.

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

+3 bajty %12dla niewojskowych bongów.

Urna Magicznej Ośmiornicy
źródło
0

perl, 60 bajtów

Aktualizacja

Zastąpione " "z $", usunięte CORE::, skorygowanej liczby.

Golf

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

Trzeba to uruchomić perl -E.

Uwagi

  • W perlu x while yjest równoważne while(y){x}(gdzie xjest pojedynczą instrukcją), ale nie potrzebuje nawiasów. sleepjest wykonywany po raz pierwszy, zanim cokolwiek zostanie wydrukowane.
  • timeużywa UTC. Oryginalny Big Ben jest w okresie letnim (British Summer Time, BST) od końca marca do końca października.
  • Jedna sekunda jest dodawana do czasu oczekiwania, aby zapewnić, że program czeka co najmniej jedną sekundę. Oznacza to, że BONGy będą zawsze drukowane z opóźnieniem sekundowym, co jest zgodne z prawem zgodnie z przepisami. Powiedzmy, że stoisz na Westminster Bridge, ok. 300 m od Big Bena. Na plus oznacza to również, że program wydrukuje prawidłową liczbę BONGów, jeśli zostanie uruchomiony dokładnie na początku godziny (zamiast czekać 3600 sekund).
  • sleepzwraca liczbę sekund oczekiwania. To zawsze będzie prawda.
cfaerber
źródło
1
2 rzeczy. 1 , jestem prawie pewien, że -Eflaga ma +1 bajt (gdzieś jest strona o pomiarze flag ...). 2 , nie jestem pewien, jak uruchomić to, jak się perl -E golf.plwydaje, aby natychmiast zakończyć.
redstarcoder
0

QBIC , 82 bajty

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

Naprawdę trzeba zmienić token literałów kodu ( $) i zaimplementować funkcję podciągów (left$(x,y) może być krótsza).

Wewnętrzne funkcjonowanie:

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>

Aktualizacja (NC): Nie $jest już używany w zestawie instrukcji QBIC, więc można go teraz swobodnie używać jako kodu dla QBasic bez konieczności literałów kodu. W takim przypadku zapisuje 4 bajty, co powoduje zwiększenie QBIC do 78 bajtów:

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
Steenbergh
źródło
0

SmileBASIC, 74 67 bajtów

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

Wyprowadza duże ilości łamanych linii;)

Edycja: zapisano 7 bajtów dzięki lepszemu algorytmowi 24-> 12 godzin.

12Me21
źródło
0

PHP, 63 bajty

Mógłbym zapisać jeszcze dwa bajty z rozszerzonym ASCII. Ale obecnie jestem na to zbyt leniwy.

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

drukuje BONGy z wiodącym podziałem linii dokładnie o pełnej godzinie. Uruchom z -nr.

Tytus
źródło
Musisz umieścić flagi na swoim bytecount
Kritixi Lithos
@KritixiLithos Nie, ja nie. -njest rodzajem niejawnym (zignoruj ​​php. i powróć do domyślnych wartości konfiguracji); -rkaże PHP uruchamiać kod z parametru wiersza poleceń zamiast z pliku.
Tytus
Ach, mój zła, nie znam PHP.
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();}

Czytelny:

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();
}
Albert Renshaw
źródło