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.0로 1e1!
— 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.