Біг-Бен іде БОНГ


45

Ваше завдання - створити програму, яка наслідує Біг-Бен (Twitter) .

Завдання

Щоразу, коли починається нова година (відповідно до місцевого часу вашого комп'ютера чи UTC), ви повинні виводити BONGповторні hourрази (з пробілом між словами). Наприклад, коли годинник 3 o ', ви повинні вивести BONG BONG BONG. Формат часу відповідає 12-годинному формату часу, тобто після 12-годинного годинника у нас є 1, а не 13. Програма / функція повинна працювати вічно.

Приклад:

не виводити речі всередині дужок

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

Правила

  • Кожен ряд BONGs повинен бути відокремлений новим рядком
  • Дозволені провідні / кінцеві нові рядки
  • Однак провідні / кінцеві прогалини є НЕ допускаються
  • Подання має тривати вічно
  • Ваш вихід може бути надрукований ± 3 секунди з початку години
  • Ви не можете вважати, що програма буде запущена в будь-яку конкретну годину

Це , тому програма з найменшим виграшним рахунком виграє!


6
Тестування цих матеріалів буде веселим ...: D
FlipTack

3
за 12/24 ми друкуємо 0 бонгів чи 12 бонгів?
Мальтісен

6
+1 для виклику, в якому не так легко переважають спеціалізовані мови для гри в гольф.
Філіпп

2
Як повинна поводитися програма, якщо системний годинник повернутий до 1859 року?
Амані Кілуманга

3
Для тестування можна використовувати LD_PRELOAD зловмисних функцій часу: github.com/vi/timeskew . TIMESKEW="60 1"змушує хвилин протікати як секунди.
Ві.

Відповіді:


2

05AB1E , 43 байти

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

Спробуйте в Інтернеті! (Ось це не спрацює. Час очікує через 60 секунд. Завантажте для цього інтерпретатор 05AB1E )

Пояснення:

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

Це знадобило мені час на гольф! Я можу трохи більше пограти в гольф, але це б'є *><>, тож це круто :)

Швидка версія:

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

Зачекаємо одну секунду на старті та одну секунду між BONG


Вибачте за затримку, я нарешті дійшов до запуску вашої програми локально. Молодці, це особливо добре для esolang!
Kritixi Lithos

18

Bash, 71, 70, 69 байт

ЗМІНИ:

  • Трохи оптимізовано обчислення інтервалу сну, -1 байт;
  • Замінено задній план на xargs, -1 байт (спасибі @ jrtc27!).

Гольф

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

Пояснив

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

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

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

Тестова версія

Працює з хвилинами замість годин

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

2
@zeppeIin Я приєднався до цієї спільноти з основною метою поклонятися тобі. Ваше рішення настільки сповнене хитрих хитрощів, що я все ще yes BONG|sed 12q
відчуваю себе приголомшливим

@neonzeon wow :)
zeppelin

Ви можете поголити 1 байт від луни, перейшовши на xargs, який за замовчуванням викликає ехо. 1 для труби + 5 для xargs - 2 для backticks - 4 для echo - 1 для пробілу = -1 байт.
jrtc27

@ jrtc27 Це відмінна порада! Дякую !
zeppelin

8

*> <> , 48 47 44 байт

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

Спробуйте тут! ( або ця версія, яка робить це щохвилини для тестування )

Це виводить кількість BONGs, розділених пробілами, залежно від години, в якій вона (і 13 - 1 і т.д.). Після фіналу BONGне залишається пробілу , а є новий проміжок .

Технічно це не працює назавжди (але в основному так). Він просочується ~ 28 байт на день (ігноруючи накладні перекладачі ...). Мине ~ 105062 років, щоб він витік 1 Гбіт.

Наближаючись до накладних перекладачів, стек - це лише фрагмент float64s на інтерпретаторі Golang. Тому я просто 28*8придумував 224 байти на день. Я поділив це число на кількість байтів у гібібайті (1073741824), тоді на 365, щоб приблизно визначити, що для протікання 1 Гб потрібно 13132,85 років.

Примітка про перекладачів

Онлайн-перекладач знаходиться у Javascript. Сторінка повинна бути відкритою і видимою для того, щоб перевірити час, в який вона є, і вивести БОНГИ. У перекладача Golang такого обмеження немає.

Пояснення

Main loop:

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


Output bongs:

Begins at `"` because of the jump.

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


Newline and sleep:

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

