Big Ben đi BONG


45

Nhiệm vụ của bạn là tạo ra một chương trình bắt chước Big Ben (Twitter) .

Bài tập, nhiệm vụ

Bất cứ khi nào một giờ mới đã bắt đầu (theo giờ địa phương hoặc UTC của máy tính của bạn), bạn phải xuất thời gian BONGlặp lại hour(với khoảng cách giữa các từ). Ví dụ: khi đồng hồ 3 giờ, bạn phải xuất BONG BONG BONG. Định dạng thời gian tuân theo định dạng thời gian 12 giờ, tức là sau 12 giờ, chúng ta có 1 chứ không phải 13. Chương trình / chức năng phải chạy mãi mãi.

Thí dụ:

không xuất nội dung trong ngoặc

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

Quy tắc

  • Mỗi loạt BONGs phải được phân tách bằng một dòng mới
  • Dòng mới hàng đầu / dấu được cho phép
  • Tuy nhiên hàng đầu / đuôi không gian được không phép
  • Trình phải chạy mãi mãi
  • Đầu ra của bạn có thể được in ± 3 giây kể từ đầu giờ
  • Bạn không thể cho rằng chương trình được chạy vào bất kỳ giờ cụ thể nào

Đây là , vì vậy chương trình nào có số lần thắng ngắn nhất!


6
Thử nghiệm các bài nộp này sẽ rất vui ...: D
FlipTack

3
trong 12/24 chúng ta in 0 bongs hay 12 bongs?
Maltysen

6
+1 cho một thử thách không dễ bị chi phối bởi các ngôn ngữ chơi gôn chuyên dụng.
Philipp

2
Chương trình nên hoạt động như thế nào nếu đồng hồ hệ thống bị hỏng từ trước năm 1859?
Amani Kilumanga

3
Để kiểm tra, người ta có thể sử dụng LD_PRELOAD hack ghi đè các chức năng thời gian: github.com/vi/timeskew . TIMESKEW="60 1"làm cho phút trôi qua như giây.
Vi.

Câu trả lời:


2

05AB1E , 43 byte

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

Hãy thử trực tuyến! (lol điều này sẽ không hoạt động, nó sẽ hết thời gian trong 60 giây. Tải xuống trình thông dịch 05AB1E cho việc này)

Giải trình:

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  

Điều này làm tôi mất một lúc để chơi gôn! Tôi có thể chơi gôn nhiều hơn một chút, nhưng nó đập *><>, nên rất tuyệt :)

Phiên bản nhanh:

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

Sẽ đợi một giây khi bắt đầu và một giây giữa BONG


Xin lỗi vì sự chậm trễ, cuối cùng tôi đã chạy chương trình của bạn tại địa phương. Làm tốt lắm, điều này đặc biệt tốt cho một esolang!
Kritixi Lithos

18

Bash, 71, 70, 69 byte

CHỈNH SỬA:

  • Tối ưu hóa tính toán khoảng thời gian ngủ một chút, -1 byte;
  • Backticks thay thế bằng xargs, -1 byte (Cảm ơn @ jrtc27!).

Chơi gôn

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

Giải thích

#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

Phiên bản thử nghiệm

Làm việc với phút thay vì giờ

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

2
@zeppeIin Tôi tham gia cộng đồng này với mục tiêu chính là tôn thờ bạn. Giải pháp của bạn đầy rẫy những mánh khóe lén lút Tôi vẫn quay cuồng vì sự tuyệt vời - đặc biệtyes BONG|sed 12q
neemonyon

@neemonyon wow :)
zeppelin

Bạn có thể tắt 1 byte tiếng vang bằng cách chuyển sang xargs, gọi echo theo mặc định. 1 cho ống + 5 cho xargs - 2 cho backticks - 4 cho echo - 1 cho dấu cách = -1 byte.
jrtc27

@ jrtc27 Đó là một lời khuyên tuyệt vời! Cảm ơn bạn !
zeppelin

8

*> <> , 48 47 44 byte

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

Hãy thử nó ở đây! ( hoặc phiên bản này thực hiện mỗi phút để thử nghiệm )

Điều này xuất ra một số BONGs được phân tách bằng khoảng trắng dựa trên giờ đó (và 13 là 1, v.v.). Không có không gian dấu sau trận chung kết BONG, và có một dòng mới.

