Es divertido estar en el Y-M-C-A

15

"YMCA" es una popular canción disco de Village People que tiene un baile muy conocido . Escriba el programa más corto para generar las letras mayúsculas "Y", "M", "C" y "A" sincronizadas con el coro de la canción.

Generalmente, una letra va en cada línea enviada a la salida estándar. Esto es principalmente para simplificar los programas sujetos al almacenamiento en búfer de salida de la biblioteca estándar de C (imprimir una nueva línea vacía el búfer de salida), por lo que puede omitir cualquiera o todas estas nuevas líneas si dicha omisión acortaría su programa.

Su programa, que se inicia al mismo tiempo que la música, debe emitir la letra "Y" dentro de 0.125 s de cada uno de estos tiempos después de comenzar (en segundos; lo determiné a partir del video musical publicado en 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

Las letras "M", "C" y "A" vienen respectivamente 0.930 s, 1.395 sy 1.628 s después de cada "Y". Para fines de prueba, estos tiempos relativos se convierten en tiempos absolutos agregándolos al tiempo de la "Y" precedente.

He escrito un programa de prueba y un programa de ejemplo correspondiente en C que supone que una nueva línea sigue a cada letra (aunque esto no es una regla de competencia). Está escrito para Linux y no funcionará en Windows sin usar Cygwin. Si no puede probar su envío utilizando el programa de prueba, al menos verifique su envío con el video de YouTube .

Si su envío requiere una opción especial de línea de comandos para comportarse correctamente, esa opción de línea de comandos cuenta al calcular su puntaje. Sin embargo, cualquier tiempo de inicio del intérprete no cuenta en su contra, y el programa de prueba se puede modificar para acomodarlo si es necesario.

Aunque dudo que exista, debo decir que está prohibido usar una función o biblioteca de lenguaje de programación diseñada específicamente para esta tarea.

Por favor levantese
fuente

Respuestas:

3

C, 161 154 caracteres

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

El probador pasa, pero solo si fflush(stdout);se agrega después de cada uno puts. Dado que la pregunta establece claramente quefflush no es obligatorio, lo tomo como un problema en el probador.

Lógica:
wduerme, el tiempo se da en unidades de 16.384 65.536 ms. Esta resolución permite un tiempo suficientemente preciso y constantes pequeñas (tal vez debería probar 100 ms).
Pespera un momento e imprime un personaje.
yimprime una secuencia YMCA, después de un retraso inicial.
bimprime 4 secuencias YMCA: este 4 * YMCA ocurre 3 veces, con un tiempo suficientemente similar.
mainimprime las secuencias 3 * 4 * YMCA, más las 3 restantes.

Ugoren
fuente
"un problema en el probador" - Tienes razón , ya que aparentemente las tuberías no son dispositivos "interactivos" :( Haré que use un PTY (que debería ser más realista) en lugar de una tubería tan pronto como tenga tiempo para .
PleaseStand
OK, cambié el probador para usar un PTY, y su programa pasa la prueba. También descubrí una utilidad llamada stdbuf que usa algún truco LD_PRELOAD para anular el comportamiento de almacenamiento en búfer predeterminado de la biblioteca de E / S estándar de C.
favor
4

Rubí 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
fuente
Me acabo de dar cuenta de que no hay nada en las reglas que prohíba las comillas dobles alrededor de cada letra. Sin embargo, la presentación parece funcionar perfectamente :)
favor
1
La segunda parte de codegolf.stackexchange.com/questions/6695/… también es relevante para usted.
JPvdMerwe
@JPvdMerwe Muchas gracias! Tienes razon Dejar caer dos decimales no tiene ningún efecto significativo. Además, después de hacer eso, noté que si ajusto los valores ± 0.1 hay algunos patrones que permiten que la matriz se construya en menos caracteres.
Cristian Lupascu
¿Podrías hacer en %w(Y M C A)*15lugar de 'Y M C A'.split*15generar las letras? Además, eso eachpodría ser un problema mapaunque no necesite la salida. Ah, y puedes escribir 10.0como 1e1!
Paul Prestidge
@chron ¡Gracias! Pensé que no podía hacer mucho más para jugar golf este código, pero obviamente estaba equivocado. :-)
Cristian Lupascu
0

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

Fijo. Corrió contra el video y parece exacto. Se ahorraron algunos caracteres al reducir la precisión de 3 a 2 en la mayoría de los casos (gracias por la sugerencia @JPvdMerwe).

El único problema es que el probador muestra una gran discrepancia en los tiempos. Comienza sin sincronizar e intenta volver a sincronizarse. En los dos casos de prueba, la sincronización estuvo más de 175 segundos sin sincronizar al principio y volvió a estar dentro de 0.342 y 0.451 segundos de estar nuevamente sincronizado.

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
fuente
¿Puedes hacer que se ejecute en cada una de las quince veces mencionadas anteriormente? También parece que en mi máquina, deberá incluir la -uopción de línea de comando en el recuento.
favor
@PleaseStand hecho, ahora se ejecuta 15 veces. No sé sobre agregar -u, no lo necesito en el mío. Tengo Python2.6, si eso ayuda
elssar
Para aclarar, su programa debe imprimir la primera "Y" después de aproximadamente 45.766 s, y -ues necesario para el programa de prueba (que usa una tubería), no para enviarlo directamente a un terminal.
favor
@PleaseStand Sí, me preguntaba sobre el momento. Te iba a preguntar, pero ya respondiste antes de que tuviera oportunidad. Y sobre el programa del probador, ¿es un requisito que el programa se ejecute en su probador tal como está, o aceptará envíos que deben modificarse para ejecutarse en el probador, pero que se ejecutan bien de forma independiente?
elssar
Humm, puedo pasar mi código al probador sin tener que usar ninguna opción
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}

Vi todo el video para confirmar el momento. YMC A .... YMC A ...

Podría ser más corto con menos precisión, pero luego tendría que ver el video nuevamente para confirmar que no estaba apagado por más de .125 al final. jajaja

Señor mago
fuente