Який локальний часовий пояс для перекладача мови в Інтернеті? Тому що, коли
настала

@KritixiLithos, на жаль, для онлайн-перекладача сторінка повинна бути відкритою і видимою, щоб вона працювала. Я думаю, що це обмеження Javascript / браузера. Вам не потрібно турбуватися про те, чи буде він в Інтернеті чи ні, оскільки сам перекладач знаходиться у Javascript, ви можете завантажити його самостійно, якщо хочете! Перекладач Golang працює незалежно від будь-чого. Вибачте за незручності, я відредагую відповідь, щоб зробити це зрозумілим.
redstarcoder

1
Вітаємо з перемогою в цьому виклику! Це єдиний гольф-
лонг,

@KritixiLithos дякую !! Це перший виклик, який я взагалі виграв: D
redstarcoder

7

JavaScript (ES6), 99 93 байт

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

Для цього використовується час UTC (який співпадає з фактичним). Через непереборний характер коду, ви можете спробувати наступне, що робить те саме, але кожні 60 секунд:

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

f()

Ось бонусна 99-байтна версія, яка використовує місцевий час:

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

Це (фрагмент) alertщохвилини для мене (але кількість BONGs правильна), але програма повинна виводитись щогодини
Kritixi Lithos

@KritixiLithos "Через непереборний характер коду ви можете спробувати наступне, що робить те саме, але кожні 60 секунд:" ;-)
ETHproductions

6

JavaScript (ES6), 125 123 117 115 байт

Дякуємо @ Flp.Tkc за економію 5 байт!

Дякуємо @BenAston за збереження ще 2-х байт!

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

Знімок для закуски

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


1
@BenAston Дякую, що помітили це :)
Kritixi Lithos

1
@BenAston Це не спрацює без першого напівколонки
Kritixi Lithos

5

Пакетна, 142 байти

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

Оскільки файл працює як нескінченний цикл, я починаю із затримкою в 1 секунду, оскільки мені так чи інакше потрібен один після бонгів, і це економить цикли процесора. >nulРетельно позиціонуються , щоб зберегти байти ( 1>nulвикличе 1 буде з'їдено перенаправленням). Потім петлю, поки обидві хвилини і секунди не дорівнюють нулю. Бонги будуються, беручи мінусовий годинний модуль 12, і запитуючи останні hсимволи з 12-символьного рядка. Коли hдорівнює нулю, це насправді дає нам всю струну, отже, 12 бонгів. Потім достатньо замінити символи словом BONG. Під час запуску це виглядає приблизно так (зауважте, що зображення не циклічно, тому вам потрібно буде перезавантажити, щоб переглянути анімацію ще раз):

Вибірка зразка


Чи можете ви надати обдаровувати його запуск і вихід?
Kritixi Lithos

1
@KritixiLithos Не впевнений, що ти шукаєш тут; Я можу робити знімки екрана до години та після нього та додавати в анімований GIF затримку на 11 хвилин, але не бачу, як це нічого підтверджує.
Ніл

Я прошу gif, тому що я не можу перевірити його на своєму комп’ютері (це mac)
Kritixi Lithos

@KritixiLithos Щось подібне?
Ніл

Досить добре, я візьму на це ваше слово :)
Kritixi Lithos

5

Bron + Linux crontab, 90

Я сподівався, що це буде коротше, ніж відповіді інших оболонок. Але я думаю, що це цікавий підхід:

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

Сценарій запускається один раз, заповнює crontab, потім виходить. Однак вихід з кронівок направляється на термінал, з якого запускався сценарій. Я думаю, що це задовольняє подання повинно працювати вічно .

Попередження - це очистить будь-які наявні записи crontab, тому переконайтеся, що у вас є резервні копії.

Це працює на Ubuntu 16.04, який використовує Vixie cron за замовчуванням.


Я запустив його і отримав якусь "пошту". Коли я перевіряв пошту, був ще один, BONGніж потрібно.
Kritixi Lithos

@KritixiLithos Це дивно. Який дистрибутив Linux ви використовуєте? Що cronви використовуєте?
Цифрова травма

Я на Mac, зачекайте, це не Linux
Kritixi Lithos

@KritixiLithos Yup ;-). Ця відповідь покладається на Linux /proc/<PID>/fd/<N>.
Цифрова травма

3

Рубі, 112 99 байт

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

Стара версія

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

Завдяки QPaysTaxes за поради


@ Flp.Tkc О так, приємний улов! Забув видалити останнього персонажа
Джатін Дханхар