Về mặt kỹ thuật, điều này không chạy mãi mãi (nhưng về cơ bản là như vậy). Nó rò rỉ ~ 28 byte mỗi ngày (bỏ qua chi phí phiên dịch ...). Phải mất ~ 105062 năm để nó rò rỉ 1GiB.

Xấp xỉ cho chi phí phiên dịch, ngăn xếp chỉ là một lát float64s trên trình thông dịch Golang. Vì vậy, tôi chỉ đơn giản là đã 28*8đưa ra 224 byte mỗi ngày. Tôi đã chia số này cho số byte trong một gibibyte (1073741824) sau đó 365 để ước tính rằng sẽ mất 13132,85 năm để rò rỉ 1 GiB.

Lưu ý về thông dịch viên

Trình thông dịch trực tuyến là trong Javascript. Trang phải được mở và hiển thị cho nó để kiểm tra thời gian hiện tại và xuất BONG. Các thông dịch viên Golang không có giới hạn như vậy.

Giải trình

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

Múi giờ địa phương cho phiên dịch ngôn ngữ trực tuyến là gì? Bởi vì khi một giờ mới đến với tôi, nó không tạo ra bất cứ thứ gì
Kritixi Lithos

@KritixiLithos, thật không may cho trình thông dịch trực tuyến, trang phải được mở và hiển thị để nó hoạt động. Tôi nghĩ rằng đây là một giới hạn Javascript / trình duyệt. Bạn không cần phải lo lắng về việc nó có trực tuyến hay không vì bản thân trình thông dịch có trong Javascript, bạn có thể tự tải xuống nếu muốn! Trình thông dịch Golang hoạt động bất kể mọi thứ mặc dù. Xin lỗi vì sự bất tiện này, tôi sẽ chỉnh sửa câu trả lời để làm rõ điều đó.
redstarcoder

1
Chúc mừng bạn đã chiến thắng thử thách này! Đây là môn đánh gôn duy nhất hoàn thành thử thách này và thật ấn tượng :)
Kritixi Lithos

@KritixiLithos cảm ơn !! Đây là thử thách đầu tiên tôi giành được: 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)

Điều này sử dụng thời gian UTC (phù hợp với thực tế). Do tính chất không thể kiểm chứng của mã, bạn có thể thử cách thực hiện tương tự, nhưng cứ sau 60 giây:

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

f()

Đây là phiên bản 99 byte thưởng sử dụng giờ địa phương:

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

Điều này (đoạn trích) alertmỗi phút đối với tôi (nhưng số BONGs là chính xác), nhưng chương trình được cho là chỉ xuất ra mỗi giờ
Kritixi Lithos

@KritixiLithos "Do tính chất không thể kiểm chứng của mã, bạn có thể thử cách thực hiện tương tự, nhưng cứ sau 60 giây:" ;-)
ETHproductions

6

JavaScript (ES6), 125 123 117 115 byte

Cảm ơn @ Flp.Tkc vì đã tiết kiệm 5 byte!

Cảm ơn @BenAston vì đã tiết kiệm thêm 2 byte!

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

Đoạn trích

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


1
@BenAston Cảm ơn bạn đã nhận thấy điều đó :)
Kritixi Lithos

1
@BenAston Nó không hoạt động mà không có dấu chấm phẩy đầu tiên
Kritixi Lithos

5

Hàng loạt, 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

Vì tệp chạy dưới dạng một vòng lặp vô hạn, tôi bắt đầu với độ trễ 1 giây, vì dù sao tôi cũng cần một cái sau bong bóng và điều này giúp tiết kiệm chu kỳ CPU. Vị >nultrí này được định vị cẩn thận để lưu một byte ( 1>nulsẽ khiến cho số 1 bị ăn bởi chuyển hướng). Chúng tôi sau đó lặp cho đến khi cả hai phút và giây bằng không. Các bong bóng được xây dựng bằng cách lấy modulo 12 âm giờ và yêu cầu các hký tự cuối cùng từ chuỗi 12 ký tự. Khi hbằng không, điều này thực sự mang lại cho chúng ta toàn bộ chuỗi, do đó, 12 bongs. Sau đó nó đủ để thay thế các ký tự bằng từ BONG. Khi chạy, nó trông giống như thế này (lưu ý rằng hình ảnh không lặp, vì vậy bạn sẽ cần phải tải lại để xem lại hình ảnh động):

Đầu ra mẫu


Bạn có thể cung cấp một gif của nó chạy và xuất?
Kritixi Lithos

