YMCA에 머무르는 것은 재미있다


15

"YMCA"잘 알려진 춤 을 가진 마을 사람들에 의해 대중적인 디스코 노래 입니다. 노래의 코러스에 동기화 된 대문자 "Y", "M", "C"및 "A"를 출력하는 가장 짧은 프로그램을 작성하십시오.

일반적으로 한 줄의 문자는 각 줄에 표준 출력으로 전송됩니다. 이것은 주로 C 표준 라이브러리의 출력 버퍼링에 영향을받는 프로그램을 단순화하기위한 것입니다 (개행을 인쇄하면 출력 버퍼가 플러시 됨). 이러한 생략으로 인해 프로그램이 더 짧아 질 경우 이러한 개행을 모두 생략하거나 생략 할 수 있습니다.

음악과 동시에 시작되는 프로그램은 시작 후이 시간 각각의 0.125 초 이내에 "Y"문자를 출력해야합니다 (초). 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

문자 "M", "C"및 "A"는 각각 "Y"뒤에 각각 0.930 초, 1.395 초 및 1.628 초가된다. 테스트 목적으로이 상대 시간은 이전 "Y"시간에 추가하여 절대 시간으로 변환됩니다.

나는 개행 문자가 각 문자를 따르는 것으로 가정 하는 테스트 프로그램과 해당 예제 프로그램 을 C로 작성했습니다 (경쟁 규칙은 아니지만). Linux 용으로 작성되었으며 Cygwin을 사용하지 않으면 Windows에서 작동하지 않습니다. 테스트 프로그램을 사용하여 제출물을 테스트 할 수없는 경우 최소한 YouTube 비디오 에 대해 제출물을 확인하십시오 .

제출에 특수한 명령 줄 옵션이 제대로 작동해야하는 경우 해당 명령 줄 옵션은 점수를 계산할 때 계산됩니다. 그러나 통역사 시작 시간은 귀하를 고려하지 않으며 필요에 따라 시험 프로그램을 수정할 수 있습니다.

나는 존재하는 것이 의심 스럽지만,이 작업을 위해 특별히 설계된 프로그래밍 언어 기능이나 라이브러리를 사용하는 것은 금지되어 있다고 말해야합니다.

답변:


3

C, 161154

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

테스터는 통과하지만 fflush(stdout);각 뒤에 추가 된 경우에만 통과 합니다 puts. 질문에 명확 fflush하지 않은 질문이 나와 있으므로 테스터의 문제로 생각합니다.

논리 :
w휴면 시간은 16.384 65.536ms 단위로 제공됩니다 . 이 해상도는 정확한 타이밍과 작은 상수를 허용합니다 (아마도 100ms 시도해야합니다).
P잠시 기다렸다가 문자를 인쇄합니다.
y초기 지연 후 YMCA 시퀀스를 인쇄합니다.
b4 개의 YMCA 시퀀스를 인쇄합니다.이 4 * YMCA는 비슷한 타이밍으로 3 번 발생합니다.
main3 * 4 * YMCA 시퀀스와 나머지 3을 인쇄합니다.


"테스터의 문제"- 분명히 파이프는 "대화 형"장치가 아니기 때문에 습니다. .
PleaseStand

좋아, PTY를 사용하도록 테스터를 변경했으며 프로그램이 테스트를 통과했습니다. 또한 LD_PRELOAD 트릭을 사용하여 C 표준 I / O 라이브러리의 기본 버퍼링 동작을 재정의하는 stdbuf라는 유틸리티에 대해서도 알았습니다.
PleaseStand

4

루비 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}

나는 각 글자 주위에 큰 따옴표를 금지하는 규칙이 없다는 것을 깨달았습니다. 그러나 제출은 완벽하게 작동하는 것 같습니다 :)
PleaseStand

1
codegolf.stackexchange.com/questions/6695/… 의 두 번째 부분도 귀하 와 관련이 있습니다.
JPvdMerwe

@JPvdMerwe 감사합니다! 네 말이 맞아 소수점 이하 두 자리를 삭제해도 큰 효과는 없습니다. 또한, 내가 ± 0.1 값을 조정하면 배열을 적은 문자로 구성 할 수있는 패턴이 있음을 알았습니다.
Cristian Lupascu

글자를 생성하는 %w(Y M C A)*15대신 할 수 'Y M C A'.split*15있습니까? 또한 출력이 필요하지 않더라도 each아마도 그럴 수 있습니다 map. 아, 그리고 당신이 쓸 수 10.01e1!
Paul Prestidge

@chron 감사합니다! 나는이 코드를 더 골프화하기 위해 할 수있는 일이 많지 않다고 생각했지만 분명히 틀렸다. :-)
Cristian Lupascu

0

파이썬 2.6 ( 82 ) ( 214 ) ( 219 ) ( 196 ) ( 185 ) (152)

결정된. 비디오에 대항하고 정확 해 보입니다. 대부분의 경우 정밀도를 3에서 2로 줄임으로써 조용히 문자를 절약했습니다 (팁 @JPvdMerwe 덕분).

유일한 문제는 테스터가 타이밍에 큰 차이가 있다는 것입니다. 동기화가 시작되고 다시 동기화를 시도합니다. 두 테스트 사례에서 처음에는 동기화가 175 초 이상 걸리고 다시 동기화 된 후 0.342 초와 0.451 초 내에 돌아 왔습니다.

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

위에 나열된 15 번마다 실행할 수 있습니까? 또한 내 컴퓨터에서는 -u카운트에 명령 줄 옵션 을 포함해야합니다 .
Please Standand

@PleaseStand 완료, 이제 15 번 실행됩니다. -u를 추가하는 것에 대해 모르겠습니다. 필요하지 않습니다. 도움이된다면 Python2.6이 있습니다
elssar

명확히하기 위해 프로그램은 약 45.766 초 후에 첫 번째 "Y"를 인쇄해야 -u하며 터미널로 직접 출력하는 것이 아니라 테스터 프로그램 (파이프 사용)에 필요합니다.
Please Standand

@PleaseStand 그래, 나는 타이밍에 대해 궁금했다. 당신에게 물어 보려고했지만 기회가 있기 전에 벌써 대답했습니다. 그리고 테스터 프로그램에 관해서는, 테스터에서 프로그램을 그대로 실행해야합니까? 아니면 테스터에서 실행되도록 수정해야하지만 독립적으로 실행되는 제출을 수락합니까?
elssar

흠, 옵션을 사용할 필요없이 코드를 테스터에게 전달할 수 있습니다
elssar

0

매스 매 티카, 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}

타이밍을 확인하기 위해 전체 비디오를 보았습니다. YMC A .... YMC A ...

정확도가 떨어지면 짧아 질 수 있지만 마지막에 .125를 넘지 않는지 확인하기 위해 비디오를 다시 봐야합니다. lol

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.