Я не знаю рубіну, але програма повинна вивести протягом 3 секунд після початку нової години. Я не думаю, sleep(60)що це станеться
Kritixi Lithos

@KritixiLithos Ми можемо примусити програму спати кожні 3 секунди, а потім робити цикл какуляції -> Прокидатися кожні 3 секунди; Перевірте час і займіться речами?
Джатін Дханхар

@JatinDhankhar Або ви можете змусити його спати протягом 2 секунд (просто щоб дати трохи місця для дихання)
Kritixi Lithos

@KritixiLithos Так, змінившись на 2 секунди, ніж Дякую
Jatin Dhankhar

3

Cheddar v1.0.5, 162 байт

У Cheddar немає вбудованого зчитувача часу / cmd виводу, тому мені довелося імпровізувати!

Гольф:

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

Безголівки:

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

Пояснення:

Через обмежену стандартну бібліотеку Чеддара мені довелося використовувати cmd для створення часу. Я зробив це, зберігаючи висновок "time / t", який друкує час у 12-годинному форматі, у файл з назвою "c". IO.read повертає буфер, який я закинув на рядок і розділений на ":", який забезпечив, що година завжди знаходиться в нульовому індексі. Я врятував всю цю операцію в лямбда-вираз, який врятував мені 44 байти. Після цього він переходить в логіку "якщо збережена година не дорівнює поточній годині, встановіть попередню годину на поточну і надрукуйте BONG n разів, обріжте пробіл".

Cheddar може бути не найменш словесною мовою, але знайти цікаві обходи можна цікаво!

На жаль, це рішення для Windows.

Редагувати 1: Збережено два байти, замінивши "0 <1" у фор-умові на "1". Я не очікував, що 1 оцінить справжньою мовою!


3

Рубі, 82 81 байт

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

Кожну секунду ми перевіряємо, чи це остання секунда години, і BONG відповідно. Можливо, можна було б пограти в гольф далі якимись брудними хитрощами, але я не знаю занадто багато. Також це працює інакше, ніж інша відповідь Рубі.

Один байт збережено завдяки ввічливості QPaysTaxes.


Потрібно потрапити в Рубі. Це здається трохи менш багатослівним, ніж Python для гольфу.
ElPedro

Вам потрібен простір відразу після if?
Нік Хартлі

@QPaysTaxes Я не хочу, дякую. Я був так злий на космос після того, putsяк забув про це.
Борсуньо

3

Python 2 , 105 106 байт

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

Редагувати

Додано один байт, змінивши <на! = Після відгуку від @ pinkfloydx33. Гарне місце.

Тестовано якнайбільше локально, але не працює на TIO, оскільки (очевидно) перевищує обмеження виконання 60 секунд. Не соромтесь тестувати місцево :-)

btw, втрачаючи цей нудний простір коштував мені 7 байт, інакше це було б менше 100.

За відсутності TIO тут виводиться після очікування години. Програма була запущена о 15:27 із додатковим кодом налагодження для відображення часу друку (формат 12 годин).

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

Досить просто, але ось пояснення для тих, хто зацікавлений.

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

1
Ви можете просто перевірити, чи є хвилини 0: l [4] == 0і h <c.
Carra

Тепер, коли я думаю про це, є маленька проблема, що вона не працює, якщо запустити таймер 20:00:01. Хвилини будуть нульовими, секунд - ні, і вона надрукує гонги
Carra

Це нічого не дає, коли я запустив його локально
Kritixi Lithos

@KritixiLithos Не маю ідеї, чому ви не отримаєте результатів. Я на Ubuntu 14 та Python 2.7.9. Хочете взяти це за чат, щоб обговорити далі?
ElPedro

2
Це працює з 11h-> 12h. (12% 12 = 0)? Здається 11>0, це так, h>cчи я щось пропускаю?
pinkfloydx33

3

Python 3 - 100 97 92 байт

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

Пояснення:

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

from time import*<NL>while 1:x=3600;sleep(x-time()%x);print(('BONG '*int(strftime("%I")))[:-1]) це 93 байти
Роман Гряф

Я не думаю, що тобі потрібна крапка з комою в кінці першого рядка.
Нік Хартлі

Вилучено останнє;
Carra

92 байти, якщо ви робите from time import*, як це
FlipTack

Дякую за пораду, я додав її. Вивчайте нові речі про Python щодня :)
Carra

2

