Big Ben berjalan BONG

45

Tugas Anda adalah membuat program yang meniru Big Ben (Twitter) .

Tugas

Kapan pun jam baru telah dimulai (sesuai dengan waktu lokal atau UTC komputer Anda), Anda harus menampilkan waktu yang BONGberulang hour(dengan spasi di antara kata-kata). Misalnya, ketika jam 3, Anda harus output BONG BONG BONG. Format waktu mengikuti format waktu 12 jam, yaitu setelah jam 12, kami memiliki 1 dan bukan 13. Program / fungsi harus berjalan selamanya.

Contoh:

jangan mengeluarkan barang di dalam tanda kurung

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

Aturan

  • Setiap seri BONGs harus dipisahkan oleh baris baru
  • Leading / trailing newlines diperbolehkan
  • Namun terkemuka / tertinggal ruang yang tidak diperbolehkan
  • Pengajuan harus berjalan selamanya
  • Output Anda dapat dicetak ± 3 detik dari awal jam
  • Anda tidak boleh menganggap program dijalankan pada jam tertentu

Ini adalah , sehingga program dengan bytecount terpendek menang!

Kritixi Lithos
sumber
6
Menguji kiriman ini akan menyenangkan ...: D
FlipTack
3
untuk 12/24 kita mencetak 0 bong atau 12 bong?
Maltysen
6
+1 untuk tantangan yang tidak mudah didominasi oleh bahasa kode-golf khusus.
Philipp
2
Bagaimana seharusnya program berperilaku jika jam sistem kembali ke sebelum 1859?
Amani Kilumanga
3
Untuk pengujian, seseorang dapat menggunakan fungsi waktu override LD_PRELOAD hack: github.com/vi/timeskew . TIMESKEW="60 1"membuat menit mengalir seperti detik.
Vi.

Jawaban:

2

05AB1E , 43 byte

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

Cobalah online! (lol ini tidak akan berfungsi, akan habis dalam 60 detik. Unduh juru bahasa 05AB1E untuk ini)

Penjelasan:

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  

Butuh beberapa saat untuk bermain golf! Saya mungkin bisa bermain golf sedikit lebih banyak, tetapi itu berdetak *><>, jadi itu keren :)

Versi cepat:

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

Akan menunggu satu detik saat mulai, dan satu detik di antara BONG

Okx
sumber
Maaf atas keterlambatan, saya akhirnya harus menjalankan program Anda secara lokal. Bagus, ini sangat bagus untuk esolang!
Kritixi Lithos
18

Pesta, 71, 70, 69 byte

EDIT:

  • Mengoptimalkan perhitungan interval tidur sedikit, -1 byte;
  • Backticks yang diganti dengan xargs, -1 byte (Terima kasih @ jrtc27!).

Golf

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

Dijelaskan

#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

Versi Uji

Bekerja dengan menit, bukan jam

sleep `date +60-%s%60|bc`;yes BONG|sed $(date +%I)q|xargs;exec $0
zeppelin
sumber
2
@zeppeIin Saya bergabung dengan komunitas ini dengan tujuan utama untuk menyembah Anda. Solusi Anda begitu penuh dengan trik licik saya masih terhuyung-huyung dari kedahsyatan - terutamayes BONG|sed 12q
neonzeon
@neonzeon wow :)
zeppelin
Anda dapat mencukur 1 byte dari gema dengan mem-piping ke xargs, yang memanggil gema secara default. 1 untuk pipa + 5 untuk xargs - 2 untuk backticks - 4 untuk gema - 1 untuk ruang = -1 byte.
jrtc27
@ jrtc27 Itu saran yang bagus! Terima kasih !
zeppelin
8

*> <> , 48 47 44 byte

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

Coba di sini! ( atau versi ini yang melakukannya setiap menit untuk pengujian )

Ini menghasilkan sejumlah BONGs yang dipisahkan oleh spasi berdasarkan jam berapa (dan 13 adalah 1, dll). Tidak ada spasi tambahan setelah final BONG, dan ada baris tambahan.

Secara teknis ini tidak berjalan selamanya (tetapi pada dasarnya tidak). Bocor ~ 28 byte per hari (mengabaikan overhead juru ...). Butuh ~ 105062 tahun untuk bocor 1GiB.

