Sangat menyenangkan menginap di YMCA

15

"YMCA" adalah lagu disko populer oleh Village People yang memiliki tarian terkenal . Tuliskan program terpendek untuk menghasilkan huruf kapital "Y", "M", "C", dan "A" yang disinkronkan ke paduan suara lagu.

Secara umum, satu huruf berjalan pada setiap baris yang dikirim ke output standar. Hal ini terutama untuk menyederhanakan program yang tunduk pada buffering output dari pustaka standar C (mencetak baris baru memunculkan buffer output), sehingga Anda dapat menghilangkan salah satu atau semua baris baru ini jika kelalaian seperti itu akan membuat program Anda lebih pendek.

Program Anda, yang dimulai pada saat yang sama dengan musik, harus menampilkan huruf "Y" dalam 0,125 detik dari masing-masing waktu setelah mulai (dalam detik; saya menentukan ini dari video musik yang diposting di 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

Huruf "M", "C", dan "A" masing-masing datang 0,930 s, 1,395 s, dan 1,628 s setelah masing-masing "Y". Untuk tujuan pengujian, waktu relatif ini dikonversi menjadi waktu absolut dengan menambahkannya ke waktu "Y" sebelumnya.

Saya telah menulis program pengujian dan program contoh terkait dalam C yang mengasumsikan baris baru mengikuti setiap huruf (meskipun ini bukan aturan persaingan). Ini ditulis untuk Linux dan tidak akan bekerja di Windows tanpa menggunakan Cygwin. Jika Anda tidak dapat menguji kiriman Anda menggunakan program pengujian, setidaknya periksa kiriman Anda terhadap video YouTube .

Jika kiriman Anda memerlukan opsi baris perintah khusus untuk berperilaku dengan benar, opsi baris perintah itu diperhitungkan saat menghitung skor Anda. Namun, waktu mulai juru bahasa tidak diperhitungkan terhadap Anda, dan program pengujian dapat dimodifikasi untuk mengakomodasi hal itu jika perlu.

Meskipun saya ragu ada, saya harus mengatakan bahwa menggunakan fungsi bahasa pemrograman atau perpustakaan yang dirancang khusus untuk tugas ini dilarang.

PleaseStand
sumber

Jawaban:

3

C, 161 154 karakter

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

Penguji lulus, tetapi hanya jika fflush(stdout);ditambahkan setelah masing-masing puts. Karena pertanyaan dengan jelas menyatakan bahwa fflushitu tidak diperlukan, saya menganggapnya sebagai masalah pada tester.

Logika:
wtidur, waktu diberikan dalam satuan 16.384 65,536 ms. Resolusi ini memungkinkan waktu yang cukup akurat dan konstanta kecil (saya mungkin harus mencoba 100 ms).
Pmenunggu beberapa saat dan mencetak karakter.
ymencetak urutan YMCA, setelah penundaan awal.
bmencetak 4 urutan YMCA - 4 * YMCA ini terjadi 3 kali, dengan waktu yang cukup mirip.
mainmencetak 3 * 4 * urutan YMCA, ditambah 3 sisanya.

ugoren
sumber
"masalah dalam tester" - Anda benar , karena ternyata pipa bukan perangkat "interaktif" :( Saya akan membuatnya menggunakan PTY (yang harus lebih realistis) daripada pipa segera setelah saya mendapatkan waktu untuk .
PleaseStand
Oke, saya mengganti tester untuk menggunakan PTY, dan program Anda lulus tes. Saya juga menemukan tentang utilitas bernama stdbuf yang menggunakan beberapa trik LD_PRELOAD untuk mengganti perilaku buffering standar dari pustaka I / O standar C.
PleaseStand
4

Ruby 180 135 124 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}
w0lf
sumber
Saya baru menyadari bahwa tidak ada aturan yang melarang tanda kutip ganda di sekitar setiap huruf. Namun, pengajuan tampaknya berfungsi dengan baik :)
PleaseStand
1
Bagian kedua dari codegolf.stackexchange.com/questions/6695/… juga relevan untuk Anda.
JPvdMerwe
@JPvdMerkami terima kasih banyak! Anda benar. Menjatuhkan dua desimal tidak memiliki efek signifikan. Juga, setelah saya lakukan itu saya perhatikan bahwa jika saya men-tweak nilai-nilai ± 0,1 ada beberapa pola yang memungkinkan array dibangun dalam karakter yang lebih sedikit.
Cristian Lupascu
Bisakah Anda melakukan %w(Y M C A)*15alih - alih 'Y M C A'.split*15menghasilkan surat? Juga itu eachmungkin bisa jadi mapmeskipun Anda tidak perlu output. Oh, dan kamu bisa menulis 10.0sebagai 1e1!
Paul Prestidge
@ sink, terima kasih! Saya pikir tidak ada lagi yang bisa saya lakukan untuk golf kode ini bahkan lebih, tetapi saya jelas salah. :-)
Cristian Lupascu
0

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

Tetap. Berlari melawan video & tampaknya akurat. Simpan beberapa karakter dengan mengurangi presisi dari 3 menjadi 2 di sebagian besar kasus (terima kasih atas tipnya @JPvdMerwe).

Satu-satunya masalah adalah bahwa penguji menunjukkan perbedaan besar dalam timing. Itu dimulai dari sinkronisasi & mencoba untuk kembali ke sinkronisasi. Dalam dua kasus uji itu lebih dari 175 detik tidak sinkron di awal dan kembali ke dalam 0,342 dan 0,451 detik untuk kembali sinkron.

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
elssar
sumber
Bisakah Anda membuatnya berjalan di masing-masing dari lima belas kali yang tercantum di atas? Tampaknya juga pada mesin saya, Anda perlu memasukkan -uopsi baris perintah dalam hitungan.
PleaseStand
@PleaseStand selesai, sekarang berjalan 15 kali. Saya tidak tahu tentang menambahkan -u, tidak perlu saya. Saya punya Python2.6, jika itu membantu
elssar
Untuk memperjelas, program Anda harus mencetak "Y" pertama setelah sekitar 45,766 detik, dan -udiperlukan untuk program penguji (yang menggunakan pipa), bukan untuk output langsung ke terminal.
PleaseStand
@ Please Please, aku bertanya-tanya tentang waktu. Akan bertanya padamu, tapi kamu sudah menjawab sebelum aku punya kesempatan. Dan mengenai program penguji, apakah ini merupakan persyaratan agar program berjalan pada penguji Anda apa adanya, atau apakah Anda akan menerima kiriman yang perlu dimodifikasi untuk berjalan di penguji, tetapi jalankan mandiri dengan baik?
elssar
Humm, saya bisa meneruskan kode saya ke tester tanpa harus menggunakan opsi apa pun
elssar
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}

Saya menonton seluruh video untuk mengonfirmasi waktu. YMC A .... YMC A ...

Bisa jadi lebih pendek dengan presisi kurang, tapi kemudian saya harus menonton video lagi untuk memastikan bahwa itu tidak mati lebih dari .125 pada akhirnya. lol

Tuan Wisaya
sumber