1
@KritixiLithos Không chắc chắn những gì bạn đang tìm kiếm ở đây; Tôi có thể chụp ảnh màn hình từ trước và sau giờ và thêm độ trễ tối đa 11 phút trong GIF hoạt hình nhưng tôi không thấy điều đó chứng minh điều gì.
Neil

Tôi đang yêu cầu gif vì tôi không thể kiểm tra nó trên máy tính của mình (đó là máy mac)
Kritixi Lithos

@KritixiLithos Một cái gì đó như thế này OK?
Neil

Đủ tốt, tôi sẽ tin lời bạn :)
Kritixi Lithos

5

Bash + Linux crontab, 90

Tôi đã hy vọng điều này sẽ ngắn hơn các câu trả lời vỏ khác. Tuy nhiên, tôi nghĩ rằng đó là một cách tiếp cận thú vị:

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

Kịch bản chạy một lần, điền vào crontab, sau đó thoát. Tuy nhiên, đầu ra từ các cronjobs được gửi đến thiết bị đầu cuối mà tập lệnh được chạy. Tôi nghĩ rằng điều này thỏa mãn việc đệ trình phải chạy mãi mãi yêu cầu yêu cầu.

Cảnh báo - điều này sẽ xóa mọi mục nhập crontab hiện có, vì vậy hãy chắc chắn rằng bạn đã sao lưu các mục hiện có.

Điều này hoạt động trên Ubuntu 16.04, mặc định đang sử dụng Vixie cron .


Tôi chạy nó và nhận được một số "thư". Khi tôi kiểm tra thư, có một cái nhiều BONGhơn mức cần thiết.
Kritixi Lithos

@KritixiLithos Thats lẻ. Bạn đang sử dụng bản phân phối Linux nào? Bạn cronđang sử dụng cái gì
Chấn thương kỹ thuật số

Tôi đang dùng mac, chờ đã, đó không phải là Linux
Kritixi Lithos

@KritixiLithos Yup ;-). Câu trả lời này dựa trên Linux /proc/<PID>/fd/<N>.
Chấn thương kỹ thuật số

3

Ruby, 112 99 byte

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

Phiên bản cũ

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

Cảm ơn QPaysTaxes về các mẹo


@ Flp.Tkc Ồ vâng, bắt tốt đẹp! Quên xóa ký tự cuối cùng
Jatin Dhankhar

Tôi không biết ruby, nhưng chương trình phải xuất trong vòng 3 giây kể từ khi bắt đầu giờ mới. Tôi không nghĩ sleep(60)điều đó xảy ra
Kritixi Lithos

@KritixiLithos Chúng tôi có thể làm cho chương trình ngủ trong 3 giây và sau đó thực hiện Vòng lặp tính toán -> Cứ sau 3 giây; Kiểm tra thời gian và làm công cụ?
Jatin Dhankhar

@JatinDhankhar Hoặc bạn có thể ngủ trong 2 giây (chỉ để tạo hơi thở)
Kritixi Lithos

@KritixiLithos Có, thực hiện thay đổi thành 2 giây so với Cảm ơn
Jatin Dhankhar

3

Cheddar v1.0.5, 162 byte

Cheddar không có đầu đọc thời gian tích hợp / đầu đọc cmd tích hợp, vì vậy tôi phải ứng biến!

Chơi gôn

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

Ung dung:

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

Giải trình:

Do thư viện tiêu chuẩn hạn chế của Cheddar, tôi đã phải sử dụng cmd để tạo thời gian. Tôi đã làm điều này bằng cách lưu đầu ra của "time / t", in thời gian ở định dạng 12 giờ, vào một tệp có tên "c". IO.read trả về một bộ đệm mà tôi đã đúc thành một chuỗi và chia cho ":" đảm bảo giờ luôn ở trong chỉ số 0. Tôi đã lưu toàn bộ thao tác đó vào một biểu thức lambda giúp tôi tiết kiệm được 44 byte. Sau thời điểm đó, nó đi vào logic "nếu giờ được lưu trữ không bằng giờ hiện tại, đặt giờ trước thành hiện tại và in BONG n lần, cắt bớt không gian dấu."

Cheddar có thể không phải là ngôn ngữ dài dòng nhất nhưng có thể rất vui khi tìm thấy cách giải quyết như thế này!

Đáng buồn thay, đây là một giải pháp chỉ dành cho Windows.