C, 238 байт

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

Я не впевнений, чи правильно це працює, і я мобільний, і в моєму телефоні немає компілятора C. (Працює лише в UNIX-подібних системах)


Це дало нескінченний вихід (нові рядки), коли я спробував це
Kritixi Lithos

@KritixiLithos так, я забув видалити частину, яку більше не використовую. Чи можете ви протестувати за 7 хвилин? :)
betseg

fзамість main? Як це має працювати?
Томас Падрон-Маккарті

1
@ ThomasPadron-McCarthy Я досить впевнений, що забезпечення функції, на відміну від повної програми, добре.
Нік Хартлі

2

ш, 66 байт

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

Пояснив

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

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

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

Це надрукується відразу після запуску програми, не повинно це робити. Програма повинна
виходити

Ця ж проблема все ще з’являється
Kritixi Lithos

@KritixiLithos Моє погано. У мене було лише оновлене пояснення та кількість байтів, а не власне код.
Райнер П.

Тепер все, що мені залишається, - це я перевірити його в годину
Kritixi Lithos

@KritixiLithos Замінити %Iз , %Mі він працює в лічені хвилини.
Райнер П.

1

C, 198 байт

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

1

Javascript ES6 87 байт

Редагувати: Безсоромно запозичено new Date/36e5%12|0||12код @ETHProductions, щоб зберегти 6 байт

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


1

R, 104 105 байт

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

Кожну секунду він (повинен) перевірити, чи є ми наприкінці години, а потім надрукує цю суму BONGs.


Коли ця програма буде виведена при запуску програми 12:00:01?
Kritixi Lithos

Я не знаю R, але програма повинна вивести протягом 3 секунд після початку нової години. Я не дуже впевнений, чи Sys.sleep(60)станеться це
Kritixi Lithos

Ви можете замінити while(1)на repeat.
планування

Інтервал сну повинен бути коротшим, ніж пільговий період після години для правильності. Як щодо Sys.sleep (2)?
newcoder

1
@newcoder Кожен цикл спить протягом 1 секунди, тому що в іншому випадку він надрукується BONGпротягом 1 секунди, а не лише один раз. Це для того, щоб він перевіряв лише раз на секунду.
JAD

1

JavaScript ES2015, 100 99 98 96 94 88 байт

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

Пояснення:

hце функція, яка отримує 12-годинну годину дня за допомогою оператора, що залишився ( %12). 36e5- це кількість мілісекунд за одну годину, використовуючи експоненціальний синтаксис для збереження символів. newОператор не вимагає , що круглі дужки використовуються з функціями , якщо немає аргументів, тому new Date. JavaScript має лише арифметику з плаваючою комою, |оператор порозрядного АБО змушує число бути цілим числом, оскільки оператори JS побітових операцій працюють з цілим підмножиною чисел, представлених плаваючою точкою IEEE 754.

Кома розмежовує під вирази. pініціалізується до поточної години ( p=h()).

for(;;)використовується для багаторазової перевірки, чи не BONGповинно надходити сповіщення про будь-який s. Перевірка виконується так само швидко, як це дозволить час виконання.

Якщо година змінилася ( h()!=p), ми оновлюємо p, а потім попереджаємо BONGs. Логічний оператор AND використовується як захист (це коротке замикання, якщо h()===p), щоб визначити, чи BONGвиводиться s.

String.prototype.repeatє новим у ES2015 і зберігає деякі символи, використовуючи щось на зразок ES5 Array.prototype.join.

hповертає нуль для точних кратних 12 (тобто 12pm, 12am), тому ми змінюємо його на 12, використовуючи логічний АБО p||12.

Завдяки Kritixi Lithos та ETHProductions за ідеї.


Я думаю, ви можете видалити останню напівколонку
Kritixi Lithos

1

Excel VBA, 143 байт

Виведення коду до вікна негайних VBE

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

Весела версія, 143 байти (неконкурентна)

Хоча було б досить складно дістатись до відмінника, щоб поїхати БОНГ, це досить прямо вперед, щоб отримати чудовий шлях Beep. BeepВиклику виробляє звуковий сигнал, і цей код використовує це , щоб зробити сигнали , що позначає час, на годину, розділений паузами 1 секунду.

Як і вище, цей код робить excel невідповідним, і додавання :DoEventsвиклику в кінці першого рядка рекомендується, оскільки це покращує досвід користувача, однак це не потрібно для правильного виконання коду.

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

