Big Ben BONG gider


45

Görevin, Big Ben'i (Twitter) taklit edecek bir program oluşturmak .

Görev

Yeni bir saat başladığında (bilgisayarınızın yerel saatine veya UTC'ye göre), BONGtekrarlanan hourzamanları (kelimeler arasında boşluk bırakarak) çıkarmanız gerekir . Örneğin, saat 3 olduğunda, çıkış yapmanız gerekir BONG BONG BONG. Zaman formatı, 12 saatlik zaman formatını izler, yani saat 12: 00'den sonra 1 var ve 13 yoktur. Program / fonksiyon sonsuza kadar çalışmalıdır.

Örnek:

parantezin içine malzeme basmayın

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

kurallar

  • Her BONGs dizisi bir satırsonu ile ayrılmalıdır
  • Lider / takip eden yeni hatlara izin verilir
  • Ancak lider / sondaki boşluklar vardır değil izin
  • Gönderim sonsuza kadar sürmeli
  • Çıktınız saatin başından ± 3 saniye sonra basılabilir
  • Sen olabilir değil herhangi bir spesifik saatte çalıştırılmak üzere programı varsayalım

Bu , yani en kısa bayt sayısına sahip olan program kazanıyor!


6
Bu gönderimleri test etmek eğlenceli olacak ...: D
FlipTack

3
12/24 için 0 bong veya 12 bong basar mıyız?
Maltysen

6
Adanmış kod golf dilleri tarafından kolayca kontrol edilemeyen bir meydan okuma için +1.
Philipp,

2
Sistem saati 1859'dan önce geri çekilirse program nasıl davranmalıdır?
Amani Kilumanga

3
Biri test etmek için LD_PRELOAD hack geçersiz kılma zaman fonksiyonlarını kullanabilirsiniz: github.com/vi/timeskew . TIMESKEW="60 1"dakikaların saniyeler gibi akmasını sağlar.
Vi.

Yanıtlar:


2

05AB1E , 43 bayt

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

Çevrimiçi deneyin! (bu işe yaramazsa lol, 60 saniye içinde zaman aşımına uğrayacak . Bunun için 05AB1E yorumlayıcısını indirin )

Açıklama:

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  

Bu beni golf için biraz zaman aldı! Biraz daha golf oynayabilirim ama atıyor *><>, bu yüzden harika :)

Hızlı versiyon:

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

Başlangıçta bir saniye, BONG'lar arasında bir saniye bekleyecek


Gecikme için üzgünüm, nihayet programınızı yerel olarak çalıştırdım. Aferin, bu özellikle bir esolang için iyidir!
Kritixi Lithos,

18

Bash, 71, 70, 69 bayt

DÜZENLEMELER:

  • Uyku aralığı hesaplamasını bir bit, -1 bayt optimize ettim;
  • Değiştirilen backticks, xargs, -1 byte ile (Thanks @ jrtc27!).

golfed

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

Açıklaması

#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

Test Sürümü

Saatler yerine dakikalarla çalışır

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

2
@zeppeIin Bu topluluğa, size ibadet etmenin temel amacı ile katıldım. Çözümünüz o kadar sinsi numaralarla dolu ki, hâlâ yes BONG|sed 12q
gariplikten kurtulduğum

@neonzeon wow :)
zeppelin

1 ekoyu, varsayılan olarak eko olarak adlandıran xargs'e bağlayarak tıraş edebilirsiniz. Xargs için +5 borusu için 1 - geri tepmeler için 2 - eko için 4 - boşluk için -1 = bayt.
jrtc27

@ jrtc27 Bu mükemmel bir tavsiye! Teşekkür ederim !
zeplin

8

*> <> , 48 47 44 bayt

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

Burada dene! ( veya test için her dakika yapılan bu sürüm )

Bu BONG, saatin kaç olduğuna (ve 13 1, vb.) Dayanarak boşluklarla ayrılmış bir miktar s üretir . Finalden sonra takip eden bir boşluk yoktur BONGve takip eden bir yeni satır vardır.

Teknik olarak bu sonsuza kadar sürmez (ama temelde çalışır). Günde ~ 28 bayt sızdırıyor (tercümanı ek yükü yok sayılıyor ...). 1GiB sızdırması ~ 105062 yıl alacaktır.

