Биг Бен уходит


45

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

задача

Каждый раз, когда начинается новый час (по местному времени вашего компьютера или по Гринвичу), вы должны выводить BONGповторяющиеся значения hourвремени (с пробелом между словами). Например, когда 3 часа, вы должны вывести 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 бонгов?
Maltysen

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]

Будем ждать одну секунду на старте и одну секунду между УДАРАМИ


Извините за задержку, я наконец-то смог запустить вашу программу локально. Отлично, это особенно хорошо для esolang!
Kritixi Lithos

18

Bash, 71, 7069 байт

правок:

  • Оптимизировано вычисление интервала ожидания, -1 байт;
  • Заменены обратные кавычки на xargs, -1 байт (спасибо @ jrtc27!).

Golfed

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 вау :)
дирижабль

Вы можете сбрить 1 байт с эхо, отправив трубку к xargs, которая по умолчанию вызывает эхо. 1 для трубы + 5 для xargs - 2 для обратных тиков - 4 для эха - 1 для пробела = -1 байт.
jrtc27

@ jrtc27 Это отличный совет! Спасибо !
Цеппелин

8

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

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

Попробуй это здесь! ( или эта версия, которая делает это каждую минуту для тестирования )

Это выводит число BONGs, разделенных пробелами, в зависимости от того, какой час (а 13 - 1 и т. Д.). После финала нет пробела BONG, и есть перевод строки.

Технически это не вечно (но в основном так и есть). Он пропускает ~ 28 байт в день (игнорируя издержки интерпретатора ...). Для утечки 1 ГБ потребуется ~ 105062 года.

Приближенный к накладным расходам интерпретатора, стек - просто часть float64s на интерпретаторе Golang. Так что я просто сделал, 28*8чтобы получить 224 байта в день. Я разделил это число на число байтов в гибибайте (1073741824), а затем на 365, чтобы приблизиться к тому, что утечка 1 ГиБ займет 13132,85 года.

Примечание о переводчиках

Онлайн переводчик в Javascript. Страница должна быть открыта и видима, чтобы она могла проверить текущее время и вывести BONG. У толкователя Голанга такого ограничения нет.

объяснение

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, вы можете скачать его самостоятельно, если хотите! Однако переводчик Голанга работает независимо от всего. Извините за неудобства, я отредактирую ответ, чтобы прояснить это.
Redstarcoder

1
Поздравляем с победой в этом соревновании! Это единственная игра в гольф, которая выполнила эту задачу, и это впечатляет :)
Kritixi Lithos

@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 Это не работает без первой точки с
запятой

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. При запуске это выглядит примерно так (обратите внимание, что изображение не зацикливается, поэтому вам потребуется принудительная перезагрузка, чтобы снова увидеть анимацию):

Пример вывода


Не могли бы вы предоставить GIF его работает и вывод?
Критиси Литос

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

Я прошу GIF, потому что я не могу проверить его на своем компьютере (это Mac)
Kritixi Lithos

@KritixiLithos Что-то вроде этого, хорошо?
Нил

Хорошо, я
поверим

5

Bash + Linux crontab, 90

Я надеялся, что это будет короче, чем другие ответы оболочки. Тем не менее, я думаю, что это интересный подход:

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

Сценарий запускается один раз, заполняет crontab, затем завершается. Однако вывод cronjobs отправляется на терминал, с которого был запущен скрипт. Я думаю, что это удовлетворяет представление должно выполняться навсегда требование.

Предупреждение - это удалит все существующие записи в crontab, поэтому убедитесь, что у вас есть существующие резервные копии.

Это работает в Ubuntu 16.04, которая по умолчанию использует Vixie cron .


Я запустил его и получил "почту". Когда я извлекал почту, было еще одно, BONGчем необходимо.
Критиси Литос

@ 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 Ах да, хороший улов! Забыл удалить последний персонаж
Джатин Дханкхар

Я не знаю, ruby, но программа должна вывести в течение 3 секунд с начала нового часа. Я не думаю, sleep(60)что это произойдет
Kritixi Lithos

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