Chỉnh sửa 1: Đã lưu hai byte bằng cách thay thế "0 <1" trong điều kiện for thành "1" Tôi không mong đợi 1 để đánh giá là đúng trong ngôn ngữ này!


3

Ruby, 82 81 byte

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

Mỗi giây chúng tôi kiểm tra xem đó có phải là giây cuối cùng của giờ hay không và BONG tương ứng. Có thể chơi golf xa hơn với một số mánh khóe bẩn thỉu, nhưng tôi không biết quá nhiều. Ngoài ra, nó hoạt động khác với câu trả lời khác của Ruby.

Một byte được lưu nhờ phép lịch sự của QPaysTaxes.


Cần phải vào Ruby. Có vẻ hơi dài dòng hơn Python khi chơi gôn.
ElPedro

Bạn có cần không gian ngay sau đó if?
Nic Hartley

@QPaysTaxes Tôi không, cảm ơn bạn. Tôi đã rất tức giận về không gian sau khi putstôi quên mất cái đó.
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

Biên tập

Đã thêm một byte bằng cách thay đổi <thành! = Sau phản hồi từ @ Pinkfloydx33. Điểm tốt.

Đã thử nghiệm càng nhiều càng tốt tại địa phương nhưng không hoạt động trên TIO vì nó (rõ ràng) vượt quá giới hạn thực hiện 60 giây. Xin vui lòng kiểm tra tại địa phương :-)

btw, mất không gian kéo dài phiền phức đó làm tôi mất 7 byte nếu không điều này sẽ dưới 100.

Trong trường hợp không có TIO ở đây là đầu ra sau khi chờ đợi một giờ. Prog đã được bắt đầu lúc 15:27 với mã gỡ lỗi bổ sung để hiển thị thời gian in (định dạng 12 giờ).

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

Khá đơn giản nhưng đây là một lời giải thích cho bất cứ ai quan tâm.

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
Bạn chỉ có thể kiểm tra xem số phút có phải là 0: l [4] == 0 và h <c.
Carra

Bây giờ tôi nghĩ về nó, có một vấn đề nhỏ là nó không hoạt động nếu bạn bắt đầu hẹn giờ vào 20:00:01. Phút sẽ là 0, giây không và nó sẽ in bong bóng
Carra

Điều này không tạo ra bất cứ điều gì khi tôi chạy nó cục bộ
Kritixi Lithos

@KritixiLithos Không biết tại sao bạn không nhận được đầu ra. Tôi đang dùng Ubuntu 14 và Python 2.7.9. Bạn muốn dùng cái này để trò chuyện để thảo luận thêm?
ElPedro

2
Cái này có hoạt động từ 11h-> 12h không. (12% 12 = 0)? Có vẻ như vậy 11>0, h>choặc tôi đang thiếu một cái gì đó?
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])

Giải trình:

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]) là 93 byte
Roman Gräf

Tôi không nghĩ bạn cần dấu chấm phẩy ở cuối dòng đầu tiên.
Nic Hartley

Đã xóa dấu vết;
Carra

92 byte nếu bạn làm from time import*như thế này
FlipTack

Cảm ơn vì tiền boa, tôi đã thêm nó. Học những điều mới về Python mỗi ngày :)
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);}}}

Tôi không chắc điều này có hoạt động chính xác không, và tôi là điện thoại di động và điện thoại của tôi không có trình biên dịch C. (Chỉ hoạt động trên các hệ thống giống như UNIX)


Điều này tạo ra đầu ra vô hạn (dòng mới) khi tôi dùng thử
Kritixi Lithos

@KritixiLithos vâng, tôi đã quên xóa phần mà tôi không sử dụng nữa. Bạn có thể kiểm tra trong 7 phút không? :)
betseg

fthay vì main? Công việc này dự định làm như thế nào nhỉ?
Thomas Padron-McCarthy

1
@ ThomasPadron-McCarthy Tôi khá chắc chắn rằng việc cung cấp một chức năng, trái ngược với một chương trình đầy đủ, là ổn.
Nic Hartley

2

sh, 66 byte

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

Giải thích

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

Điều này in ngay lập tức khi chương trình được chạy, nó không nên làm điều đó. Chương trình chỉ phải xuất khi một giờ mới đã bắt đầu
Kritixi Lithos

Vấn đề tương tự vẫn xuất hiện
Kritixi Lithos

@KritixiLithos Xấu của tôi. Tôi chỉ cập nhật giải thích và số byte, không phải mã thực tế.
Rainer P.