Tercüman ek yükü için yaklaşık olarak, yığın float64Golang tercüman üzerinde sadece bir dilim s. Bu yüzden sadece 28*8günde 224 byte ile gelip yaptım . Bu sayıyı bir gibibitten (1073741824) sonra 365 olan bayt sayısına böldükten sonra, 36532.85 yıl sonra 1 GiB'yi sızdırmaz hale getireceğini hesapladım.

Tercümanlar hakkında not

Çevrimiçi tercüman Javascript'tedir. Sayfa, açık olduğu süreyi kontrol etmek ve BONG'ları çıkarmak için açık ve görünür durumda olmalıdır. Golang tercüman böyle bir sınırlama yoktur.

açıklama

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

Çevrimiçi çevirmen için yerel saat dilimi nedir? Çünkü benim için yeni bir saat vurulduğunda hiçbir şey
çıkmadı

@KritixiLithos, ne yazık ki çevrimiçi tercüman için sayfanın çalışması için açık ve görünür olması gerekir. Bunun bir Javascript / tarayıcı sınırlaması olduğunu düşünüyorum. Tercüman kendisinin Javascript'te olduğu gibi çevrimiçi olduğundan endişelenmenize gerek yok, eğer isterseniz kendiniz indirebilirsiniz! Golang tercümanı bir şey yapmadan çalışır. Verdiğim rahatsızlık için özür dilerim, cevabı netleştirmek için cevabı düzenleyeceğim.
redstarcoder

1
Bu mücadeleyi kazandığın için tebrikler! Bu, bu mücadeleyi tamamlayan tek golf
sahası

@KritixiLithos teşekkürler! Bu benim kazandığım ilk zorluk: D
redstarcoder

7

JavaScript (ES6), 99 93 bayt

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

Bu UTC zamanını kullanır (gerçek olanla aynı hizada). Kodun denenemeyen doğası nedeniyle, aynı şeyi yapan aşağıdakileri deneyebilirsiniz, ancak her 60 saniyede bir:

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

f()

İşte yerel saati kullanan 99 bitlik bonus versiyonu:

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

Bu (snippet) alertbenim için her dakika (ancak BONGs sayısı doğru), ancak programın yalnızca her saat başı çıkması gerekiyor
Kritixi Lithos

@KritixiLithos "Kodun denenemeyen doğası gereği, aynı şeyi yapan aşağıdakileri deneyebilirsiniz, ancak her 60 saniyede bir:" ;-)
ETHproductions

6

JavaScript (ES6), 125 123 117 115 bayt

5 byte tasarruf için @ Flp.Tkc teşekkürler!

2 bayt daha kaydettiğiniz için @ BenAston'a teşekkürler!

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

Snack Snippet'i

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


1
@BenAston Bunu fark ettiğin için teşekkürler :)
Kritixi Lithos

1
@BenAston İlk yarı-kolon olmadan çalışmaz
Kritixi Lithos

5

Toplu iş, 142 bayt

@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

Dosya sonsuz bir döngü olarak çalıştığından, bong'lardan sonra bir tanesine ihtiyaç duyduğum için 1 saniyelik bir gecikmeyle başladım ve bu işlem CPU döngüsünü kurtarıyor. >nul(Byte kaydetmek için dikkatli bir şekilde konumlandırılır 1>nul1 neden olur yönlendirme ile yenilmesi). Daha sonra hem dakika hem de saniye sıfır olana kadar döngü yapıyoruz. Bonglar negatif saat modülü 12 alarak ve h12 karakterli bir dizgeden son karakterleri isteyerek inşa edilmiştir . hSıfır olduğunda , bu bize gerçekte tüm dizgiyi, dolayısıyla 12 bong verir. Daha sonra karakterleri kelimeyle değiştirmek yeterlidir BONG. Çalıştırdığınızda, şuna benzer bir şey görünür (görüntünün dönmediğine dikkat edin, bu nedenle animasyonu tekrar görmek için yeniden yüklemeniz gerekecek):

Örnek çıktı


Çalışan ve çıkan bir gif sağlayabilir misiniz?
Kritixi Lithos