@JatinDhankhar Или вы можете заставить его спать в течение 2 секунд (просто чтобы дать некоторое пространство для дыхания)
Kritixi Lithos

@KritixiLithos Да, внесение изменений на 2 секунды больше, чем спасибо
Джатин Дханкхар

3

Чеддер v1.0.5, 162 байта

У Чеддера нет встроенного считывателя времени / выходного сигнала cmd, поэтому мне пришлось импровизировать!

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

Объяснение:

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

Чеддер не может быть наименее многословным языком, но может быть забавно найти обходные пути как это!

К сожалению, это решение только для Windows.

Редактировать 1: Сохранены два байта, заменив «0 ​​<1» в условии for на «1». Я не ожидал, что 1 оценивается как true в этом языке!


3

Рубин, 82 81 байт

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

Каждую секунду мы проверяем, является ли это последней секундой часа, и BONG соответственно. Возможно, дальше можно было бы сыграть в гольф с некоторыми грязными трюками, но я не знаю слишком многих. Также это работает иначе, чем другой ответ Ruby.

Один байт сохранен благодаря любезности QPaysTaxes.


Нужно попасть в Ruby. Это кажется немного менее многословным, чем Python для игры в гольф.
ElPedro

Вам нужно место сразу после if?
Ник Хартли

@QPaysTaxes Я не знаю, спасибо. Я так разозлился из-за космоса, когда putsзабыл об этом.
Borsunho

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-секундный предел выполнения. Пожалуйста, не стесняйтесь тестировать на месте :-)

Кстати, потеря этого надоедливого конечного пространства стоила мне 7 байт, иначе это было бы меньше 100.

При отсутствии TIO здесь выводится через час ожидания. Prog была запущена в 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.
Карра

Теперь, когда я думаю об этом, есть небольшая проблема, которая не работает, если вы запустите таймер в 20:00:01. Минуты будут равны нулю, секунд нет, и он напечатает бонги
Carra

Это ничего не выводит, когда я
запускаю

@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 байта
Roman Gräf

Я не думаю, что вам нужна точка с запятой в конце первой строки.
Ник Хартли

Убрал трейлинг;
Карра

92 байта, если вы делаете from time import*, как это
FlipTack

Спасибо за совет, я добавил его. Изучение новых вещей о Python каждый день :)
Карра

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

Та же проблема все еще появляется
Kritixi Lithos

@KritixiLithos Мой плохой. У меня было только обновленное объяснение и количество байтов, а не фактический код.
Райнер П.

Теперь все, что мне осталось, это проверить это в час
Критиси Литос

@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 104 байта

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.
plannapus

Интервал сна должен быть короче, чем период отсрочки после часа для корректности. Как насчет 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 (т. е. 12:00, 12:00), поэтому мы изменяем его на 12, используя логическое ИЛИ p||12.

Благодаря Kritixi Lithos и ETHProductions за идеи.


Я думаю, что вы можете удалить последнюю
точку с запятой

1

Excel VBA, 143 байта

Кодовые выходы в окно VBE Immediates

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 байта (неконкурентная)

Хотя было бы довольно трудно получить Excel, чтобы получить БОНГ, довольно просто получить Excel, чтобы пойти 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? Если нет, не могли бы вы предоставить GIF выходных данных, когда начинается новый час?
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(...)Также обратите внимание это будет печатать все затяжки конкатенации , вероятно , принять эти сбережения байтовых превратить CONCAT в присоединиться с пробелом в качестве первого аргумента.
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();

При значении true, если текущий час не равен предыдущему часу, выведите текущий час, умноженный на «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 ");

печатает BONG с лидирующим переводом строки точно в полный час. Беги с -nr.


Вы должны включить флаги в свой byountount
Kritixi Lithos

@KritixiLithos Нет, я не знаю. -nявляется своего рода неявным (игнорировать php.and вернуться к значениям конфигурации по умолчанию); -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.