บิ๊กเบนไปบ้อง


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)

กฎระเบียบ

  • แต่ละชุดBONGจะต้องคั่นด้วยบรรทัดใหม่
  • อนุญาตให้ขึ้นบรรทัดใหม่ / นำหน้า
  • อย่างไรก็ตามชั้นนำ / ต่อท้ายช่องว่างที่จะไม่ได้รับอนุญาต
  • ส่งจะต้องทำงานตลอดไป
  • ผลลัพธ์ของคุณอาจถูกพิมพ์ออกมา± 3 วินาทีจากจุดเริ่มต้นของชั่วโมง
  • คุณอาจไม่คิดว่าโปรแกรมจะทำงานในเวลาใดก็ได้

นี่คือดังนั้นโปรแกรมที่มีจำนวนผู้ชนะที่สั้นที่สุด!


6
การทดสอบสิ่งที่ส่งมานี้จะเป็นเรื่องสนุก ... : D
FlipTack

3
สำหรับ 12/24 เราจะพิมพ์ 0 bongs หรือ 12 bongs ได้ไหม
Maltysen

6
+1 สำหรับความท้าทายที่ไม่ได้ถูกครอบงำด้วยภาษาการเล่นกอล์ฟโดยเฉพาะ
ฟิลิปป์

2
โปรแกรมควรทำงานอย่างไรถ้านาฬิการะบบกลับสู่ก่อนปี 1859?
Amani Kilumanga

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

ทุบตี, 71, 70, 69 ไบต์

การแก้ไข:

  • ปรับการคำนวณช่วงเวลาพักของบิตให้เหมาะสม -1 ไบต์;
  • แทนที่ backticks ด้วย xargs, -1 byte (ขอบคุณ @ 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
neonze ใน

@neonzeon wow :)
zeppelin

คุณสามารถโกน echo ออกได้ 1 ไบต์โดยการไพพ์ไปที่ xargs ซึ่งจะเรียก echo ตามค่าเริ่มต้น 1 สำหรับ pipe + 5 สำหรับ xargs - 2 สำหรับ backticks - 4 สำหรับ echo - 1 สำหรับ space = -1 byte
jrtc27

@ jrtc27 นั่นเป็นคำแนะนำที่ยอดเยี่ยม! ขอขอบคุณ !
Zeppelin

8

*> <> , 48 47 44 ไบต์

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

ลองที่นี่! ( หรือเวอร์ชั่นนี้ทำทุกนาทีสำหรับการทดสอบ )

สิ่งนี้จะส่งออกจำนวนBONGs คั่นด้วยช่องว่างโดยขึ้นอยู่กับว่าเป็นชั่วโมง (และ 13 คือ 1 เป็นต้น) ไม่มีช่องว่างท้ายหลังสุดท้ายBONGและมีการขึ้นบรรทัดใหม่

เทคนิคนี้ไม่ได้ทำงานตลอดไป ( แต่มันเป็นพื้นไม่) มันรั่ว ~ 28 ไบต์ต่อวัน (ไม่ต้องใช้ล่ามแปล ... ) ใช้เวลาประมาณ 1,05062 ปีจึงจะรั่ว 1GiB

การประมาณค่าใช้จ่ายสำหรับล่ามสแต็คเป็นเพียงส่วนหนึ่งของfloat64ล่าม Golang ดังนั้นฉันจึงคิด28*8หา 224 ไบต์ต่อวัน ฉันหารตัวเลขนี้ด้วยจำนวนไบต์ในหน่วยกิบไบต์ (1073741824) จากนั้น 365 เพื่อประมาณว่าต้องใช้เวลา 13132.85 ปีจึงจะรั่ว 1 GiB

หมายเหตุเกี่ยวกับล่าม

ล่ามออนไลน์อยู่ใน Javascript หน้าจะต้องเปิดและมองเห็นได้เพื่อตรวจสอบเวลาที่มันเป็นอยู่และส่งออก BONGs 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

เขตเวลาท้องถิ่นสำหรับล่ามภาษาออนไลน์คืออะไร? เพราะเมื่อชั่วโมงใหม่เข้ามาหาฉันมันก็ไม่ได้เอาท์พุทอะไรเลย
Kritixi Lithos

@KritixiLithos แต่น่าเสียดายที่ล่ามออนไลน์ต้องเปิดหน้าและมองเห็นได้เพื่อให้มันทำงานได้ ฉันคิดว่านี่เป็นข้อ จำกัด ของ Javascript / เบราว์เซอร์ คุณไม่ต้องกังวลว่ามันจะออนไลน์หรือไม่เพราะล่ามอยู่ใน Javascript คุณสามารถดาวน์โหลดได้ด้วยตัวเองหากคุณต้องการ! ล่าม Golang ทำงานโดยไม่คำนึงถึงสิ่งใด ขออภัยในความไม่สะดวกฉันจะแก้ไขคำตอบเพื่อให้ชัดเจน
redstarcoder