1
@KritixiLithos Burada ne aradığınızdan emin değil; Bir saatten önceki ve sonraki ekran görüntülerini alabilir ve hareketli bir GIF'te 11 dakikaya kadar bir gecikme ekleyebilirim ancak bunun nasıl bir şey kanıtladığını anlamıyorum.
Neil

Bir gif istiyorum çünkü bilgisayarımda test edemiyorum (bir mac)
Kritixi Lithos

@KritixiLithos Buna benzer bir şey var mı?
Neil

Yeterince iyi, bunun için senin sözünü alacağım :)
Kritixi Lithos

5

Bash + Linux crontab, 90

Bunun diğer kabuk cevaplarından daha kısa olacağını umuyordum. Yine de, ilginç bir yaklaşım olduğunu düşünüyorum:

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

Betik bir kez çalıştırılır, crontab'ı doldurur ve çıkar. Bununla birlikte, cronjobs'dan gelen çıktı, betiğin çalıştığı terminale gönderilir. Bence gönderim sonsuza dek koşmak zorunda olmalı .

Uyarı - bu mevcut crontab girişlerini temizleyecektir, bu nedenle mevcut olanları yedeklediğinizden emin olun.

Bu, varsayılan olarak Vixie kullanan Ubuntu 16.04 üzerinde çalışır cron.


Koştum ve "posta" aldım. Postayı teslim aldığımda BONGgereğinden fazla bir tane vardı .
Kritixi Lithos,

@KritixiLithos Bu garip. Hangi Linux dağıtımını kullanıyorsunuz? Hangisini cronkullanıyorsun?
Dijital Travma


@KritixiLithos Yup ;-). Bu cevap Linux'a dayanıyor /proc/<PID>/fd/<N>.
Dijital Travma

3

Ruby, 112 99 Bayt

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

Eski versiyon

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

İpuçları için QPaysTaxes'e teşekkürler


@ Flp.Tkc Oh evet, güzel yakalayış! Son karakteri silmeyi unuttum
Jatin Dhankhar

Yakut bilmiyorum ama program yeni saatin başlamasından sonraki 3 saniye içinde çıktı vermelidir. Bunun sleep(60)olmasını sağladığını sanmıyorum
Kritixi Lithos

@KritixiLithos Programı her 3 saniyede bir uyku moduna geçirebilir ve daha sonra caculation Loop -> Wake her 3 saniyede bir yapabilir; Zamanı kontrol et ve bir şeyler yap.
Jatin Dhankhar

@JatinDhankhar Veya 2 saniye (sadece biraz nefes alma alanı vermek için) uyku yapabilirsiniz
Kritixi Lithos

@KritixiLithos Evet, Değişiklikten 2 saniyede değişiklik yapıldı
Jatin Dhankhar

3

Cheddar v1.0.5, 162 bayt

Cheddar yerleşik zaman okuyucusu / cmd çıkış okuyucusuna sahip değil, bu yüzden doğaçlama yapmak zorunda kaldım!

golfed:

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

Açıklama:

Cheddar'ın sınırlı standart kütüphanesi nedeniyle, zamanı oluşturmak için cmd kullanmak zorunda kaldım. Bunu, saati 12 saatlik biçimde basan "time / t" çıktısını "c" adlı bir dosyaya kaydederek yaptım. IO.read, bir dizgeye yayınladığım ve ":" bölüp, saatin daima indeks içinde olmasını sağlayan bir tampon döndürür. Bütün bu operasyonu, beni 44 bayttan oluşan bir lambda ifadesine kaydettim. Bu noktadan sonra, "saklanan saat geçerli saate eşit değilse, önceki saati geçerli olarak ayarlayın ve BONG n kez yazdırın, izleyen alanı kesin."

Çedar en az ayrıntılı dil olmayabilir, ancak bunun gibi geçici çözümler bulmak eğlenceli olabilir!

Ne yazık ki bu yalnızca Windows bir çözümdür.

Düzenleme 1: "1" yerine "0 <1" yerine "1" yerine iki bayt kaydedildi. Bu dilde 1'in doğru olduğunu değerlendirmeyi beklemiyordum!


3

Ruby, 82 81 bayt

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

