มันสนุกมากที่ได้อยู่ที่ YMCA


15

"ซีเอ"เป็นเพลงดิสโก้ได้รับความนิยมจากชาวบ้านที่มีการเต้นรำที่รู้จักกันดี เขียนโปรแกรมที่สั้นที่สุดเพื่อพิมพ์อักษรตัวใหญ่ "Y", "M", "C" และ "A" ที่ซิงโครไนซ์กับคอรัสของเพลง

โดยทั่วไปแล้วตัวอักษรหนึ่งตัวจะไปที่แต่ละบรรทัดที่ส่งไปยังเอาต์พุตมาตรฐาน นี่คือหลักเพื่อลดความซับซ้อนของโปรแกรมที่อยู่ภายใต้การบัฟเฟอร์ผลลัพธ์ของไลบรารีมาตรฐาน C (การพิมพ์บรรทัดใหม่ล้างข้อมูลบัฟเฟอร์ขาออก) ดังนั้นคุณอาจละเว้นบรรทัดใหม่ใด ๆ หรือทั้งหมดหากการละเลยดังกล่าวจะทำให้โปรแกรมของคุณสั้นลง

โปรแกรมของคุณซึ่งเริ่มในเวลาเดียวกันกับเพลงจะต้องส่งออกตัวอักษร "Y" ภายในระยะเวลา 0.125 วินาทีของแต่ละช่วงเวลาหลังจากเริ่มต้น (ในไม่กี่วินาทีฉันกำหนดสิ่งเหล่านี้จากมิวสิควิดีโอที่โพสต์บน YouTube)

 45.766   49.611   60.889
 64.661  109.816  113.591
124.810  128.687  173.830
177.620  188.950  192.724
204.013  207.739  219.057

ตัวอักษร "M", "C" และ "A" ตามลำดับมี 0.930 s, 1.395 s และ 1.628 s หลังจากแต่ละ "Y" สำหรับวัตถุประสงค์ในการทดสอบเวลาสัมพัทธ์เหล่านี้จะถูกแปลงเป็นเวลาสัมบูรณ์โดยการเพิ่มลงในเวลาก่อนหน้า "Y"

ฉันได้เขียนโปรแกรมทดสอบและโปรแกรมตัวอย่างที่เกี่ยวข้องใน C ซึ่งถือว่าขึ้นบรรทัดใหม่ตามตัวอักษรแต่ละตัว (แม้ว่านี่ไม่ใช่กฎการแข่งขัน) มันเขียนขึ้นสำหรับ Linux และจะไม่ทำงานบน Windows โดยไม่ต้องใช้ Cygwin หากคุณไม่สามารถทดสอบการส่งของคุณโดยใช้โปรแกรมการทดสอบอย่างน้อยตรวจสอบการส่งของคุณกับวิดีโอ YouTube

หากการส่งของคุณต้องการตัวเลือกบรรทัดคำสั่งพิเศษเพื่อทำงานอย่างถูกต้องตัวเลือกบรรทัดคำสั่งนั้นจะนับเมื่อคำนวณคะแนนของคุณ อย่างไรก็ตามเวลาเริ่มต้นล่ามใด ๆ จะไม่นับรวมกับคุณและโปรแกรมทดสอบสามารถปรับเปลี่ยนให้รองรับหากจำเป็น

แม้ว่าฉันจะสงสัยว่ามีอยู่จริงฉันต้องบอกว่าห้ามใช้ฟังก์ชั่นการเขียนโปรแกรมภาษาหรือไลบรารีที่ออกแบบมาสำหรับงานนี้โดยเฉพาะ

คำตอบ:


3

C, 161 154 ตัวอักษร

#define P(d,x)w(d);puts(#x);
w(n){usleep(n<<16);}
y(d){P(d,Y)P(14,M)P(7,C)P(3,A)}
b(){y(664);y(35);y(147);y(35);}
main(){b(b(b(w(34))));y(148);y(33);y(148);}

เครื่องทดสอบจะผ่าน แต่ต่อเมื่อfflush(stdout);ถูกเพิ่มหลังจากแต่ละputsเครื่อง เนื่องจากคำถามระบุอย่างชัดเจนว่าfflushไม่จำเป็นฉันจึงคิดว่าเป็นปัญหาในผู้ทดสอบ

ลอจิก:
wหลับเวลาจะได้รับในหน่วย16.384 65.536 ms ความละเอียดนี้ช่วยให้มีเวลาเพียงพอและค่าคงที่ที่แม่นยำ (ฉันควรลอง 100 มิลลิวินาที)
Pรอสักครู่แล้วพิมพ์อักขระ
yพิมพ์ลำดับ YMCA หลังจากการหน่วงเวลาเริ่มต้น
bพิมพ์ 4 YMCA sequences - 4 * YMCA นี้จะเกิดขึ้น 3 ครั้งโดยมีเวลาใกล้เคียงกัน
mainพิมพ์ลำดับ 3 * 4 * YMCA บวก 3 ส่วนที่เหลือ