Mendekati untuk overhead juru, tumpukan hanya seiris dari float64pada penerjemah Golang. Jadi saya hanya 28*8membuat 224 byte per hari. Saya membagi angka ini dengan jumlah byte dalam gibibyte (1073741824) kemudian 365 untuk memperkirakan bahwa akan dibutuhkan 13132,85 tahun untuk bocor 1 GiB.

Perhatikan tentang penerjemah

Penerjemah online dalam Javascript. Halaman harus terbuka dan terlihat untuk memeriksa waktu saat ini dan output BONG. The Golang interpreter tidak memiliki batasan seperti itu.

Penjelasan

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
sumber
Apa zona waktu lokal untuk juru bahasa online? Karena ketika satu jam baru tiba untuk saya, itu tidak menghasilkan apa
Kritixi Lithos
@KritixiLithos, sayangnya untuk penerjemah online, halaman harus terbuka dan terlihat agar berfungsi. Saya pikir ini adalah batasan Javascript / browser. Anda tidak perlu khawatir tentang itu sedang online atau tidak karena penerjemah itu sendiri dalam Javascript, Anda bisa mengunduhnya sendiri jika Anda mau! Interpreter Golang bekerja terlepas dari apa pun juga. Maaf atas ketidaknyamanan ini, saya akan mengedit jawaban untuk menjelaskannya.
redstarcoder
1
Selamat telah memenangkan tantangan ini! Ini adalah satu - satunya golf yang menyelesaikan tantangan ini dan itu mengesankan :)
Kritixi Lithos
@KritixiLithos terima kasih !! Ini adalah tantangan pertama yang saya menangkan: D
redstarcoder
7

JavaScript (ES6), 99 93 byte

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

Ini menggunakan waktu UTC (yang sejalan dengan hal yang sebenarnya). Karena sifat kode yang tidak dapat diuji, Anda dapat mencoba yang berikut ini yang melakukan hal yang sama, tetapi setiap 60 detik:

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

f()

Berikut adalah bonus versi 99-byte yang menggunakan waktu lokal:

f=_=>setTimeout('alert("BONG ".repeat(new Date().getHours()%12||12).trim(f()))',36e5-new Date%36e5)
Produksi ETH
sumber
Ini (cuplikan) alertsetiap menit untuk saya (tetapi jumlah BONGs benar), tetapi program ini seharusnya hanya menghasilkan setiap jam
Kritixi Lithos
@KritixiLithos "Karena sifat kode yang tidak dapat diuji, Anda dapat mencoba yang berikut ini melakukan hal yang sama, tetapi setiap 60 detik:" ;-)
ETHproduksi
6

JavaScript (ES6), 125 123 117 115 byte

Terima kasih kepada @ Flp.Tkc untuk menghemat 5 byte!

Terima kasih kepada @BenAston karena telah menghemat 2 byte lagi!

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

Snippet Snack

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

Kritixi Lithos
sumber
1
@BenAston Terima kasih telah memperhatikan hal itu :)
Kritixi Lithos
1
@ BenAston Tidak berfungsi tanpa semi-kolon pertama
Kritixi Lithos
5

Batch, 142 byte

@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

Karena file berjalan sebagai infinite loop, saya mulai dengan penundaan 1s, karena saya memerlukannya setelah bong, dan ini menghemat siklus CPU. Itu >nuldiposisikan dengan hati-hati untuk menyimpan byte ( 1>nulakan menyebabkan 1 dimakan oleh redirection). Kami kemudian mengulang sampai menit dan detik nol. Roti dibangun dengan mengambil jam negatif modulo 12, dan meminta hkarakter terakhir dari string 12 karakter. Kapan hnol ini sebenarnya memberi kita seluruh string, oleh karena itu 12 bong. Itu sudah cukup untuk mengganti karakter dengan kata BONG. Saat dijalankan tampilannya seperti ini (perhatikan bahwa gambar tidak berulang, jadi Anda harus memaksa memuat ulang untuk melihat animasi lagi):

Output Sampel