Her saniye saatin son saniyesi ve buna göre BONG olup olmadığını kontrol ederiz. Muhtemelen bazı kirli numaralarla daha fazla golf oynayabilir, ama fazla bir şey bilmiyorum. Ayrıca diğer Ruby cevaplarından farklı şekilde çalışır.

QPaysTaxes izniyle bir bayt kurtarıldı.


Ruby'ye girmelisin. Golf oynamak için Python'dan biraz daha az ayrıntılı görünüyor.
ElPedro

Hemen sonra alana ihtiyacınız var ifmı?
Nic Hartley

@QPaysTaxes Yapmıyorum, teşekkür ederim. Onu unuttuktan sonra uzaya çok kızmıştım puts.
Borsunho

3

Python 2 , 105 106 bayt

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

Düzenle

@ Pinkfloydx33'ten gelen geribildirimlerden sonra <ile! = Değiştirilerek bir bayt eklendi. İyi nokta.

Yerel olarak mümkün olduğu kadar test edildi, ancak TIO üzerinde çalışmıyor (açıkçası) 60 saniyelik yürütme sınırını aşıyor. Lütfen yerel olarak test etmekten çekinmeyin :-)

btw, sinir bozucu takip alanını kaybetmek bana 7 bayta maloldu, aksi halde bu 100'ün altında olurdu.

TIO yokluğunda bir saat bekledikten sonra burada çıktı. Prog, baskının zamanını (12 saat formatı) göstermek için 15: 27'de ekstra hata ayıklama kodu ile başlatıldı.

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

Oldukça basit ama burada ilgilenen herkes için bir açıklama.

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
Dakikaların 0: l [4] == 0ve h <c olup olmadığını kontrol edebilirsiniz.
Carra

Şimdi düşünüyorum da, zamanlayıcıyı 20: 00'da başlatırsanız, çalışmadığı küçük bir problem var. Dakikalar sıfır olacak, saniyeler değil ve bong'ları yazdıracak
Carra

Yerel olarak çalıştırdığımda bu hiçbir şey
çıkmıyor

@KritixiLithos Neden çıktı alamadığınızı bilmiyoruz. Ubuntu 14 ve Python 2.7.9'dayım. Bunu daha fazla tartışmak için sohbete almak ister misiniz?
ElPedro

2
Bu 11h - 12h arası çalışıyor mu? (% 12 12 = 0)? Öyle görünüyor 11>0, yani bir h>cşey mi kaçırıyorum?
pinkfloydx33

3

Python 3 - 100 97 92 bayt

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

Açıklama:

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 byte
Roman Gräf

İlk satırın sonunda noktalı virgül gerektiğini düşünmüyorum.
Nic Hartley,

İzi kaldırıldı;
Carra

Bunu yaparsanız 92 bayt from time import*gibi bu
FlipTack

Bahşiş için teşekkürler, ekledim. Her gün Python hakkında yeni şeyler öğrenmek :)
Carra

2

C, 238 bayt

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

Bunun doğru çalışıp çalışmadığından emin değilim ve mobilim ve telefonumun bir C derleyicisi yok. (Sadece UNIX benzeri sistemlerde çalışır)


Bu denediğimde sonsuz çıktı (yeni
hatlar

@KritixiLithos evet, artık kullanmadığım kısmı çıkarmayı unuttum. 7 dakikada test edebilir misiniz? :)
Aralık'ta

fyerine main? Bunun nasıl çalışması gerekiyor?
Thomas Padron-McCarthy

1
@ ThomasPadron-McCarthy Tam bir programın aksine bir işlev sağlamanın gayet iyi olduğundan eminim.
Nic Hartley,

2

sh, 66 bayt

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

Açıklaması

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

Bu, program çalıştırıldığında derhal yazdırılır, yapılmamalıdır. Program yalnızca yeni bir saat başladığında çıktı vermelidir
Kritixi Lithos

Aynı sorun hala ortaya çıkıyor
Kritixi Lithos

@KritixiLithos Benim hatam. Gerçek kodu değil sadece açıklama ve bayt sayısını güncelledim.
Rainer P.

Şimdi geriye kalanların hepsi benim saate göre test etmem için
Kritixi Lithos

@KritixiLithos değiştirin %Iile %Mve dakika çalışıyor.
Rainer P.

1

C, 198 bayt

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

