Fajnie jest pozostać w YMCA

15

„YMCA” to popularna piosenka disco autorstwa Village People, która ma dobrze znany taniec . Napisz najkrótszy program, który wypisze wielkie litery „Y”, „M”, „C” i „A” zsynchronizowane z refrenem piosenki.

Zasadniczo jedna litera przypada na każdą linię wysłaną na standardowe wyjście. Ma to przede wszystkim na celu uproszczenie programów podlegających buforowaniu wyjściowemu biblioteki standardowej C (wydruk nowego wiersza opróżnia bufor wyjściowy), więc możesz pominąć niektóre lub wszystkie nowe wiersze, jeśli takie pominięcie spowodowałoby skrócenie programu.

Twój program, który jest uruchamiany w tym samym czasie co muzyka, musi wypisać literę „Y” w ciągu 0,125 s każdego z tych czasów po uruchomieniu (w sekundach; ustaliłem je na podstawie teledysku opublikowanego na 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

Litery „M”, „C” i „A” oznaczają odpowiednio 0,930 s, 1,395 s i 1,628 s po każdym „Y”. Do celów testowych te czasy względne są przeliczane na czasy bezwzględne poprzez dodanie ich do czasu poprzedzającego „Y”.

Napisałem program testowy i odpowiedni przykładowy program w C, który zakłada, że ​​po każdej literze następuje nowa linia (chociaż nie jest to reguła konkurencji). Jest napisany dla systemu Linux i nie będzie działał w systemie Windows bez użycia Cygwin. Jeśli nie możesz przetestować swojego zgłoszenia za pomocą programu testowego, przynajmniej sprawdź swoje przesłanie względem filmu na YouTube .

Jeśli Twoje zgłoszenie wymaga specjalnej opcji wiersza polecenia, aby zachowywać się poprawnie, ta opcja wiersza poleceń liczy się przy obliczaniu wyniku. Jednak czas uruchamiania interpretera nie jest liczony, a program testowy można zmodyfikować w celu dostosowania go w razie potrzeby.

Chociaż wątpię, by istniał, muszę powiedzieć, że używanie funkcji języka programowania lub biblioteki zaprojektowanej specjalnie do tego zadania jest zabronione.

Proszę wstać
źródło

Odpowiedzi:

3

C, 161 154 znaków

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

Tester przechodzi pomyślnie, ale tylko wtedy, gdy fflush(stdout);jest dodawany po każdym puts. Ponieważ pytanie wyraźnie to stwierdzafflush nie jest wymagane, traktuję to jako problem w testerze.

Logika:
wśpi, czas podawany jest w jednostkach 16,384 65,536 ms. Ta rozdzielczość pozwala na wystarczająco dokładne taktowanie i małe stałe (być może powinienem spróbować 100ms).
Pczeka chwilę i drukuje postać.
ydrukuje sekwencję YMCA, po początkowym opóźnieniu.
bdrukuje 4 sekwencje YMCA - to 4 * YMCA dzieje się 3 razy, z wystarczająco podobnym czasem.
maindrukuje sekwencje 3 * 4 * YMCA oraz pozostałe 3.

ugoren
źródło
„problem w testerze” - Masz rację , ponieważ najwyraźniej rury nie są urządzeniami „interaktywnymi” :( Zmuszę go do używania PTY (która powinna być bardziej realistyczna) zamiast rury, gdy tylko będę mieć czas na ,
PleaseStand
OK, zmieniłem tester na PTY, a twój program pomyślnie przejdzie test. Dowiedziałem się także o narzędziu o nazwie stdbuf, które używa sztuczki LD_PRELOAD, aby zastąpić domyślne zachowanie buforowania standardowej biblioteki we / wy C.
wstać
4

Rubinowy 180135 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
źródło
Właśnie zdałem sobie sprawę, że w zasadach nie ma zakazu podwójnego cudzysłowu wokół każdej litery. Wydaje się jednak, że przesyłanie działa idealnie :)
PleaseStand
1
Druga część codegolf.stackexchange.com/questions/6695/... jest również dla Ciebie istotna.
JPvdMerwe
@JPvdMerwe Wielkie dzięki! Masz rację. Zrzucenie dwóch miejsc po przecinku nie ma znaczącego wpływu. Ponadto po tym zauważyłem, że jeśli poprawię wartości ± 0,1, istnieją pewne wzorce, które pozwalają na zbudowanie tablicy w mniejszej liczbie znaków.
Cristian Lupascu
Czy możesz to zrobić %w(Y M C A)*15zamiast 'Y M C A'.split*15generować litery? Również, że eachprawdopodobnie może być mapchoć nie trzeba wyjście. Och, i możesz pisać 10.0jak 1e1!
Paul Prestidge
@chron Dzięki! Myślałem, że nic więcej nie mogę zrobić, aby zagrać w ten kod jeszcze bardziej, ale najwyraźniej się myliłem. :-)
Cristian Lupascu,
0

Python 2.6 ( 82 ) ( 214 ) ( 219 ) ( 196 ) ( 185 ) (152)

Naprawiony. Wystąpił przeciwko wideo i wydaje się dokładny. Oszczędność kilku znaków dzięki zmniejszeniu precyzji z 3 do 2 w większości przypadków (dzięki za wskazówkę @JPvdMerwe).

Jedynym problemem jest to, że tester wykazuje ogromną rozbieżność w taktowaniu. Zaczyna się od synchronizacji i próbuje wrócić do synchronizacji. W dwóch przypadkach testowych na początku było ponad 175 sekund braku synchronizacji i powróciło w ciągu 0,342 i 0,451 sekundy od synchronizacji.

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
źródło
Czy możesz sprawić, by działał w każdym z piętnastu razy wymienionych powyżej? Wydaje się również, że na moim komputerze będziesz musiał uwzględnić -uopcję wiersza poleceń w policzeniu.
wstać
@ Proszę czekać, gotowe, teraz działa 15 razy. Nie wiem o dodaniu -u, nie potrzebuję tego na moim. Mam
Python 2.6
Aby to wyjaśnić, twój program powinien wydrukować pierwsze „Y” po około 45,766 s i -ujest niezbędny dla programu testującego (który używa potoku), a nie do wyjścia bezpośrednio do terminala.
wstać
@PleaseStand Tak, zastanawiałem się nad czasem. Miałem cię zapytać, ale odpowiedziałeś już zanim miałem okazję. A jeśli chodzi o program testera, czy jest to wymagane, aby program działał na testerze w obecnej postaci, czy też zaakceptujesz zgłoszenia, które należy zmodyfikować, aby działały na testerze, ale działały samodzielnie?
elssar
Humm, mogę przekazać mój kod testerowi bez konieczności używania jakichkolwiek opcji
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}

Obejrzałem cały film, aby potwierdzić czas. YMC A .... YMC A ...

Może być krótszy z mniejszą precyzją, ale musiałbym ponownie obejrzeć wideo, aby potwierdzić, że nie było wyłączone o więcej niż .125 na końcu. lol

Mr.Wizard
źródło