YMCAに滞在するのは楽しいです


15

「YMCA」は、Village Peopleによる有名なディスコソングで、よく知られたダンスを持っています。曲のコーラスに同期した大文字の「Y」、「M」、「C」、「A」を出力する最短のプログラムを作成します。

通常、標準出力に送信される各行には1文字が入ります。これは主に、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、161 154文字

#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.536ミリ秒の単位で指定されます。この解像度により、十分に正確なタイミングと小さな定数が可能になります(おそらく100msを試す必要があります)。
Pしばらく待ってから文字を出力します。
y初期遅延の後、YMCAシーケンスを出力します。
b4つのYMCAシーケンスを出力します-この4 * YMCAは3回発生し、同様のタイミングで発生します。
main3 * 4 * YMCAシーケンスに加えて、残りの3つを出力します。


「テスターの問題」- パイプは明らかに「インタラクティブ」デバイスではないので、そうです。
PleaseStand

OK、テスターをPTYを使用するように変更すると、プログラムはテストに合格します。また、LD_PRELOADトリックを使用してC標準I / Oライブラリのデフォルトのバッファリング動作をオーバーライドするstdbufというユーティリティについても知りました。
プリーズスタンド

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/…の2番目の部分もあなたに関連しています。
JPvdMerwe

@JPvdMerweどうもありがとう!あなたは正しい。小数点以下2桁を削除しても、大きな影響はありません。また、それを行った後、値を±0.1に調整すると、配列をより少ない文字で構築できるパターンがいくつかあることに気付きました。
クリスチャンルパスク

文字を生成する%w(Y M C A)*15代わりにできます'Y M C A'.split*15か?また、出力が必要ない場合でも、eachおそらくそれは可能性がmapあります。ああ、あなたは書くことができます10.0よう1e1
ポール・プレスティッジ

@chronありがとう!このコードをさらにゴルフするためにできることはあまりないと思いましたが、明らかに間違っていました。:-)
クリスティアンLupascu

0

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

修繕。ビデオに対して走った&正確だと思われる。ほとんどの場合、精度を3から2に減らすことで、静かな数文字を保存しました(ヒント@JPvdMerweに感謝します)。

唯一の問題は、テスターがタイミングに大きな不一致を示すことです。同期がとれなくなり、同期に戻ろうとします。2つのテストケースでは、最初の同期が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数のコマンドラインオプションを。
PleaseStand

@PleaseStandが完了しました。現在は15回実行されています。-uの追加については知りませんが、私の場合は必要ありません。Python2.6があれば、助けになります
-elssar

明確にするために、プログラムは約45.766秒後に最初の「Y」-uを出力する必要があります。これは、ターミナルへの直接出力ではなく、テスタープログラム(パイプを使用)に必要です。
プリーズスタンド

@PleaseStandええ、私はタイミングについて疑問に思っていました。あなたに尋ねるつもりだったが、あなたは私がチャンスを得る前にすでに答えていた。また、テスタープログラムについては、プログラムをテスターでそのまま実行する必要がありますか、それとも、テスターで実行するために修正する必要があるが、スタンドアロンで実行する必要がある提出を受け入れますか?
エルサール

フム、オプションを使用せずにコードをテスターに​​渡すことができます
-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}

ビデオ全体を見て、タイミングを確認しました。YMC A .... YMC A ...

精度を下げて短くすることもできますが、最後に0.125を超えてオフになっていないことを確認するために、もう一度ビデオを見る必要があります。笑

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.