1
ขอแสดงความยินดีกับการชนะการท้าทายนี้! นี้เป็นเพียงการเล่นกอล์ฟ-lang จะได้เสร็จสิ้นการท้าทายนี้และที่น่าประทับใจ :)
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)

นี่ (ตัวอย่าง) alerts ทุกนาทีสำหรับฉัน (แต่จำนวน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)

Snacket Snacket

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 วินาทีเนื่องจากฉันต้องการหนึ่งไฟล์หลังจาก bongs และสิ่งนี้ช่วยประหยัดรอบการทำงานของ CPU >nulอยู่ในตำแหน่งอย่างระมัดระวังเพื่อบันทึกไบต์ ( 1>nulจะทำให้เกิด 1 ที่จะกินโดยเปลี่ยนเส้นทาง) จากนั้นเราวนซ้ำจนกระทั่งทั้งนาทีและวินาทีเป็นศูนย์ ป๊อกถูกสร้างขึ้นโดยการลบโมดูโลชั่วโมง 12 และขอhอักขระสุดท้ายจากสตริง 12 อักขระ เมื่อhใดที่มีค่าเป็นศูนย์สิ่งนี้จะทำให้เรามีสตริงทั้งหมดดังนั้น 12 bongs BONGจากนั้นก็พอเพียงที่จะแทนที่ตัวอักษรที่มีคำว่า เมื่อเรียกใช้จะมีลักษณะดังนี้ (โปรดทราบว่ารูปภาพไม่วนซ้ำดังนั้นคุณจะต้องบังคับให้โหลดซ้ำเพื่อดูภาพเคลื่อนไหวอีกครั้ง):

ตัวอย่างผลลัพธ์


คุณสามารถให้ gif ของมันทำงานและส่งออกหรือไม่
Kritixi Lithos

1
@KritixiLithos ไม่แน่ใจว่าสิ่งที่คุณกำลังมองหาที่นี่; ฉันสามารถจับภาพหน้าจอจากก่อนและหลังชั่วโมงและเพิ่มความล่าช้าสูงสุด 11 นาทีในภาพเคลื่อนไหว GIF แต่ฉันไม่เห็นว่าสิ่งนั้นพิสูจน์ได้อย่างไร
Neil

ฉันขอ GIF เพราะผมไม่สามารถทดสอบบนคอมพิวเตอร์ของฉัน (มันเป็น Mac)
Kritixi Lithos

@KritixiLithos บางอย่างเช่นนี้ตกลง
Neil

ดีพอที่ผมจะใช้คำพูดของคุณมัน :)
Kritixi Lithos

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จำเป็น
Kritixi Lithos

@KritixiLithos ที่แปลก คุณใช้ Linux distro ตัวใด ซึ่งcronที่คุณใช้?
Digital Trauma

ฉันใช้ mac รอสักครู่นั่นไม่ใช่ Linux
Kritixi Lithos

@KritixiLithos Yup ;-) /proc/<PID>/fd/<N>คำตอบนี้อาศัยอยู่กับลินุกซ์
Digital Trauma

3

Ruby, 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 โอ้ใช่จับได้ดี! ลืมที่จะลบตัวละครสุดท้าย
Jatin Dhankhar

ฉันไม่รู้ทับทิม แต่โปรแกรมจะต้องส่งออกภายใน 3 วินาทีจากจุดเริ่มต้นของชั่วโมงใหม่ ฉันไม่คิดว่าsleep(60)จะทำให้เกิดขึ้น
Kritixi Lithos

@KritixiLithos เราสามารถทำให้โปรแกรมนอนหลับทุก 3 วินาทีจากนั้นทำการคำนวณวน -> ตื่นทุก 3 วินาที; ตรวจสอบเวลาและทำสิ่งต่างๆ
Jatin Dhankhar

@JatinDhankhar หรือคุณสามารถทำให้มันหลับได้เป็นเวลา 2 วินาที (เพียงเพื่อให้มีพื้นที่หายใจ)
Kritixi Lithos

@KritixiLithos ใช่แล้วเปลี่ยนเป็น 2 วินาทีกว่าคำขอบคุณ
Jatin Dhankhar

3

Cheddar v1.0.5, 162 ไบต์

Cheddar ไม่มี built-in reader time / cmd output output ดังนั้นฉันต้องโพล่ง!

แข็งแรงเล่นกอล์ฟ:

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

คำอธิบาย:

เนื่องจากห้องสมุดมาตรฐานที่ จำกัด ของ Cheddar ฉันต้องใช้ cmd เพื่อสร้างเวลา ฉันทำสิ่งนี้โดยบันทึกผลลัพธ์ของ "time / t" ซึ่งพิมพ์เวลาในรูปแบบ 12 ชั่วโมงไปยังไฟล์ชื่อ "c" IO.read ส่งคืนบัฟเฟอร์ที่ฉันส่งไปยังสตริงและหารด้วย ":" ซึ่งทำให้มั่นใจว่าชั่วโมงอยู่ในดัชนีศูนย์เสมอ ฉันบันทึกการดำเนินการทั้งหมดไว้ในรูปแบบแลมบ์ดาซึ่งช่วยให้ฉันประหยัด 44 ไบต์ หลังจากจุดนั้นมันจะเข้าสู่ตรรกะของ "ถ้าชั่วโมงที่เก็บไว้ไม่เท่ากับชั่วโมงปัจจุบันตั้งชั่วโมงก่อนหน้านี้เป็นปัจจุบันและพิมพ์ BONG n ครั้งตัดแต่งพื้นที่ต่อท้าย"

Cheddar อาจไม่ใช่ภาษา verbose น้อยที่สุด แต่สามารถหาวิธีแก้ปัญหาเช่นนี้ได้อย่างสนุก!

น่าเศร้าที่นี่เป็นทางออกสำหรับ Windows เท่านั้น

แก้ไข 1:บันทึกสองไบต์โดยแทนที่ "0 <1" ในเงื่อนไขเป็น "1" ฉันไม่ได้คาดหวังว่า 1 จะประเมินเป็นจริงในภาษานี้!


3

Ruby, 82 81 ไบต์

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

ทุกวินาทีเราตรวจสอบว่าเป็นวินาทีสุดท้ายของชั่วโมงและ BONG ตามนั้นหรือไม่ อาจจะเล่นกอล์ฟต่อไปด้วยลูกเล่นที่สกปรก แต่ฉันไม่รู้มากเกินไป มันทำงานแตกต่างจากคำตอบ Ruby อื่น ๆ

หนึ่งไบต์ได้รับการบันทึกด้วยความอนุเคราะห์ของ QPaysTaxes


จำเป็นต้องได้รับเป็นทับทิม ดูเหมือนว่า verbose น้อยกว่า Python สำหรับเล่นกอล์ฟ
ElPedro

คุณต้องการพื้นที่ทันทีifหรือไม่?
Nic Hartley

@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 วินาที โปรดทดสอบในท้องถิ่น :-)

btw การสูญเสียพื้นที่ต่อท้ายที่น่ารำคาญนี้ทำให้ฉันเสียค่าใช้จ่าย 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
Carra

ตอนนี้ฉันคิดแล้วมีปัญหาเล็ก ๆ ที่มันไม่ทำงานถ้าคุณเริ่มจับเวลาในเวลา 20:00:01 นาทีจะเป็นศูนย์ไม่วินาทีและจะพิมพ์ bongs
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 ไบต์
Roman Gräf

ฉันไม่คิดว่าคุณต้องใช้เครื่องหมายอัฒภาคในตอนท้ายของบรรทัดแรก
Nic Hartley

นำส่วนท้ายออก;
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? สิ่งนี้ควรจะทำงานอย่างไร
โทมัส Padron-McCarthy

1
@ ThomasPadron-McCarthy ฉันค่อนข้างแน่ใจว่าการใช้งานฟังก์ชั่นซึ่งตรงข้ามกับโปรแกรมเต็มรูปแบบนั้นใช้ได้
Nic Hartley

2

sh, 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 แย่จัง ฉันมีเพียงคำอธิบายที่อัปเดตและจำนวนไบต์เท่านั้นไม่ใช่รหัสจริง
Rainer P.

ตอนนี้สิ่งที่เหลืออยู่ก็คือให้ฉันทดสอบมันทุกชั่วโมง
Kritixi Lithos

@KritixiLithos แทนที่%Iด้วย%Mและใช้งานได้นานหลายนาที
Rainer P.

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

ในแต่ละวินาทีมันจะ (ควร) ทดสอบว่าเราอยู่ที่ปลายชั่วโมงแล้วพิมพ์จำนวนBONGนั้น


โปรแกรมนี้จะออกเมื่อใดเมื่อโปรแกรมทำงานที่12:00:01?
Kritixi Lithos

ฉันไม่ทราบว่า R แต่โปรแกรมจะต้องส่งออกภายใน 3 วินาทีของการเริ่มต้นของชั่วโมงใหม่ ฉันไม่แน่ใจจริงๆว่าSys.sleep(60)จะทำให้สิ่งนี้เกิดขึ้นได้
ไหม

คุณสามารถแทนที่โดยwhile(1) repeat
plannapus

