C'est amusant de rester au YMCA

15

"YMCA" est une chanson disco populaire des Village People qui a une danse bien connue . Écrivez le programme le plus court pour produire les lettres majuscules "Y", "M", "C" et "A" synchronisées avec le refrain du morceau.

Généralement, une lettre va sur chaque ligne envoyée à la sortie standard. Il s'agit principalement de simplifier les programmes soumis à la mise en mémoire tampon de sortie de la bibliothèque standard C (l'impression d'une nouvelle ligne vide la mémoire tampon de sortie), vous pouvez donc omettre une ou toutes ces nouvelles lignes si une telle omission rendrait votre programme plus court.

Votre programme, qui démarre en même temps que la musique, doit sortir la lettre "Y" à 0,125 s de chacune de ces heures après le démarrage (en secondes; je les ai déterminées à partir du clip publié sur 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

Les lettres "M", "C" et "A" viennent respectivement 0,930 s, 1,395 s et 1,628 s après chaque "Y". A des fins de test, ces temps relatifs sont convertis en temps absolus en les ajoutant au temps du "Y" précédent.

J'ai écrit un programme de test et un exemple de programme correspondant en C qui supposent qu'une nouvelle ligne suit chaque lettre (bien que ce ne soit pas une règle de concurrence). Il est écrit pour Linux et ne fonctionnera pas sur Windows sans utiliser Cygwin. Si vous ne pouvez pas tester votre soumission à l'aide du programme de test, vérifiez au moins votre soumission par rapport à la vidéo YouTube .

Si votre soumission nécessite une option de ligne de commande spéciale pour se comporter correctement, cette option de ligne de commande compte lors du calcul de votre score. Cependant, tout temps de démarrage de l'interpréteur ne compte pas pour vous et le programme de test peut être modifié pour l'adapter si nécessaire.

Bien que je doute qu'il existe, je dois dire que l'utilisation d'une fonction de langage de programmation ou d'une bibliothèque conçue spécifiquement pour cette tâche est interdite.

Veuillez vous lever
la source

Réponses:

3

C, 161 154 caractères

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

Le testeur réussit, mais seulement s'il fflush(stdout);est ajouté après chaque test puts. Étant donné que la question indique clairement que ce fflushn'est pas nécessaire, je considère cela comme un problème dans le testeur.

Logique:
wdort, le temps est donné en unités de 16,384 65,536 ms. Cette résolution permet un timing suffisamment précis et de petites constantes (je devrais peut-être essayer 100 ms).
Pattend un moment et imprime un caractère.
yimprime une séquence YMCA, après un délai initial.
bimprime 4 séquences YMCA - ce YMCA 4 * se produit 3 fois, avec un timing suffisamment similaire.
mainimprime les séquences YMCA 3 * 4 *, plus les 3 restantes.

ugoren
la source
"un problème dans le testeur" - Vous avez raison , car apparemment les tuyaux ne sont pas des appareils "interactifs" :( je vais lui faire utiliser un PTY (qui devrait être plus réaliste) au lieu d'un tuyau dès que j'aurai le temps de .
PleaseStand
OK, j'ai changé le testeur pour utiliser un PTY et votre programme réussit le test. J'ai également découvert un utilitaire appelé stdbuf qui utilise une astuce LD_PRELOAD pour remplacer le comportement de mise en mémoire tampon par défaut de la bibliothèque d'E / S standard C.
PleaseStand
4

Ruby 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}
w0lf
la source
Je viens de réaliser que rien dans les règles n'interdit les doubles guillemets autour de chaque lettre. Cependant, la soumission semble fonctionner parfaitement :)
PleaseStand
1
La deuxième partie de codegolf.stackexchange.com/questions/6695/… vous concerne également.
JPvdMerwe
@JPvdMerwe Merci beaucoup! Tu as raison. La suppression de deux décimales n'a pas d'effet significatif. De plus, après avoir fait cela, j'ai remarqué que si je modifiais les valeurs ± 0,1, il y avait des modèles qui permettaient de construire le tableau en moins de caractères.
Cristian Lupascu
Pourriez-vous faire %w(Y M C A)*15au lieu de 'Y M C A'.split*15générer les lettres? Cela eachpourrait également être un mapproblème même si vous n'avez pas besoin de la sortie. Oh, et vous pouvez écrire 10.0comme 1e1!
Paul Prestidge
@chron Merci! Je pensais que je ne pouvais rien faire de plus pour jouer à ce code, mais j'avais manifestement tort. :-)
Cristian Lupascu
0

Python 2,6 ( 82 ) ( 214 ) ( 219 ) ( 196 ) ( 185 ) (152)

Fixé. Couru contre la vidéo et semble précis. Enregistrement de quelques caractères silencieux en réduisant la précision de 3 à 2 dans la plupart des cas (merci pour la astuce @JPvdMerwe).

Le seul problème est que le testeur montre une énorme différence dans les horaires. Il démarre désynchronisé et essaie de revenir en synchronisation. Dans les deux cas de test, elle était désynchronisée de plus de 175 secondes au début et est revenue à moins de 0,342 et 0,451 seconde après avoir été synchronisée.

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
Elsar
la source
Pouvez-vous le faire fonctionner à chacune des quinze fois énumérées ci-dessus? Il semble également que sur ma machine, vous devrez inclure l' -uoption de ligne de commande dans le décompte.
PleaseStand
@PleaseStand fait, maintenant il s'exécute 15 fois. Je ne sais pas ajouter -u, je n'en ai pas besoin sur le mien. J'ai Python2.6, si cela aide
Elsar
Pour clarifier, votre programme doit imprimer le premier "Y" après environ 45,766 s, et -uest nécessaire pour le programme de testeur (qui utilise un tuyau), pas pour la sortie directement vers un terminal.
PleaseStand
@PleaseStand Ouais, je me posais des questions sur le timing. J'allais te le demander, mais tu as déjà répondu avant que j'aie une chance. Et à propos du programme de testeur, est-il obligatoire que le programme fonctionne sur votre testeur tel quel, ou accepterez-vous des soumissions qui doivent être modifiées pour s'exécuter sur le testeur, mais fonctionner correctement de façon autonome?
elssar
Humm, je peux passer mon code au testeur sans avoir à utiliser d'options
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}

J'ai regardé la vidéo entière pour confirmer le timing. YMC A .... YMC A ...

Il pourrait être plus court avec moins de précision, mais je devrais alors regarder à nouveau la vidéo pour confirmer qu'elle n'était pas éteinte de plus de 0,125 à la fin. lol

Mr.Wizard
la source