Bây giờ tất cả những gì còn lại là để tôi kiểm tra nó vào giờ
Kritixi Lithos

@KritixiLithos Thay thế %Ibằng %Mvà nó hoạt động trong vài phút.
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");}}

1

Javascript ES6 87 byte

Chỉnh sửa: Không biết mượn new Date/36e5%12|0||12mã @ETH Productstions để lưu 6 byte

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


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

Mỗi giây, nó sẽ (nên) kiểm tra xem chúng ta có ở cuối giờ không, sau đó in số BONGs đó.


Khi nào chương trình này xuất ra khi chương trình được chạy 12:00:01?
Kritixi Lithos

Tôi không biết R, nhưng chương trình phải xuất trong vòng 3 giây kể từ khi bắt đầu giờ mới. Tôi không thực sự chắc chắn nếu Sys.sleep(60)điều đó xảy ra
Kritixi Lithos

Bạn có thể thay thế while(1)bằng repeat.
plannapus

Khoảng thời gian ngủ phải ngắn hơn thời gian ân hạn sau giờ cho chính xác. Làm thế nào về Sys.s ngủ (2)?
newcoder

1
@newcoder Mỗi vòng lặp nó ngủ trong 1 giây, vì nếu không, nó sẽ in BONGtrong 1 giây, thay vì chỉ một lần. Điều này là để đảm bảo nó chỉ kiểm tra một lần mỗi giây.
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()))

Giải trình:

hlà một hàm lấy giờ dựa trên 12 giờ trong ngày bằng cách sử dụng toán tử còn lại ( %12). 36e5là số mili giây trong một giờ bằng cú pháp số mũ để lưu các ký tự. Các newnhà điều hành không yêu cầu ngoặc được sử dụng với chức năng nếu không có đối số, do đó new Date. JavaScript chỉ có số học dấu phẩy động,| toán tử bitwise OR buộc số đó là một số nguyên vì các toán tử bit bit của JS hoạt động với tập hợp con số nguyên của các số được biểu thị bởi dấu phẩy động IEEE 754.

Dấu phẩy mô tả các biểu thức con. pđược khởi tạo cho giờ hiện tại ( p=h()).

for(;;)được sử dụng để kiểm tra nhiều lần xem có BONGnên cảnh báo không. Kiểm tra được thực hiện nhanh chóng như thời gian chạy sẽ cho phép.

Nếu giờ đã thay đổi ( h()!=p), thì chúng tôi cập nhật p và sau đó cảnh báo BONGs. Toán tử AND logic được sử dụng như một bộ bảo vệ (nó ngắn mạch nếu h()===p) để xác định xem BONGs có phải là đầu ra không.

String.prototype.repeatlà tính năng mới trong ES2015 và lưu một số ký tự bằng cách sử dụng cái gì đó như ES5 Array.prototype.join.

htrả về 0 cho bội số chính xác của 12 (tức là 12 giờ tối, 12 giờ sáng), vì vậy chúng tôi thay đổi nó thành 12 bằng cách sử dụng OR logic p||12.

Cảm ơn Kritixi Lithos và ETHSản phẩm cho các ý tưởng.


Tôi nghĩ bạn có thể xóa dấu chấm phẩy cuối cùng
Kritixi Lithos

1

VBA Excel, 143 byte

Mã đầu ra cho cửa sổ ngay lập tức 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

Phiên bản thú vị, 143 Byte (Không cạnh tranh)

Mặc dù rất khó để có được excel để đi BONG, nhưng thật dễ dàng để có được excel để đi Beep. Cuộc Beepgọi tạo ra âm thanh tiếng bíp và mã bên dưới sử dụng tiếng bíp này để tạo ra tiếng bíp cho biết giờ, trên giờ, cách nhau 1 giây.

Cũng như ở trên, mã này làm cho excel có vẻ không phản hồi và việc thêm một :DoEventscuộc gọi vào cuối dòng đầu tiên được khuyến nghị vì nó cải thiện trải nghiệm người dùng, tuy nhiên, điều này là không cần thiết để thực thi mã chính xác.

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

Phiên bản Ungolfed

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

Có thể kiểm tra điều này trên máy tính không chạy Windows không? Nếu không, bạn có thể cung cấp một gif của đầu ra khi một giờ mới bắt đầu không?
Kritixi Lithos