Безгольова версія

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

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

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

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

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

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

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

End Sub

Чи можна протестувати це на комп’ютері, який не є Windows? Якщо ні, ви могли б надати обдарування результатами, коли починається нова година?
Kritixi Lithos

Якщо бути чесним, я не відразу впевнений. Тестувати цей код на машині Linux не вдасться, але він повинен належним чином функціонувати на Mac. Однак, можливо, що Beepабо DoEventsВиклики не працюють належним чином на комп'ютерах Mac.
Тейлор Скотт

0

C # 234 байт

Я не планую тут вигравати жодні призи, але реалізація C # є обов'язковою.

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

Безголівки з коментарями:

using System;
using System.Linq;

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

1
Використовуйте for(;;), змінюйте h=()=>1+(DateTime.Now.Hour-1)%12;(відмітьте і пробіл), а потім Enumerable.Repeat стає ("BONG",t)(заощаджує вам або два, або три), потім позбудьтесь зайвих пробілів, тобто if(...)також зауважте, що це надрукує всі об'єднані бонги, можливо, візьміть ці байтові заощадження, щоб перетворити конфат в об'єднання з пробілом як першим аргументом.
pinkfloydx33

0

Groovy, 72 байти

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

Як?

Зберігайте метод для отримання поточних годин.

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

Зберігати початкові години.

y=x();

Хоча істинно, якщо поточна година не дорівнює попередній годині, виведена поточна година помножена на "BONG", щоб вивести поточну годину бонгів.

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

+3 байти %12для невійськових бонгів.


0

perl, 60 байт

Оновлення

Замінено " "з $", видалено CORE::, скоригованими колом.

Гольф

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

З цим потрібно працювати perl -E.

Зауваження

  • У perl x while yеквівалентно while(y){x}(де xє одне твердження), але дужки не потребують. sleepвиконується вперше, перш ніж щось надруковано.
  • timeвикористовує UTC. Оригінальний Біг-Бен - у літній час (British Summer Time, BST) з кінця березня до кінця жовтня.
  • До секунди очікування додається одна секунда, щоб програма чекала принаймні одну секунду. Це означає, що BONG завжди будуть надруковані на одну секунду пізно, що законно відповідно до правил. Скажімо, ти стоїш на Вестмінстерському мосту, приблизно. 300 м від Біг-Бену. З позитивного боку це також означає, що програма буде надрукувати правильну кількість BONG, якщо вона запускається рівно на початку години (замість того, щоб чекати 3600 секунд).
  • sleepповертає кількість очікуваних секунд. Це завжди буде правдою.

1
2 речі. 1 , я впевнений, що -Eпрапор становить +1 байт (десь є сторінка про вимірювання прапорів ...). 2 , я не впевнений, як це запустити, як perl -E golf.plвидається, негайно припинити.
redstarcoder

0

QBIC , 82 байти

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

Дійсно потрібно змінити маркер для літералів коду ( $) та реалізувати функцію підрядки ( left$(x,y)може бути коротшою).

Внутрішня робота:

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

Оновлення (NC): Більше $не використовується в наборі інструкцій QBIC, тому його тепер можна вільно використовувати як код для QBasic без необхідності використання літеральних кодів. У цьому випадку він економить 4 байти, доводячи QBIC до 78 байт:

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

0

SmileBASIC, 74 67 байт

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

Виводить велику кількість розривів рядків;

Редагувати: збережено 7 байт з кращим 24-> 12-годинним алгоритмом.


0

PHP, 63 байти

Я міг би зберегти ще два байти з розширеним ASCII. Але я зараз для цього занадто ледачий.

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

друкує BONGs з провідним рядком лінії точно в повну годину. Бігайте з -nr.


Ви повинні включити прапори до свого облікового запису
Kritixi Lithos

@KritixiLithos Ні, я не хочу. -nє своєрідним неявним (ігнорувати php.і повернутися до значень конфігурації за замовчуванням); -rповідомляє PHP запускати код з параметра командного рядка, а не з файлу.
Тит

Ах, моє погано, я не знаю PHP.
Kritixi Lithos

0

С, 152

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

Читає:

int a=0,i,L=25;

main(){
    char s[9];
    for(i=-1;++i<48;){
        sprintf(s,"%02i:00:00",i);
        if(!strcmp(s,__TIME__)&&i!=L)
            a=L=i,i=-1;
        printf(a-->0?"BONG ":"\n");
    }
    main();
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.