ลากนับถอยหลังการแข่งขัน


10

ท้าทาย:

ในสถานการณ์สมมติตัวจับเวลานับถอยหลังสำหรับการแข่งขันมีช่วงเวลาแบบสุ่มระหว่างการนับเพื่อป้องกันการเริ่มต้นก่อนเวลาอันควรเช่น

3 (0.82 seconds pass), 2 (0.67 seconds pass), 1

การป้อนข้อมูล:

ไม่มีอะไร


เอาท์พุท:

เขียนโปรแกรม (หรือฟังก์ชั่น) ที่พิมพ์ตัวเลข 3 จำนวนด้วยช่วงเวลาแบบสุ่มจาก 0.50 วินาทีถึง 1 วินาทีระหว่างแต่ละการนับ


บันทึก:

  • โปรแกรมจะต้องแสดงผลแต่ละหมายเลข (3, 2, 1) ด้วยการสุ่ม ( ตัวเลขใด ๆระหว่าง 0.50 ถึง 1 ถึงหนึ่งในร้อยส่วนใด ๆ ไม่มีการเข้ารหัสแบบหนัก) ช่วงเวลาระหว่างแต่ละโปรแกรม ความแม่นยำของช่วงเวลาสุ่มต้องออกไปเป็นร้อย (เช่น: 0.52) คุณไม่จำเป็นต้องส่งออกช่วงเวลานับเฉพาะ
  • @JoKing ชี้แจงแล้วฉันหมายถึงการสุ่มอย่างสม่ำเสมอ (คุณสามารถใช้เครื่องกำเนิดไฟฟ้าแบบหลอกเทียมในภาษาของคุณได้
  • ตามที่หลาย ๆ คนได้ชี้แจงฉันหมายถึงตัวเลข 2 ทศนิยมใด ๆ ระหว่าง 0.5 ถึง 1 (0.50, 0.51 และอื่น ๆ จนถึง 0.98, 0.99, 1)

นี่คือดังนั้นโปรแกรมที่มีจำนวนไบต์ต่ำสุดจะเป็นผู้ชนะ


4
สวัสดี LordColus และยินดีต้อนรับสู่ PPCG! นี่เป็นความท้าทายครั้งแรกที่ดี สำหรับความท้าทายในอนาคตเราขอแนะนำให้ทำแซนด์บ็อกซ์ก่อนเพื่อรีดรายละเอียดทั้งหมด

1
@ LordColus: ฉันปรับปรุงคำแถลงเดิมและการแก้ไขอื่น ๆ อีกสองสามรายการลองดูและอนุมัติหากคุณต้องการ
มูฮัมหมัดซาลมาน

1
ดังที่ฉันพูดในความคิดเห็นก่อนหน้านี้ที่ถูกลบการระบุ "สุ่มอย่างสม่ำเสมอ" นั้นใช้ได้ถ้าคุณไม่เข้มงวดเกินไปกับความแม่นยำ เวลาที่หยุดชั่วคราวจะต้องเหมือนกันด้วยความแม่นยำของทศนิยมสองตำแหน่ง (หรืออย่างน้อยก็สองทศนิยม?) นั่นหมายความว่าการแจกแจงควรเหมือนกันในชุด 0.5, 0.51, 0.52, ... , 1 หรือเป็นจุดลอยตัว (อาจมีทศนิยมมากกว่าสองทศนิยม) beween 0.5 และ 1 หรือไม่
Luis Mendo

2
การแก้ไขล่าสุดของฉันชัดเจนหรือไม่
LordColus

6
@ mbomb007 เหมือนกัน ... ทำไมนี่ปิดอีกครั้ง โดยทั่วไปจะนับจาก 3 เป็น 1 โดยมีสอง .50-1.00 วินาทีรอระหว่าง มันไม่ซับซ้อนจริงๆ
Magic Octopus Urn

คำตอบ:



2

SmileBASIC, 64 62 ไบต์

?3M?2M?1DEF M
M=MILLISEC
WHILE MILLISEC<M+500+RND(501)WEND
END

น่าเสียดายที่ฉันไม่สามารถใช้ WAIT ได้เนื่องจากสนับสนุนช่วงเวลาเพียง 1/60 วินาทีเท่านั้น (สิ่งที่น้อยกว่านั้นไม่ค่อยมีประโยชน์เนื่องจากอินพุต / เอาต์พุตอัปเดตเพียงครั้งเดียวต่อเฟรม)

สิ่งนี้ต้องมีการปรับขึ้นอยู่กับความเร็วของระบบที่กำลังทำงานอยู่ดังนั้นจึงอาจไม่ถูกต้อง (46 ไบต์):

?3M?2M?1DEF M
FOR I=-66E4-RND(66E4)TO.NEXT
END

รุ่น WAIT ไม่ถูกต้อง (36 ไบต์):

?3WAIT 30+RND(30)?2WAIT 30+RND(30)?1

2

R , 46 44 ไบต์

สำหรับการนับถอยหลังจริง:

for(i in 3:1){cat(i)
Sys.sleep(runif(1,.5))}

ลองออนไลน์!

ช่วงเวลาการพิมพ์เมื่อฉันเข้าใจผิดความท้าทาย (46 ไบต์) ขอบคุณGiuseppeสำหรับการประหยัด 2 ตัวอักษร

for(i in 3:1)cat(i,format(runif(1,.5),,2)," ")

ลองออนไลน์!


ฉันเชื่อว่าrunif()โดยค่าเริ่มต้นมีจุดสิ้นสุดด้านซ้ายและขวาเป็น0และ1ตามลำดับดังนั้นrunif(1,.5)ควรทำงานเหมือนกันสำหรับ -2 ไบต์ในทั้งสอง
Giuseppe

ขอบคุณมากที่จับ @Giuseppe
JayCe

2

Python 2 , 58 ไบต์

from time import*
for a in'321':print a;sleep(1-time()%.5)

ลองออนไลน์!

ฉันสร้างตัวสร้างตัวเลขสุ่มง่าย ๆ ที่ใช้เวลาเริ่มต้น


ปรับปรุง

  • จาก 63 ถึง 58 ไบต์โดยJonathan Allan
  • MagicOctopus Urnแนะนำให้สลับการนอนหลับและนับถอยหลัง

1-time()%.5ควรทำเคล็ดลับ (คุณต้องการ[3,2,1]โดยวิธี)
Jonathan Allan


@JonathanAllan เป็นจุดที่ดีมากได้รับการปรับปรุง
Neil

สิ่งนี้จะนอนหนึ่งครั้งก่อนการนับถอยหลังเช่นกัน ฉันคิดว่าคุณต้องการคำสั่งพิมพ์ก่อนนอน
Magic Octopus Urn

@MagicOctopusUrn ตกลงอัปเดตแล้ว
Neil


1

Java 8, 86 ไบต์

v->{for(int i=0;++i<4;Thread.sleep((int)(Math.random()*500+500)))System.out.print(i);}

พิมพ์โดยไม่มีตัวคั่น หากไม่ได้รับอนุญาตให้ใช้ +2 ไบต์โดยเปลี่ยนprintเป็นprintln(ตัวคั่นบรรทัดใหม่)

ลองออนไลน์
พิสูจน์ช่วงเวลาที่อยู่ในช่วงที่ถูกต้องของ[500, 1000)ms

คำอธิบาย:

v->{                        // Method with empty unused parameter and no return-type
  for(int i=0;++i<4;        //  Loop in range [1,4)
      Thread.sleep((int)(Math.random()*500+500)))
                            //    After every iteration: sleep for [500, 1000) ms randomly
     System.out.print(i);}  //   Print the current number


1

JavaScript (Node.js) , 75 65 60 ไบต์

  • ขอบคุณ @Shaggy สำหรับการลดขนาด 10 ไบต์
  • ขอบคุณ @Kevin Cruijssen สำหรับการลดขนาด 5 ไบต์
f=(i=3)=>i&&setTimeout(f,Math.random()*500+500,i-1,alert(i))

ลองออนไลน์!



1
@Shaggy มันจะสุ่มถ้าคุณใช้ Date? (เป็นครั้งที่สองที่เกิดขึ้นแบบสุ่ม)
DanielIndie

1
ทำไม*1000%500+500? *500+500คุณก็สามารถใช้
Kevin Cruijssen

ด้วยการอัพเดทข้อมูลจำเพาะมันอาจจะไม่สุ่มพอ แต่มันอาจคุ้มค่าที่จะขอคำอธิบาย
Shaggy

1

Perl 5 , 39 ไบต์

tweaked ลงไปทีละ 39 ไบต์ขอบคุณ @ jonathan-allan + @xcali

say-$_+select$a,$a,$a,1-rand.5for-3..-1

ลองออนไลน์!


1
จะ1-rand(.5)ทำงานอย่างไร
Jonathan Allan

ความคิดที่ดี. สามารถใช้งานได้1-rand.5เช่นกัน
สตีฟ

1
ตัดสี่ไบต์เพิ่มเติมโดยลบ parens และเปลี่ยนตัวนับเป็นค่าลบ ลองออนไลน์!
Xcali

1

ชิป -wingjj 33 ไบต์

0123456e7f s
???????p*9S!ZZZtaABb

ลองออนไลน์!

ในชิปเราไม่สามารถรอให้ตรง1 / 100วินาที แต่เราสามารถรอให้1 / 256วินาทีดังนั้นเราจะใช้ที่นี่

pเมื่อถามว่าจะหยุดการดำเนินการสำหรับหัวสแต็ค (หนึ่งไบต์) * 1 / 256วินาที ในแต่ละรอบเรามักจะตั้งค่าบิตสูงของสแต็ค ( 128 / 256 ) และตั้งค่าบิตสแต็คอื่น ๆ สุ่ม (กับ?'s) สิ่งนี้จะช่วยให้การแจกแจงสม่ำเสมอระหว่าง 0.50 ถึง 1.00 วินาที

args บางส่วน-wและ-gjjระบุว่าอินพุตแทนที่จะใช้ stdin ควรนับถอยหลังจาก0xFFถึง0x00(จากนั้นจึงตัดคำ) เราใช้สิ่งนี้เพื่อมอบบิตสองบิตที่ต่ำสำหรับการนับถอยหลัง บิตเอาต์พุตอื่น ๆ ทั้งหมดจะคงที่ (ตามค่าที่สอดคล้องกับ ASCII 0)

ในที่สุดเมื่อเราเสร็จแล้วเราจะยุติโปรแกรมด้วยtป้องกันการหยุดชั่วคราวหลังจากหมายเลขสุดท้าย


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