"ปัญหาในตัวทดสอบ" - คุณพูดถูกเพราะเห็นได้ชัดว่าท่อไม่ใช่อุปกรณ์ "แบบโต้ตอบ" :( ฉันจะทำให้มันใช้ PTY (ซึ่งน่าจะเป็นจริงมากกว่า) แทนที่จะเป็นท่อทันทีที่ฉันได้เวลา .
กรุณามาถึง

ตกลงฉันเปลี่ยนผู้ทดสอบเป็น PTY และโปรแกรมของคุณผ่านการทดสอบ ฉันยังพบข้อมูลเกี่ยวกับยูทิลิตี้ที่เรียกว่า stdbuf ที่ใช้เคล็ดลับ LD_PRELOAD เพื่อแทนที่พฤติกรรมการบัฟเฟอร์เริ่มต้นของไลบรารี I / O มาตรฐาน C
กรุณารอ

4

ทับทิม180 135 124 118 108 104

[458,k=22,*[97,k,435,k]*2,*[98,k]*2,98].flat_map{|e|[e,9,5,2]}.zip(%w(Y M C A)*15){|a,b|sleep a/1e1;p b}

ฉันเพิ่งรู้ว่าไม่มีสิ่งใดในกฎห้ามการพูดซ้ำสองรอบตัวอักษรแต่ละตัว อย่างไรก็ตามการส่งข้อมูลดูเหมือนว่าจะทำงานได้อย่างสมบูรณ์แบบ :)
กรุณามาถึง

1
ส่วนที่สองของcodegolf.stackexchange.com/questions/6695/…ก็มีความเกี่ยวข้องกับคุณเช่นกัน
JPvdMerwe

@JPvdMerwe ขอบคุณมาก! คุณพูดถูก การปล่อยทศนิยมสองตำแหน่งไม่มีผลกระทบใด ๆ นอกจากนี้หลังจากนั้นฉันก็สังเกตเห็นว่าถ้าฉันปรับแต่งค่า± 0.1 มีรูปแบบบางอย่างที่อนุญาตให้สร้างอาร์เรย์ในตัวอักษรน้อยลง
Cristian Lupascu

คุณสามารถทำ%w(Y M C A)*15แทนที่จะ'Y M C A'.split*15สร้างตัวอักษรได้หรือไม่ นอกจากนี้ยังeachอาจเป็นmapแม้ว่าคุณไม่ต้องการผลลัพธ์ Oh, และคุณสามารถเขียน10.0เป็น1e1!
Paul Prestidge

@ ประสานขอบคุณ! ฉันคิดว่าไม่มีอะไรมากที่ฉันสามารถทำได้เพื่อตีกอล์ฟรหัสนี้มากขึ้น แต่ฉันผิดอย่างเห็นได้ชัด :-)
Cristian Lupascu

0

Python2.6 ( 82 ) ( 214 ) ( 219 ) ( 196 ) ( 185 ) (152)

แก้ไขแล้ว. แข่งกับวิดีโอ & ดูแม่นยำ บันทึกตัวละครเงียบ ๆ โดยลดความแม่นยำจาก 3 เหลือ 2 ในกรณีส่วนใหญ่ (ขอบคุณสำหรับ @JPvdMerwe เคล็ดลับ)

ปัญหาเดียวคือผู้ทดสอบแสดงความแตกต่างอย่างมากในการกำหนดเวลา มันเริ่มจากการซิงค์ & พยายามกลับมาซิงค์ ในกรณีทดสอบสองกรณีมีการซิงค์มากกว่า 175 วินาทีในตอนเริ่มต้นและกลับมาที่ภายใน 0.342 และ 0.451 วินาทีหลังจากซิงค์

import time;s=time.sleep
for t in[45.8,2.1,9.5,2,43.4,2,9.5,2.1,43.4,2,9.6,2,9.5,2,9.6]*15:
 i=0;s(t)
 while i<4:s([.1,.9,.5,.2][i]);print'YMCA'[i];i+=1

คุณสามารถทำให้มันวิ่งตามแต่ละสิบห้าครั้งที่ระบุไว้ข้างต้นได้หรือไม่? ดูเหมือนว่าบนเครื่องของฉันคุณจะต้องรวม-uตัวเลือกบรรทัดคำสั่งในการนับ
PleaseStand

@ กรุณาเสร็จแล้วตอนนี้มันทำงาน 15 ครั้ง ฉันไม่รู้เกี่ยวกับการเพิ่ม -u ไม่ต้องการมัน ฉันมี Python2.6 ถ้าช่วยได้
elssar

ในการชี้แจงโปรแกรมของคุณควรพิมพ์ "Y" ตัวแรกหลังจากประมาณ 45.766 วินาทีและ-uจำเป็นสำหรับโปรแกรมทดสอบ (ซึ่งใช้ไพพ์) ไม่ใช่เอาต์พุตโดยตรงไปยังเทอร์มินัล
PleaseStand

@ กรุณายืนอยู่ใช่ฉันสงสัยเกี่ยวกับเวลา จะขอให้คุณ แต่คุณตอบแล้วก่อนที่ฉันจะมีโอกาส และเกี่ยวกับโปรแกรมทดสอบมันเป็นข้อกำหนดที่โปรแกรมรันบนเครื่องทดสอบของคุณหรือคุณจะยอมรับการส่งที่ต้องแก้ไขเพื่อให้ทำงานบนเครื่องทดสอบ แต่รันแบบสแตนด์อโลนได้หรือไม่
elssar

Humm ฉันสามารถส่งรหัสของฉันไปที่ผู้ทดสอบได้โดยไม่ต้องใช้ตัวเลือกใด ๆ
elss

0

Mathematica, 157

p=Print[Pause@#;#2]&

(#~p~"Y";.93~p~"M";.465~p~"C";.233~p~"A")&/@{45.766,2.217,9.65,2.144,43.527,2.147,9.591,2.249,43.515,2.162,9.702,2.146,9.661,2.098,9.69}

ฉันดูวิดีโอทั้งหมดเพื่อยืนยันเวลา YMC A .... YMC A ...

มันอาจจะสั้นลงด้วยความแม่นยำที่น้อยกว่า แต่จากนั้นฉันต้องดูวิดีโออีกครั้งเพื่อยืนยันว่าไม่เกิน 0.125 ในตอนท้าย ฮ่า ๆ

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