Neil
sumber
Bisakah Anda memberikan gif dari itu berjalan dan keluaran?
Kritixi Lithos
1
@KritixiLithos Tidak yakin apa yang Anda cari di sini; Saya dapat mengambil tangkapan layar dari sebelum dan sesudah satu jam dan menambahkan penundaan hingga 11 menit dalam GIF animasi tetapi saya tidak melihat bagaimana itu membuktikan apa pun.
Neil
Saya meminta gif karena saya tidak dapat mengujinya di komputer saya (ini mac)
Kritixi Lithos
@ KritixiLithos Sesuatu seperti ini OK?
Neil
Cukup bagus, saya akan mengambil kata-kata Anda :)
Kritixi Lithos
5

Bash + Linux crontab, 90

Saya berharap ini akan lebih pendek dari jawaban shell lainnya. Namun, saya pikir ini pendekatan yang menarik:

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

Script berjalan sekali, mengisi crontab, lalu keluar. Namun, output dari cronjobs dikirim ke terminal tempat skrip dijalankan. Saya pikir ini memenuhi pengajuan harus berjalan selamanya persyaratan.

Peringatan - ini akan menghapus semua entri crontab yang ada, jadi pastikan Anda sudah membuat cadangan.

Ini berfungsi pada Ubuntu 16.04, yang menggunakan Vixie cron secara default.

Trauma Digital
sumber
Saya menjalankannya dan mendapat beberapa "surat". Ketika saya checkout keluar surat, ada satu lagi yang BONGdiperlukan.
Kritixi Lithos
@KritixiLithos Itu aneh. Distro Linux mana yang Anda gunakan? Yang cronkamu gunakan
Trauma Digital
Saya menggunakan mac, tunggu, itu bukan Linux
Kritixi Lithos
@KritixiLithos Yup ;-). Jawaban ini bergantung pada Linux /proc/<PID>/fd/<N>.
Trauma Digital
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}

Versi lama

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

Terima kasih kepada QPaysTaxes untuk tipsnya

Jatin Dhankhar
sumber
@ Flp.Tkc Oh ya, tangkapan bagus! Lupa untuk menghapus karakter terakhir
Jatin Dhankhar
Saya tidak tahu ruby, tetapi program harus keluar dalam 3 detik dari awal jam baru. Saya tidak berpikir sleep(60)membuat itu terjadi
Kritixi Lithos
@KritixiLithos Kita dapat membuat program tidur selama setiap 3 detik dan kemudian melakukan loop caculation -> Bangun setiap 3 Detik; Periksa waktu dan lakukan sesuatu?
Jatin Dhankhar
@JatinDhankhar Atau Anda dapat membuatnya tidur selama 2 detik (hanya untuk memberikan ruang bernapas)
Kritixi Lithos
@KritixiLithos Ya, membuat perubahan menjadi 2 detik dari Terima kasih
Jatin Dhankhar
3

Cheddar v1.0.5, 162 byte

Cheddar tidak memiliki pembaca waktu bawaan / pembaca output cmd, jadi saya harus berimprovisasi!

Golf:

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

Tidak Disatukan:

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

Penjelasan:

Karena perpustakaan standar Cheddar yang terbatas, saya harus menggunakan cmd untuk menghasilkan waktu. Saya melakukan ini dengan menyimpan output "time / t", yang mencetak waktu dalam format 12 jam, ke file bernama "c". IO.read mengembalikan buffer yang saya masukkan ke string dan dibagi dengan ":" yang memastikan bahwa jam selalu dalam indeks nol. Saya menyimpan seluruh operasi itu menjadi ekspresi lambda yang menyelamatkan saya 44 byte. Setelah titik itu masuk ke logika "jika jam yang disimpan tidak sama dengan jam saat ini, atur jam sebelumnya ke saat ini dan cetak BONG n kali, potong ruang trailing."

Cheddar mungkin bukan bahasa yang paling tidak jelas tetapi bisa menyenangkan untuk menemukan solusi seperti ini!

Sayangnya ini adalah solusi Windows saja.

Sunting 1: Disimpan dua byte dengan mengganti "0 <1" pada kondisi-ke "1" Saya tidak berharap 1 untuk mengevaluasi true dalam bahasa ini!

Zavada
sumber
3

Ruby, 82 81 byte

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

Setiap detik kami memeriksa apakah ini detik terakhir, dan BONG sesuai dengan itu. Mungkin bisa bermain golf lebih jauh dengan beberapa trik kotor, tetapi saya tidak tahu terlalu banyak. Juga berfungsi berbeda dari jawaban Ruby lainnya.

