È divertente stare all'YMCA


15

"YMCA" è una popolare canzone da discoteca dei Village People che ha una danza ben nota . Scrivi il programma più breve per produrre le lettere maiuscole "Y", "M", "C" e "A" sincronizzate con il ritornello della canzone.

Generalmente, una lettera va su ogni riga inviata all'output standard. Questo principalmente per semplificare i programmi soggetti al buffering di output della libreria standard C (la stampa di una nuova riga svuota il buffer di output), quindi è possibile omettere una o tutte queste nuove righe se tale omissione renderebbe il programma più breve.

Il tuo programma, che viene avviato contemporaneamente alla musica, deve emettere la lettera "Y" entro 0,125 s da ciascuna di queste volte dopo l'avvio (in secondi; le ho determinate dal video musicale pubblicato su 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

Le lettere "M", "C" e "A" sono rispettivamente 0.930 s, 1.395 s e 1.628 s dopo ogni "Y". A scopo di test, questi tempi relativi vengono convertiti in tempi assoluti aggiungendoli al tempo della "Y" precedente.

Ho scritto un programma di test e un corrispondente programma di esempio in C che presume che una nuova riga segua ogni lettera (anche se questa non è una regola di concorrenza). È scritto per Linux e non funzionerà su Windows senza usare Cygwin. Se non riesci a testare il tuo invio utilizzando il programma di test, almeno controlla il tuo invio rispetto al video di YouTube .

Se l'invio richiede una speciale opzione della riga di comando per comportarsi correttamente, tale opzione della riga di comando viene conteggiata nel calcolo del punteggio. Tuttavia, qualsiasi tempo di avvio dell'interprete non conta nei tuoi confronti e il programma di test può essere modificato per adattarlo, se necessario.

Anche se dubito che ne esista una, devo dire che è proibito l'uso di una funzione del linguaggio di programmazione o di una libreria progettata appositamente per questo compito.

Risposte:


3

C, 161 154 caratteri

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

Il tester passa, ma solo se fflush(stdout);viene aggiunto dopo ciascuno puts. Poiché la domanda afferma chiaramente che fflushnon è necessario, la prendo come un problema nel tester.

Logica:
wdorme, il tempo è espresso in unità di 16.384 65.536 ms. Questa risoluzione consente tempi abbastanza precisi e piccole costanti (forse dovrei provare 100ms).
Paspetta un po 'e stampa un personaggio.
ystampa una sequenza YMCA, dopo un ritardo iniziale.
bstampa 4 sequenze YMCA - questo 4 * YMCA si verifica 3 volte, con tempi abbastanza simili.
mainstampa le sequenze YMCA 3 * 4 *, più le restanti 3.


"un problema nel tester" - Hai ragione , poiché apparentemente le pipe non sono dispositivi "interattivi" :( Farò uso di un PTY (che dovrebbe essere più realistico) invece di una pipe non appena avrò il tempo di .
PleaseStand

OK, ho cambiato il tester per usare un PTY e il tuo programma ha superato il test. Ho anche scoperto un'utilità chiamata stdbuf che utilizza qualche trucco LD_PRELOAD per sovrascrivere il comportamento di buffering predefinito della libreria I / O standard C.
PleaseStand,

4

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

Ho appena realizzato che non c'è nulla nelle regole che vieta le doppie virgolette intorno a ogni lettera. Tuttavia, la presentazione sembra funzionare perfettamente :)
PleaseStand,

1
La seconda parte di codegolf.stackexchange.com/questions/6695/… è rilevante anche per te.
JPvd Merwe, il

@JPvdMerwe Grazie mille! Hai ragione. La caduta di due decimali non ha alcun effetto significativo. Inoltre, dopo averlo fatto, ho notato che se modifico i valori di ± 0,1 ci sono alcuni schemi che consentono di costruire l'array in meno caratteri.
Cristian Lupascu,

Potresti fare %w(Y M C A)*15invece di 'Y M C A'.split*15generare le lettere? Inoltre, questo eachpotrebbe essere probabilmente mapanche se non è necessario l'output. Oh, e puoi scrivere 10.0come 1e1!
Paul Prestidge,

@chron Grazie! Pensavo che non potessi fare molto di più per giocare a golf con questo codice, ma ovviamente mi sbagliavo. :-)
Cristian Lupascu,

0

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

Fisso. Sono andato contro il video e sembra accurato. Risparmio silenzioso di alcuni caratteri riducendo la precisione da 3 a 2 nella maggior parte dei casi (grazie per il suggerimento @JPvdMerwe).

L'unico problema è che il tester mostra un'enorme discrepanza nei tempi. Si avvia fuori sincrono e tenta di tornare in sincronia. Nei due casi di test all'inizio era più di 175 secondi fuori sincrono ed è tornato a 0,342 e 0,451 secondi dopo essere stato nuovamente sincronizzato.

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

Riesci a farlo funzionare in ognuna delle quindici volte sopra elencate? Sembra anche che sulla mia macchina, dovrai includere l' -uopzione della riga di comando nel conteggio.
PleaseStand,

@PleaseStand fatto, ora funziona 15 volte. Non so se aggiungere -u, non ne ho bisogno sul mio. Ho Python2.6, se questo aiuta
elssar

Per chiarire, il programma dovrebbe stampare la prima "Y" dopo circa 45.766 secondi ed -uè necessario per il programma tester (che utilizza un tubo), non per l'output diretto a un terminale.
PleaseStand

@PleaseStand Sì, mi chiedevo quali fossero i tempi. Te lo avrei chiesto, ma hai già risposto prima che avessi una possibilità. E per quanto riguarda il programma tester, è un requisito che il programma funzioni sul tester così com'è, o accetterai invii che devono essere modificati per funzionare sul tester, ma funzionano bene autonomamente?
elssar,

Humm, posso passare il mio codice al tester senza dover usare alcuna opzione
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}

Ho visto l'intero video per confermare i tempi. YMC A .... YMC A ...

Potrebbe essere più breve con meno precisione, ma poi dovrei guardare di nuovo il video per confermare che alla fine non era spento di oltre .125. lol

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.