Düzenleme: Utanmadan new Date/36e5%12|0||126 byte tasarruf için @ETHProductions ' kodunu ödünç

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


1

R, 104 105 bayt

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

Her saniye, bir saatin sonunda olup olmadığımızı test etmeli ( BONGs) , sonra bu s miktarını yazdırmalı .


Program çalıştırıldığında bu program ne zaman çıkacaktır 12:00:01?
Kritixi Lithos,

R bilmiyorum, ancak program yeni saatin başlamasından sonraki 3 saniye içinde çıktı vermelidir. Bunun Sys.sleep(60)gerçekleşip gerçekleşmeyeceğinden emin değilim
Kritixi Lithos

Sen değiştirebilirsiniz while(1)tarafından repeat.
plannapus

Uyku aralığı doğruluk için bir saatten sonra ödemesiz süreden daha kısa olmalıdır. Peki ya Sys.sleep (2)?
newcoder 5

1
@newcoder Her döngü şimdi 1 saniye uyur, çünkü aksi halde bir BONGsaniye yerine 1 saniye yazdırır . Bu, saniyede yalnızca bir kez kontrol edilmesini sağlamak içindir.
JAD

1

JavaScript ES2015, 100 99 98 96 94 88 bayt

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

Açıklama:

hkalan operatörü ( %12) kullanarak günün 12 saati temel alan saati alan bir işlevdir . 36e5Karakterleri kaydetmek için üstel sözdizimini kullanarak bir saat içindeki milisaniye sayısıdır. newOperatör hiçbir argüman varsa parantez dolayısıyla fonksiyonları ile kullanılması gerektirmez new Date. JavaScript sadece kayan nokta aritmetiğine sahiptir, |bitsel olarak OR operatörü, sayıyı bir tam sayı olmaya zorlar, çünkü JS bitsel operatörleri, IEEE 754 kayan nokta ile temsil edilen sayıların tamsayı alt kümesiyle çalışır.

Virgül alt ifadeleri sınırlandırır. pgeçerli saate başlatılır ( p=h()).

for(;;) olup olmadığını tekrar tekrar kontrol etmek için kullanılır BONG alarmın uyarılıp uyarılmayacağını . Kontrol, çalışma zamanının izin verdiği kadar hızlı gerçekleştirilir.

Saat değiştiyse ( h()!=p), p'yi güncelleriz ve sonraBONG s'yi . Mantıksal AND operatörü, s çıkışının h()===polup olmadığını belirlemek için bir koruyucu olarak kullanılır (eğer kısa devre yaparsa ) BONG.

String.prototype.repeat ES2015'teki yenilikler ve bazı karakterleri ES5'ler gibi bir şey kullanmaktan kurtarıyor Array.prototype.join .

h 12'nin tam katları için sıfır döndürür (yani, 12:00, 12:00), bu yüzden mantıksal OR kullanarak 12'ye değiştiririz. p||12 .

Fikirler için Kritixi Lithos ve ETHProductions sayesinde.


Sanırım son yarı kolonu kaldırabilirsin
Kritixi Lithos

1

Excel VBA, 143 Bayt

VBE Acil Durum Penceresine Kod Çıkışları

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

Eğlenceli sürüm, 143 Bayt (Rekabet Etmeyen)

BONG'a gitmek için excel almak oldukça zor olsa da, excel almak için oldukça yalındır Beep. BeepÇağrı 1 saniye aralarla ayrılmış saatte bir bip sesi ve saat gösteren üretmek bip sesi için kullanımları, bu aşağıdaki kodu, üretir.

Yukarıda olduğu gibi, bu kodun excel'in tepkisiz görünmesini :DoEventssağlar ve kullanıcı deneyimini geliştirdiğinden ilk satırın sonuna bir arama eklenmesi önerilir, ancak bu, doğru kod yürütme için gerekli değildir.

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 Sürümü

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

Bunu Windows olmayan bir bilgisayarda test etmek mümkün mü? Değilse, yeni bir saat başladığında çıktının bir gifini verebilir misiniz?
Kritixi Lithos,

Tamamen dürüst olmak gerekirse, hemen emin değilim. Bir linux makinede bu kodu test etmek mümkün olmayacaktır, ancak gerektiği Mac'te düzgün. Bununla birlikte, Beepveya DoEventsÇağrılar mac makinelerinde düzgün çalışmıyor olabilir.
Taylor Scott