Satu byte disimpan berkat courtesy of QPaysTaxes.

Borsunho
sumber
Perlu masuk ke Ruby. Tampaknya sedikit kurang verbose daripada Python untuk bermain golf.
ElPedro
Apakah Anda membutuhkan ruang segera setelahnya if?
Nic Hartley
@ QPaysTaxes saya tidak, terima kasih. Saya sangat marah tentang ruang setelah putssaya lupa tentang itu.
Borsunho
3

Python 2 , 105 106 byte

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

Sunting

Ditambahkan satu byte dengan mengubah <to! = Setelah umpan balik dari @ pinkfloydx33. Tempat yang bagus.

Diuji sebanyak mungkin secara lokal tetapi tidak bekerja pada TIO karena (jelas) melebihi batas eksekusi 60 detik. Silakan uji secara lokal :-)

btw, kehilangan ruang trailing sial saya biaya 7 byte kalau tidak ini akan berada di bawah 100.

Dengan tidak adanya TIO di sini adalah output setelah menunggu satu jam. Prog dimulai pada 15:27 dengan kode debug tambahan untuk menunjukkan waktu cetak (format 12 jam).

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

Cukup mudah tetapi di sini ada penjelasan untuk siapa saja yang tertarik.

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
sumber
1
Anda bisa mengecek apakah menitnya 0: l [4] == 0 dan h <c.
Carra
Sekarang saya memikirkannya, ada masalah kecil yang tidak berfungsi jika Anda memulai timer pada 20:00:01. Menit akan menjadi nol, detik tidak dan itu akan mencetak roti
Carra
Ini tidak menghasilkan apa-apa ketika saya menjalankannya secara lokal
Kritixi Lithos
@ KritixiLithos Tidak tahu mengapa Anda tidak mendapatkan output. Saya di Ubuntu 14 dan Python 2.7.9. Ingin mengambil ini untuk mengobrol untuk membahas lebih lanjut?
ElPedro
2
Apakah ini bekerja dari 11 jam -> 12 jam. (12% 12 = 0)? Sepertinya 11>0, jadi h>catau aku kehilangan sesuatu?
pinkfloydx33
3

Python 3 - 100 97 92 byte

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

Penjelasan:

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
sumber
from time import*<NL>while 1:x=3600;sleep(x-time()%x);print(('BONG '*int(strftime("%I")))[:-1]) is 93 bytes
Roman Gräf
Saya rasa Anda tidak perlu titik koma di akhir baris pertama.
Nic Hartley
Menghapus trailing;
Carra
92 byte jika Anda melakukannya from time import*, seperti ini
FlipTack
Terima kasih atas tipnya, saya telah menambahkannya. Mempelajari hal-hal baru tentang Python setiap hari :)
Carra
2

C, 238 byte

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

Saya tidak yakin apakah ini berfungsi dengan benar, dan saya mobile, dan ponsel saya tidak memiliki kompiler C. (Hanya bekerja pada sistem seperti UNIX)

betseg
sumber
Ini menghasilkan keluaran tanpa batas (baris baru) ketika saya mencobanya
Kritixi Lithos
@ KritixiLithos ya, saya lupa menghapus bagian yang tidak saya gunakan lagi. Bisakah Anda menguji dalam 7 menit? :)
betseg
fbukan main? Bagaimana cara kerjanya?
Thomas Padron-McCarthy
1
@ ThomasPadron-McCarthy Saya cukup yakin bahwa menyediakan fungsi, sebagai lawan dari program lengkap, baik-baik saja.
Nic Hartley
2

sh, 66 byte

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

Dijelaskan

#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.
sumber
Ini mencetak segera setelah program dijalankan, seharusnya tidak melakukan itu. Program ini hanya akan menampilkan ketika jam baru telah dimulai
Kritixi Lithos
Masalah yang sama masih muncul
Kritixi Lithos
@ KritixiLithos Saya buruk. Saya hanya memperbarui penjelasan dan jumlah byte, bukan kode sebenarnya.
Rainer P.
Sekarang semua yang tersisa adalah bagi saya untuk mengujinya pada jam
Kritixi Lithos
@KritixiLithos Ganti %Idengan %Mdan berfungsi selama beberapa menit.
Rainer P.
1

