É divertido ficar no YMCA

15

"YMCA" é uma música popular do disco do Village People que tem uma dança bem conhecida . Escreva o programa mais curto para emitir as letras maiúsculas "Y", "M", "C" e "A" sincronizadas com o coro da música.

Geralmente, uma letra é enviada em cada linha enviada para a saída padrão. Isso é principalmente para simplificar os programas sujeitos ao buffer de saída da biblioteca padrão C (a impressão de uma nova linha libera o buffer de saída); portanto, você pode omitir uma ou todas essas novas linhas, se essa omissão diminuir o seu programa.

Seu programa, iniciado ao mesmo tempo que a música, deve exibir a letra "Y" dentro de 0,125 s de cada um desses momentos após o início (em segundos; eu determinei isso no videoclipe postado no 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

As letras "M", "C" e "A" respectivamente vêm 0,930 s, 1,395 se 1,628 s após cada "Y". Para fins de teste, esses tempos relativos são convertidos em tempos absolutos, adicionando-os ao tempo do "Y" anterior.

Eu escrevi um programa de teste e um exemplo correspondente em C que assume que uma nova linha segue cada letra (embora isso não seja uma regra de concorrência). Ele foi escrito para Linux e não funcionará no Windows sem usar o Cygwin. Se você não puder testar seu envio usando o programa de teste, verifique pelo menos o envio no vídeo do YouTube .

Se o seu envio exigir que uma opção de linha de comando especial se comporte corretamente, essa opção de linha de comando será válida no cálculo de sua pontuação. No entanto, qualquer tempo de inicialização do intérprete não conta contra você e o programa de teste pode ser modificado para acomodar isso, se necessário.

Embora eu duvide que exista, devo dizer que é proibido o uso de uma função ou biblioteca de linguagem de programação projetada especificamente para esta tarefa.

PleaseStand
fonte

Respostas:

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

O testador passa, mas somente se fflush(stdout);for adicionado após cada um puts. Como a pergunta afirma claramente que fflushnão é necessária, eu a considero um problema no testador.

Lógica:
wdorme, o tempo é dado em unidades de 16.384 65.536 ms. Essa resolução permite um tempo suficientemente preciso e constantes pequenas (talvez eu deva tentar 100ms).
Pespera um pouco e imprime um personagem.
yimprime uma sequência YMCA, após um atraso inicial.
bimprime 4 seqüências YMCA - esse 4 * YMCA acontece 3 vezes, com tempo suficiente semelhante.
mainimprime as sequências 3 * 4 * YMCA, mais as 3 restantes.

Ugoren
fonte
"um problema no testador" - Você está certo , pois aparentemente os tubos não são dispositivos "interativos" :( Vou usar um PTY (que deve ser mais realista) em vez de um tubo assim que tiver tempo para .
PleaseStand
OK, mudei o testador para usar um PTY e seu programa passou no teste. Também descobri sobre um utilitário chamado stdbuf que usa algum truque LD_PRELOAD para substituir o comportamento padrão de buffer da biblioteca de E / S padrão C.
PleaseStand
4

Rubi 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
fonte
Acabei de perceber que não há nada nas regras que proíba aspas duplas em torno de cada letra. No entanto, a apresentação parece funcionar perfeitamente :)
PleaseStand
1
A segunda parte de codegolf.stackexchange.com/questions/6695/… também é relevante para você.
JPvdMerwe
@JPvdMerwe Muito obrigado! Você está certo. Soltar duas casas decimais não tem efeito significativo. Além disso, depois que fiz isso, notei que se eu ajustar os valores ± 0,1, existem alguns padrões que permitem que o array seja construído em menos caracteres.
Cristian Lupascu
Você poderia fazer em %w(Y M C A)*15vez de 'Y M C A'.split*15gerar as letras? Além disso, isso eachprovavelmente pode ser um caso de mapvocê não precisar da saída. Ah, e você pode escrever 10.0como 1e1!
22312 Paul Prestidge
@chron Obrigado! Eu pensei que não havia nada que pudesse fazer para jogar ainda mais esse código, mas estava obviamente errado. :-)
Cristian Lupascu
0

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

Fixo. Funcionou contra o vídeo e parece preciso. Economizou alguns caracteres em silêncio, reduzindo a precisão de 3 para 2 na maioria dos casos (obrigado pela dica @JPvdMerwe).

O único problema é que o testador mostra uma enorme discrepância nos tempos. Começa fora da sincronização e tenta voltar à sincronização. Nos dois casos de teste, ficou mais de 175 segundos fora de sincronia no início e voltou a ficar entre 0,342 e 0,451 segundos após a sincronização.

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
fonte
Você pode executá-lo em cada uma das quinze vezes listadas acima? Parece também que, na minha máquina, você precisará incluir a -uopção de linha de comando na contagem.
precisa saber é o seguinte
@PleaseStand, agora ele é executado 15 vezes. Não sei como adicionar -u, não preciso dele no meu. Eu tenho python2.6, se isso ajuda
elssar
Para esclarecer, seu programa deve imprimir o primeiro "Y" após aproximadamente 45.766 s e -ué necessário para o programa testador (que usa um tubo), não para a saída diretamente para um terminal.
precisa saber é o seguinte
@PleaseStand Sim, eu estava pensando sobre o momento. Iria perguntar, mas você já respondeu antes que eu tivesse uma chance. E sobre o programa testador, é um requisito que o programa seja executado no seu testador como está, ou você aceitará envios que precisam ser modificados para serem executados no testador, mas que sejam executados de maneira independente?
elssar
Humm, eu posso passar meu código para o testador sem ter que usar nenhuma opção
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}

Eu assisti o vídeo inteiro para confirmar o tempo. YMC A .... YMC A ...

Poderia ser mais curto com menos precisão, mas então eu teria que assistir ao vídeo novamente para confirmar que não estava desligado em mais de 0,125 no final. ri muito

Mr.Wizard
fonte