0

C # 234 Bayt

Burada herhangi bir ödül kazanmayı planlamıyorum, ancak bir C # uygulaması zorunludur.

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

Yorumsuz Ungolfed:

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
Kullanım for(;;), değişim h=()=>1+(DateTime.Now.Hour-1)%12;(ya hiçbir boşluk dikkat edin) ve sonra Enumerable.Repeat olur ("BONG",t)yani boşluk sonra ekstra kurtulmak (ya iki ya da üç kaydeder) if(...)Ayrıca, bu muhtemelen katılmak içine concat açmak için bu bayt tasarruf almak, birleştirilmiş tüm bongs yazdırılır dikkat ilk argümanı olarak bir boşlukla.
pinkfloydx33

0

Groovy, 72 bayt

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

Nasıl?

Geçerli saatleri almak için bir yöntem saklayın.

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

İlk saatleri saklayın.

y=x();

Doğru olsa da, geçerli saat önceki saate eşit değilse, çıkış geçerli saat, bongların geçerli saat çıkışına "BONG" ile çarpılır.

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

%12Askeri olmayan bonglar için +3 bayt .


0

perl, 60 bayt

Güncelleme

Değiştirildi , kaldırıldı , düzeltilmiş sayım " "ile değiştirildi .$"CORE::

Golf

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

Bu çalışılması gerekiyor perl -E.

Uyarılar

  • Perl'de, ( tek bir ifadenin olduğu yer) x while yeşittir, ancak parantez gerekmez. bir şey basılmadan önce ilk kez yürütülür.while(y){x}xsleep
  • timeUTC kullanır. Orijinal Big Ben, yaz ayının sonunda (İngiliz Yaz Saati, BST) Mart ayının sonundan Ekim ayının sonuna kadar.
  • Programın en az bir saniye beklemesini sağlamak için bekleme süresine bir saniye eklenir. Bu, BONG'ların her zaman bir saniye gecikmeli olarak basılacağı anlamına gelir, bu kurallara göre yasaldır. Diyelim ki Westminster Köprüsü'nde duruyorsunuz, ca. Big Ben'den 300 m uzaklıktadır. Artı tarafta, program tam olarak bir saatin başında başlamışsa (3600 saniye beklemek yerine) doğru miktarda BONG yazdıracaktır.
  • sleepBeklenen saniye sayısını döndürür. Bu her zaman doğru olacak.

1
2 şey. 1 , -Ebayrağın +1 bayt olduğundan eminim (bayrakların ölçülmesiyle ilgili bir sayfa var). 2 , perl -E golf.plderhal sonlandırılıyor gibi göründüğü gibi bu çalıştırmak için nasıl emin değilim .
redstarcoder

0

QBIC , 82 bayt

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

Gerçekten kod değişkeni ( $) için belirteci değiştirmek ve bir alt dize özelliği uygulamak left$(x,y)gerekir (daha kısa olabilir).

İç işleri:

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>

Güncelleme (NC): $Artık QBIC komut setinde kullanılmıyor, artık kod değişimlerine gerek kalmadan artık QBasic için serbestçe kullanılabilir. Bu durumda, QBIC'yi 78 byte'a getirerek 4 byte tasarruf sağlar:

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 bayt

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

Büyük miktarlarda "sondaki" satır sonlarını çıkarır;)

Düzenleme: daha iyi 24-> 12 saat algoritması ile 7 bayt kaydedildi.


0

PHP, 63 bayt

Genişletilmiş ASCII ile iki bayt daha kazanabilirim. Ama şu anda bunun için çok tembelim.

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

BONG'ları tam bir saatte tam olarak kusursuz bir satır sonu ile basar. İle koş -nr.


Bayrakları kendi bayrağına dahil etmek zorundasın
Kritixi Lithos

@KritixiLithos Hayır. -ntür olan örtük (görmezden php.and varsayılan yapılandırma değerlerine geri kayma); -rPHP'ye bir dosya yerine komut satırı parametresinden kod çalıştırmasını söyler.
Titus,

Ah, benim hatam, PHP bilmiyorum.
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();}

Okunabilir:

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();
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.