Es macht Spaß, im YMCA zu bleiben


15

"YMCA" ist ein populärer Disco-Song der Village People, der einen bekannten Tanz hat . Schreiben Sie das kürzeste Programm, um die mit dem Chorus des Songs synchronisierten Großbuchstaben "Y", "M", "C" und "A" auszugeben.

In der Regel wird in jeder Zeile, die an die Standardausgabe gesendet wird, ein Buchstabe eingefügt. Dies dient in erster Linie dazu, Programme zu vereinfachen, die der Ausgabepufferung der C-Standardbibliothek unterliegen (durch Drucken einer neuen Zeile wird der Ausgabepuffer geleert). Sie können also einige oder alle dieser neuen Zeilen weglassen, wenn dies zu einer Verkürzung Ihres Programms führen würde.

Ihr Programm, das gleichzeitig mit der Musik gestartet wird, muss nach dem Start innerhalb von jeweils 0,125 s den Buchstaben "Y" ausgeben (in Sekunden; ich habe dies aus dem auf YouTube geposteten Musikvideo ermittelt).

 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

Die Buchstaben "M", "C" und "A" kommen jeweils 0,930 s, 1,395 s und 1,628 s nach jedem "Y". Zu Testzwecken werden diese relativen Zeiten in absolute Zeiten umgewandelt, indem sie zur Zeit des vorhergehenden "Y" addiert werden.

Ich habe ein Testprogramm und ein entsprechendes Beispielprogramm in C geschrieben, in dem angenommen wird, dass jedem Buchstaben eine neue Zeile folgt (obwohl dies keine Wettbewerbsregel ist). Es ist für Linux geschrieben und funktioniert nicht unter Windows ohne Cygwin. Wenn du deine Einsendung nicht mit dem Testprogramm testen kannst, überprüfe deine Einsendung zumindest anhand des YouTube-Videos .

Wenn für Ihre Übermittlung eine spezielle Befehlszeilenoption erforderlich ist, um ordnungsgemäß zu funktionieren, wird diese Befehlszeilenoption bei der Berechnung Ihrer Punktzahl berücksichtigt. Die Startzeit eines Interpreters zählt jedoch nicht für Sie, und das Testprogramm kann bei Bedarf geändert werden.

Obwohl ich bezweifle, dass es eine solche gibt, muss ich sagen, dass die Verwendung einer speziell für diese Aufgabe entwickelten Programmiersprachenfunktion oder Bibliothek verboten ist.

Antworten:


3

C, 161 154 Zeichen

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

Der Tester besteht, aber nur, wenn fflush(stdout);nach jedem hinzugefügt wird puts. Da die Frage eindeutig besagt, dass dies fflushnicht erforderlich ist, nehme ich es als Problem im Tester.

Logik:
wschläft, die Zeit wird in Einheiten von 16.384 bis 65.536 ms angegeben. Diese Auflösung ermöglicht genau genug Timing und kleine Konstanten (ich sollte vielleicht 100ms versuchen).
PWartet eine Weile und druckt ein Zeichen.
ydruckt nach einer anfänglichen Verzögerung eine YMCA-Sequenz.
bdruckt 4 YMCA-Sequenzen - diese 4 * YMCA kommt dreimal vor, mit ausreichend ähnlichem Timing.
maindruckt die 3 * 4 * YMCA-Sequenzen plus die restlichen 3.


"ein Problem im Tester" - Sie haben Recht , da Pipes anscheinend keine "interaktiven" Geräte sind :( Ich werde dafür sorgen, dass ein PTY (das realistischer sein sollte) anstelle eines Pipes verwendet wird, sobald ich die Zeit dazu habe .
PleaseStand

OK, ich habe den Tester so geändert, dass er ein PTY verwendet, und Ihr Programm besteht den Test. Ich habe auch von einem Dienstprogramm namens stdbuf erfahren, das einen LD_PRELOAD-Trick verwendet, um das Standard-Pufferverhalten der C-Standard-E / A-Bibliothek zu überschreiben.
PleaseStand

4

Ruby 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}

Mir ist gerade klar geworden, dass die Regeln nichts enthalten, was doppelte Anführungszeichen um jeden Buchstaben verbietet. Die
Übermittlung

1
Der zweite Teil von codegolf.stackexchange.com/questions/6695/… ist auch für Sie relevant.
JPvdMerwe

@JPvdMerwe Vielen Dank! Du hast recht. Das Löschen von zwei Dezimalstellen hat keine signifikanten Auswirkungen. Nachdem ich das getan hatte, bemerkte ich, dass es einige Muster gibt, mit denen das Array in weniger Zeichen aufgebaut werden kann, wenn ich die Werte ± 0,1 einstelle.
Cristian Lupascu

Könnten Sie tun, %w(Y M C A)*15anstatt 'Y M C A'.split*15die Briefe zu generieren? Auch das eachkönnte wohl eine sein map, obwohl du die Ausgabe nicht brauchst. Oh, und du kannst schreiben 10.0wie 1e1!
Paul Prestidge

@chron Danke! Ich dachte, es gäbe nicht viel, was ich tun könnte, um diesen Code noch weiter zu verbessern, aber ich habe mich offensichtlich geirrt. :-)
Cristian Lupascu

0

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

Fest. Ist gegen das Video gelaufen und scheint korrekt zu sein. Sparte leise ein paar Zeichen, indem du in den meisten Fällen die Genauigkeit von 3 auf 2 reduzierst (danke für den Tipp @JPvdMerwe).

Das einzige Problem ist, dass der Tester eine enorme Abweichung in den Timings aufweist. Es startet nicht mehr synchron und versucht, wieder synchron zu werden. In den beiden Testfällen war es zu Beginn mehr als 175 Sekunden nicht synchron und kam innerhalb von 0,342 und 0,451 Sekunden zurück, nachdem es wieder synchron war.

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

Schaffst du es, es zu jedem der fünfzehn oben genannten Male laufen zu lassen? Es scheint auch, dass Sie auf meinem Computer die -uBefehlszeilenoption in die Zählung aufnehmen müssen.
PleaseStand

@PleaseStand done, jetzt läuft es 15 mal. Ich weiß nicht, wie man -u hinzufügt, ich brauche es nicht bei mir. Ich habe Python2.6, wenn das hilft
Elssar

Zur Verdeutlichung sollte Ihr Programm nach ca. 45,766 s das erste "Y" ausgeben und -uist für das Testerprogramm (das eine Pipe verwendet) erforderlich, nicht für die direkte Ausgabe an ein Terminal.
PleaseStand

@PleaseStand Ja, ich habe mich über das Timing gewundert. Ich wollte dich fragen, aber du hast bereits geantwortet, bevor ich eine Chance hatte. Und was das Testerprogramm angeht, ist es eine Voraussetzung, dass das Programm auf Ihrem Tester ausgeführt wird, wie es ist, oder akzeptieren Sie Übermittlungen, die geändert werden müssen, um auf dem Tester ausgeführt zu werden, aber als Einzelprogramm ausgeführt werden können?
Elssar

Humm, ich kann meinen Code an den Tester weitergeben, ohne irgendwelche Optionen verwenden zu müssen
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}

Ich habe mir das gesamte Video angesehen, um das Timing zu bestätigen. YMC A .... YMC A ...

Mit geringerer Genauigkeit könnte es kürzer sein, aber dann müsste ich mir das Video noch einmal ansehen, um zu bestätigen, dass es am Ende nicht mehr als .125 abgefallen ist. lol

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.