YMCA'da kalmak eğlenceli


15

"YMCA" Köy Halkı tarafından tanınmış bir dansa sahip popüler bir disko şarkısıdır . Şarkının korosuna senkronize edilmiş "Y", "M", "C" ve "A" büyük harflerini çıkarmak için en kısa programı yazın.

Genellikle, standart çıktıya gönderilen her satıra bir harf gider. Bu öncelikle C standart kitaplığının çıktı arabelleğe tabi programlarını basitleştirmek içindir (bir yeni satır yazdırmak çıktı arabelleğini temizler), bu nedenle bu ihmal programınızı kısaltırsa bu satırlardan herhangi birini veya tümünü atlayabilirsiniz.

Müzikle aynı anda başlatılan programınız, başladıktan sonra bu sürelerin her birinin 0.125 s içinde "Y" harfini çıkarmalıdır (saniyeler içinde; bunları YouTube'da yayınlanan müzik videosundan belirledim).

 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" ve "A" harfleri her biri "Y" den sonra sırasıyla 0.930 s, 1.395 s ve 1.628 s gelir. Test amacıyla, bu nispi süreler, önceki "Y" zamanına eklenerek mutlak zamanlara dönüştürülür.

(Her ne kadar bu bir rekabet kuralı olmasa da) her harfi takip eden bir satırsonu olduğunu varsayarak C'de bir test programı ve karşılık gelen bir örnek program yazdım . Linux için yazılmıştır ve Cygwin kullanmadan Windows üzerinde çalışmaz. Gönderinizi test programını kullanarak test edemiyorsanız, en azından gönderinizi YouTube videosuna göre kontrol edin .

Gönderiminizin düzgün çalışması için özel bir komut satırı seçeneği gerekiyorsa, puanınızı hesaplarken bu komut satırı seçeneği dikkate alınır. Bununla birlikte, herhangi bir tercüman başlangıç ​​zamanı size karşı sayılmaz ve test programı gerektiğinde buna göre değiştirilebilir.

Birinin varlığından şüphelenmeme rağmen, bu görev için özel olarak tasarlanmış bir programlama dili işlevi veya kitaplığı kullanmanın yasak olduğunu söylemeliyim.

Yanıtlar:


3

C, 161154 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);}

Test cihazı geçer, ancak fflush(stdout);her birinden sonra eklenirse puts. Soru fflushbunun gerekli olmadığını açıkça belirttiğinden, bunu test cihazında bir sorun olarak görüyorum.

Mantık:
wuyur, süre 16.384 65.536 ms'lik birimler halinde verilir . Bu çözünürlük yeterince doğru zamanlama ve küçük sabitler sağlar (belki 100 ms denemeliyim).
Pbir süre bekler ve bir karakter basar.
yilk gecikmeden sonra bir YMCA dizisi yazdırır.
b4 YMCA dizisi yazdırır - bu 4 * YMCA, benzer zamanlama ile 3 kez olur.
main3 * 4 * YMCA dizilerini ve kalan 3'ü yazdırır.


"Test cihazında bir sorun" - Haklısın , görünüşe göre borular "interaktif" cihazlar değil :( Ben zaman alır almaz bir boru yerine bir PTY (ki bu daha gerçekçi olmalı) kullanacağım
Lütfen

Tamam, test cihazını bir PTY kullanacak şekilde değiştirdim ve programınız testi geçiyor. Ayrıca C standart I / O kitaplığının varsayılan arabelleğe alma davranışını geçersiz kılmak için bazı LD_PRELOAD hile kullanan stdbuf adlı bir yardımcı program hakkında öğrendim.
21'de lütfen bekleyin

4

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

Kurallarda her mektubun etrafında çift tırnak yasaklayan hiçbir şey olmadığını fark ettim. Ancak, gönderme mükemmel çalışıyor gibi görünüyor :)
PleaseStand

1
Codegolf.stackexchange.com/questions/6695/… ' ın ikinci kısmı da sizinle ilgilidir.
22:12

@JPvdMerwe Çok teşekkürler! Haklısın. İki ondalık basamağın bırakılmasının önemli bir etkisi yoktur. Ayrıca, bunu yaptıktan sonra ben ± 0.1 değerleri tweak eğer dizi daha az karakter inşa izin veren bazı desenler olduğunu fark ettim.
Cristian Lupascu

Harfleri oluşturmak %w(Y M C A)*15yerine yapabilir misiniz 'Y M C A'.split*15? Ayrıca , çıktıya ihtiyacınız olmasa eachda muhtemelen bu olabilir map. Oh, ve yazabilir 10.0olarak 1e1!
Paul Prestidge

@chron Teşekkürler! Bu kodu daha da golf yapmak için yapabileceğim çok fazla bir şey olmadığını düşündüm, ama açıkçası yanlıştı. :-)
Cristian Lupascu

0

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

Sabit. Videoya karşı koştu ve doğru görünüyor. Çoğu durumda hassasiyeti 3'ten 2'ye düşürerek sessizce birkaç karakter kurtardı (@JPvdMerwe ipucu için teşekkürler).

Tek sorun, test cihazının zamanlamalarda büyük bir tutarsızlık göstermesidir. Senkronizasyondan başlar ve senkronizasyona geri dönmeye çalışır. İki test vakasında, başlangıçta senkronizasyondan 175 saniyeden fazla oldu ve tekrar senkronize olduktan sonra 0.342 ve 0.451 saniye içinde geri döndü.

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

Yukarıda listelenen on beş seferden her birinde çalıştırabilir misiniz? Ayrıca makinemde -u, sayıya komut satırı seçeneğini eklemeniz gerekecek gibi görünüyor .
PleaseStand

@PleaseStand bitti, şimdi 15 kez çalışıyor. -U eklemeyi bilmiyorum, benimkine ihtiyacım yok. Python2.6 var, eğer yardımcı olursa
elssar

Açıklığa kavuşturmak için, programınız yaklaşık 45.766 s sonra ilk "Y" yi yazdırmalıdır ve -udoğrudan terminale çıkış için değil, test programı (bir boru kullanan) için gereklidir.
PleaseStand

@PleaseStand Evet, zamanlamayı merak ediyordum. Sana soracaktım, ama şansım olmadan önce cevap verdin. Ve test programı hakkında, programın test cihazınızda olduğu gibi çalışması bir gereklilik mi, yoksa test cihazında çalışacak şekilde değiştirilmesi gereken, ancak tek başına iyi çalışan gönderimleri kabul edecek misiniz?
elssar

Humm, herhangi bir seçenek kullanmak zorunda kalmadan kodumu test
cihazına geçirebilirim

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}

Zamanlamayı onaylamak için tüm videoyu izledim. YMC A .... YMC A ...

Daha az hassasiyetle daha kısa olabilir, ancak sonunda videonun sonunda .125'ten fazla olmadığını onaylamak için tekrar izlemem gerekir. lol

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.