ช่วงเวลาสลีปจะต้องสั้นกว่าระยะเวลาผ่อนผันหลังจากชั่วโมงเพื่อความถูกต้อง แล้ว Sys.sleep (2) ล่ะ?
newcoder

1
@newcoder แต่ละลูปที่มันหลับเป็นเวลา 1 วินาทีในตอนนี้เพราะไม่เช่นนั้นมันจะพิมพ์BONG1 วินาทีแทนที่จะเป็นเพียงครั้งเดียว นี่คือเพื่อให้แน่ใจว่าจะตรวจสอบเพียงครั้งเดียวต่อวินาที
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 DateJavaScript มีเลขทศนิยมเป็น|ตัวดำเนินการหรือตัวดำเนินการ bitwise บังคับให้ตัวเลขเป็นจำนวนเต็มเนื่องจากตัวดำเนินการ JS bitwise ทำงานกับชุดย่อยจำนวนเต็มของตัวเลขที่แสดงโดยจุดลอยตัว IEEE 754

เครื่องหมายจุลภาคคั่นนิพจน์ย่อย pถูกเตรียมใช้งานเป็นชั่วโมงปัจจุบัน ( p=h())

for(;;)ใช้เพื่อตรวจสอบซ้ำ ๆ ว่าBONGควรมีการแจ้งเตือนใด ๆหรือไม่ การตรวจสอบจะดำเนินการอย่างรวดเร็วที่สุดเท่าที่รันไทม์จะอนุญาต

หากชั่วโมงมีการเปลี่ยนแปลง ( h()!=p) จากนั้นเราจะปรับปรุง p แล้วแจ้งเตือนBONGs ตัวดำเนินการ AND แบบลอจิคัลจะใช้เป็นตัวป้องกัน (จะลัดวงจรถ้าh()===p) เพื่อตรวจสอบว่าBONGมีการส่งออก

String.prototype.repeatใหม่ใน ES2015 และบันทึกตัวอักษรบางตัวมากกว่าการใช้สิ่งที่ต้องการ Array.prototype.joinES5

hผลตอบแทนที่เป็นศูนย์สำหรับหลายที่แน่นอนของ 12 (เช่น 12:00, 00:00) ดังนั้นเราจึงเปลี่ยนเป็น 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? ถ้าไม่คุณสามารถให้ gif ของเอาต์พุตเมื่อชั่วโมงใหม่เริ่มต้นขึ้นได้หรือไม่?
Kritixi Lithos

พูดตามตรงฉันไม่แน่ใจทันที จะไม่สามารถทดสอบรหัสนี้บนเครื่อง linux ได้ แต่ควรทำงานได้อย่างถูกต้องบน Mac อย่างไรก็ตามอาจเป็นไปได้ว่าการโทรBeepหรือDoEventsทำงานไม่ถูกต้องบนเครื่อง mac
Taylor Scott

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;(ไม่ต้องเว้นช่องว่างใด ๆ ) จากนั้นนับจำนวนซ้ำทำซ้ำ("BONG",t)(ช่วยให้คุณประหยัดทั้งสองหรือสาม) จากนั้นกำจัดช่องว่างพิเศษเช่นif(...)ยังทราบว่าสิ่งนี้จะพิมพ์ bongs ทั้งหมดที่มีการต่อกัน โดยมีช่องว่างเป็นอาร์กิวเมนต์แรก
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สำหรับ bongs ที่ไม่ใช่ทางทหาร


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) ตั้งแต่ปลายเดือนมีนาคมถึงสิ้นเดือนตุลาคม
  • หนึ่งวินาทีจะถูกเพิ่มในเวลารอเพื่อให้แน่ใจว่าโปรแกรมจะรออย่างน้อยหนึ่งวินาที ซึ่งหมายความว่า BONGs จะถูกพิมพ์ออกมาช้าหนึ่งวินาทีซึ่งถูกกฎหมายตามกฎ สมมติว่าคุณกำลังยืนอยู่บนสะพานเวสต์มินสเตอร์ ห่างจากบิ๊กเบน 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>

Update (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 ด้วย linebreak ชั้นนำอย่างแม่นยำในเวลาเต็มชั่วโมง -nrทำงานด้วย


คุณต้องรวมธงไว้ใน bytecount ของคุณ
Kritixi Lithos

@KritixiLithos ไม่ฉันไม่ได้ทำ -nเป็นชนิดของimplicit (ละเว้น php.and ถอยกลับไปเป็นค่าเริ่มต้น) -rบอก PHP ให้รันโค้ดจากพารามิเตอร์บรรทัดคำสั่งแทนที่จะมาจากไฟล์
ติตัส

อ๊ะแย่แล้วไม่รู้ 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();}

อ่านได้:

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();
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.