C, 198 byte

#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
sumber
1

Javascript ES6 87 byte

Sunting: Meminjam new Date/36e5%12|0||12kode @ETHProductions tanpa malu-malu untuk menghemat 6 byte

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

Kuilin Li
sumber
1

R, 104 105 byte

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

Setiap detik, itu akan (harus) menguji apakah kita berada di akhir jam, lalu mencetak jumlah BONGitu.

JAD
sumber
Kapan output program ini saat program dijalankan 12:00:01?
Kritixi Lithos
Saya tidak tahu R, tetapi program harus menampilkan dalam 3 detik dari awal jam baru. Saya tidak begitu yakin apakah Sys.sleep(60)itu bisa terjadi
Kritixi Lithos
Anda bisa menggantinya while(1)dengan repeat.
plannapus
Interval tidur harus lebih pendek dari masa tenggang setelah satu jam untuk pembenaran. Bagaimana dengan Sys.sleep (2)?
newcoder
1
@newcoder Setiap loop saat ini tidur selama 1 detik, karena jika tidak maka akan mencetak BONGselama 1 detik, bukan hanya sekali. Ini untuk memastikan hanya memeriksa sekali per detik.
JAD
1

JavaScript ES2015, 100 99 98 96 94 88 byte

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

Penjelasan:

hadalah fungsi yang mendapatkan jam berbasis 12 jam dalam sehari menggunakan operator sisa ( %12). 36e5adalah jumlah milidetik dalam satu jam menggunakan sintaksis eksponensial untuk menyimpan karakter. The newoperator tidak mengharuskan kurung digunakan dengan fungsi jika tidak ada argumen, maka new Date. JavaScript hanya memiliki aritmatika titik mengambang, |operator bitwise ATAU memaksa angka menjadi bilangan bulat karena operator bitwise JS bekerja dengan subset bilangan bulat dari angka yang diwakili oleh floating point IEEE 754.

Koma menggambarkan sub-ekspresi. pdiinisialisasi ke jam saat ini ( p=h()).

for(;;)digunakan untuk memeriksa berulang kali apakah ada BONGyang harus disiagakan. Pemeriksaan dilakukan secepat runtime mengizinkan.

Jika jam telah berubah ( h()!=p), maka kami memperbarui p dan kemudian mengingatkan BONG. Operator logika AND digunakan sebagai pelindung (sirkuit pendek jika h()===p) untuk menentukan apakah BONGs adalah output.

String.prototype.repeatbaru di ES2015 dan menyimpan beberapa karakter menggunakan sesuatu seperti ES5 Array.prototype.join.

hmengembalikan nol untuk kelipatan tepat 12 (yaitu 12 siang, 12 pagi), jadi kami mengubahnya ke 12 menggunakan logika OR p||12.

Dengan terima kasih kepada Kritixi Lithos dan ETHProduk untuk ide-ide.

Ben
sumber
Saya pikir Anda dapat menghapus semi-colon terakhir
Kritixi Lithos
1

Excel VBA, 143 Bytes

Output Kode ke Jendela Segera 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

Versi menyenangkan, 143 Bytes (Tidak Bersaing)

Meskipun akan lebih sulit untuk mendapatkan yang terbaik untuk pergi BONG, itu cukup mudah untuk mendapatkan yang terbaik untuk pergi Beep. The Beeppanggilan menghasilkan bunyi 'bip', dan kode di bawah menggunakan ini untuk menghasilkan beep menunjukkan jam, pada jam, dipisahkan oleh 1 jeda kedua.

Seperti di atas, kode ini membuat excel tampak tidak responsif dan menambahkan :DoEventspanggilan ke akhir baris pertama direkomendasikan karena meningkatkan pengalaman pengguna, namun, ini tidak diperlukan untuk eksekusi kode yang benar.

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

Versi Tidak Serigala

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
sumber
Apakah mungkin untuk menguji ini pada komputer non-Windows? Jika tidak, dapatkah Anda memberikan gif output ketika jam baru dimulai?
Kritixi Lithos
Sejujurnya, saya tidak segera yakin. Ini tidak akan mungkin untuk menguji kode ini pada mesin linux, tetapi harus berfungsi dengan baik pada Mac. Namun, mungkin saja bahwa Panggilan Beepatau DoEventstidak berfungsi dengan benar pada mesin mac.
Taylor Scott
0