Thành thật mà nói, tôi không chắc chắn ngay lập tức. Sẽ không thể kiểm tra mã này trên máy linux, nhưng nó sẽ hoạt động đúng trên máy Mac. Tuy nhiên, có thể là Beephoặc DoEventsCuộc gọi không hoạt động đúng trên máy mac.
Taylor Scott

0

C # 234 byte

Tôi không có kế hoạch giành bất kỳ giải thưởng nào ở đây, nhưng việc thực hiện C # là bắt buộ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;}}}}

Ungolfed với ý kiến:

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
Sử dụng for(;;), thay đổi h=()=>1+(DateTime.Now.Hour-1)%12;(lưu ý không có khoảng trắng) và sau đó là EnRable.Repeat trở thành ("BONG",t)(tiết kiệm cho bạn hai hoặc ba) sau đó thoát khỏi khoảng trắng thừa, tức là if(...)cũng lưu ý điều này sẽ in tất cả các bong bóng được nối, có thể lấy các tiết kiệm byte đó để nối với một không gian như là đối số đầu tiên của nó.
Pinkfloydx33

0

Groovy, 72 byte

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

Làm sao?

Lưu trữ một phương pháp để có được giờ hiện tại.

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

Lưu trữ giờ ban đầu.

y=x();

Mặc dù đúng, nếu giờ hiện tại không bằng giờ trước, giờ đầu ra hiện tại nhân với "BONG" với giờ đầu ra của bong bóng.

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

+3 byte %12cho bongs phi quân sự.


0

perl, 60 byte

Cập nhật

Thay thế " "bằng $", loại bỏ CORE::, sửa chữa đếm.

Golf

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

Điều này cần phải được chạy với perl -E.

Nhận xét

  • Trong perl, x while ytương đương với while(y){x}(trong đó xlà một câu lệnh đơn) nhưng không cần dấu ngoặc. sleepđược thực hiện lần đầu tiên trước khi bất cứ điều gì được in.
  • timesử dụng UTC. Big Ben ban đầu là vào thời gian mùa hè (Giờ mùa hè của Anh, BST) từ cuối tháng ba cho đến cuối tháng mười.
  • Một giây được thêm vào thời gian chờ để đảm bảo rằng chương trình chờ ít nhất một giây. Điều này có nghĩa là BONG sẽ luôn được in muộn một giây, đó là hợp pháp theo các quy tắc. Giả sử bạn đang đứng trên cầu Westminster, ca. Cách Big Ben 300 m. Về mặt tích cực, điều này cũng có nghĩa là chương trình sẽ in đúng số lượng BONG nếu nó được bắt đầu vào đúng một giờ (thay vì chờ 3600 giây).
  • sleeptrả về số giây chờ đợi Điều này sẽ luôn luôn đúng.

1
2 điều. 1 , Tôi khá chắc chắn rằng -Ecờ là 1 byte (có một trang ở đâu đó về việc đo cờ ...). 2 , Tôi không chắc làm thế nào để chạy nó như perl -E golf.plthể chấm dứt ngay lập tức.
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

Thực sự cần phải thay đổi mã thông báo cho mã chữ ( $) và triển khai tính năng chuỗi con ( left$(x,y)có thể ngắn hơn).

Các hoạt động bên trong:

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>

Cập nhật (NC): $Không còn được sử dụng trong tập lệnh QBIC, do đó giờ đây nó có thể được sử dụng tự do làm mã cho QBasic mà không cần mã bằng chữ. Trong trường hợp này, nó tiết kiệm 4 byte, đưa QBIC lên 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

0

SmileBASIC, 74 67 byte

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

Xuất ra số lượng lớn các ngắt dòng "trailing";)

Chỉnh sửa: đã lưu 7 byte với thuật toán 24-> 12 giờ tốt hơn.


0

PHP, 63 byte

Tôi có thể lưu thêm hai byte với ASCII mở rộng. Nhưng tôi hiện đang quá lười biếng cho điều đó.

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

in BONG với một dòng đột phá hàng đầu chính xác vào toàn bộ giờ. Chạy với -nr.


Bạn phải bao gồm các cờ trong bytecount của bạn
Kritixi Lithos

@KritixiLithos Không có tôi dont. -nlà loại ẩn (bỏ qua php.and quay lại các giá trị cấu hình mặc định); -rbảo PHP chạy mã từ tham số dòng lệnh thay vì từ tệp.
Tít

Ah, xấu của tôi, tôi không biết 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();}

Có thể đọc được

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();
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.