C # 234 Bytes

Saya tidak berencana memenangkan hadiah apa pun di sini, tetapi implementasi C # adalah wajib.

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

Tidak dikoleksi dengan komentar:

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
sumber
1
Gunakan for(;;), ubah h=()=>1+(DateTime.Now.Hour-1)%12;(catat tidak ada spasi putih juga) dan kemudian Enumerable. Ulangi menjadi ("BONG",t)(menghemat Anda dua atau tiga) lalu singkirkan spasi ekstra yaitu if(...)Perhatikan juga ini akan mencetak semua bong yang digabungkan, mungkin mengambil byte tabungan tersebut untuk mengubah concat menjadi gabung dengan spasi sebagai argumen pertama.
pinkfloydx33
0

Groovy, 72 byte

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

Bagaimana?

Simpan metode untuk mendapatkan jam saat ini.

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

Simpan jam awal.

y=x();

Sementara benar, jika jam saat ini tidak sama dengan jam sebelumnya, jam keluaran saat ini dikalikan dengan "BONG" untuk menampilkan jam saat ini dari bong.

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

+3 byte %12untuk bong non-militer.

Guci Gurita Ajaib
sumber
0

perl, 60 byte

Memperbarui

Diganti " "dengan $", dihapusCORE:: , jumlah dikoreksi.

Golf

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

Ini perlu dijalankan perl -E .

Catatan

  • Dalam perl, x while ysetara dengan while(y){x}(di mana xsatu pernyataan) tetapi tidak membutuhkan tanda kurung.sleepdieksekusi pertama kali sebelum sesuatu dicetak.
  • timemenggunakan UTC. Big Ben asli ada di waktu musim panas (British Summer Time, BST) dari akhir Maret hingga akhir Oktober.
  • Satu detik ditambahkan ke waktu tunggu untuk memastikan bahwa program menunggu setidaknya satu detik. Ini berarti bahwa BONG akan selalu dicetak terlambat satu detik, yang sah menurut aturan. Katakanlah Anda sedang berdiri di Jembatan Westminster, ca. 300 m dari Big Ben. Di sisi positifnya, ini juga berarti bahwa program akan mencetak jumlah BONG yang benar jika dimulai tepat pada awal jam (alih-alih menunggu 3600 detik).
  • sleepmengembalikan jumlah detik yang ditunggu. Ini akan selalu benar.
cfaerber
sumber
1
2 hal. 1 , saya cukup yakin -Eflagnya adalah +1 byte (ada halaman di suatu tempat tentang pengukuran flags ...). 2 , saya tidak yakin bagaimana menjalankan ini karena perl -E golf.pltampaknya akan segera berakhir.
redstarcoder
0

QBIC , 82 byte

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

Benar-benar perlu mengubah token untuk literal kode ( $) dan menerapkan fitur substring ( left$(x,y)bisa lebih pendek).

Cara kerja dalam:

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>

Pembaruan (NC): Tidak $lagi digunakan dalam set instruksi QBIC, jadi sekarang dapat digunakan secara bebas sebagai kode untuk QBasic tanpa perlu kode literal. Dalam hal ini, menghemat 4 byte, membawa QBIC ke 78 byte:

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
sumber
0

SmileBASIC, 74 67 byte

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

Menghasilkan sejumlah besar jeda baris "trailing";)

Sunting: disimpan 7 byte dengan algoritma 24-> 12 jam yang lebih baik.

12Me21
sumber
0

PHP, 63 byte

Saya bisa menyimpan dua byte lagi dengan ASCII yang diperluas. Tapi saya saat ini terlalu malas untuk itu.

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

mencetak BONGs dengan linebreak terkemuka tepat pada jam penuh. Jalankan dengan -nr.

Titus
sumber
Anda harus menyertakan bendera di bytecount Anda
Kritixi Lithos
@KritixiLithos Tidak, saya tidak. -nagak implisit (abaikan php.and kembali ke nilai konfigurasi default); -rmemberitahu PHP untuk menjalankan kode dari parameter baris perintah alih-alih dari file.
Titus
Ah, salahku, aku tidak tahu 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();}

Dapat dibaca:

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
sumber