Это весело, чтобы остаться в YMCA


15

"YMCA" - это популярная дискотека песни Village People, в которой есть известный танец . Напишите самую короткую программу для вывода заглавных букв «Y», «M», «C» и «A», синхронизированных с припевом песни.

Как правило, одна буква идет в каждой строке, отправленной на стандартный вывод. В первую очередь это должно упростить программы, подверженные выходной буферизации стандартной библиотеки C (печать новой строки сбрасывает выходной буфер), так что вы можете пропустить любой или все эти новые строки, если такое пропускание сделает вашу программу короче.

Ваша программа, которая запускается одновременно с музыкой, должна выводить букву «Y» в течение 0,125 с каждого из этих моментов времени после запуска (в секундах; я определил это по музыкальному видео, размещенному на 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» соответственно идут через 0,930 с, 1,359 с и 1,628 с после каждого «Y». В целях тестирования эти относительные времена преобразуются в абсолютные, добавляя их ко времени предшествующего «Y».

Я написал тестовую программу и соответствующий пример программы на C, в которой предполагается, что после каждой буквы стоит новая строка (хотя это не правило соревнования). Он написан для Linux и не будет работать в Windows без использования Cygwin. Если вы не можете проверить свою заявку с помощью тестовой программы, по крайней мере, проверьте свою отправку на видео 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 мс. Это разрешение позволяет достаточно точно рассчитывать время и небольшие константы (возможно, мне следует попробовать 100 мс).
Pждет некоторое время и печатает символ.
yпечатает последовательность YMCA после начальной задержки.
bпечатает 4 последовательности YMCA - эта 4 * YMCA происходит 3 раза с одинаковым временем синхронизации.
mainпечатает последовательности 3 * 4 * YMCA плюс оставшиеся 3.


«проблема в тестере» - Вы правы , поскольку каналы, по-видимому, не являются «интерактивными» устройствами :( Я заставлю его использовать PTY (который должен быть более реалистичным) вместо канала, как только у меня будет время .
PleaseStand

ОК, я изменил тестер на использование PTY, и ваша программа прошла тест. Я также узнал об утилите stdbuf, которая использует трюк LD_PRELOAD для переопределения стандартного поведения буферизации стандартной библиотеки ввода / вывода C.
Пожалуйста, постой

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, есть некоторые шаблоны, которые позволяют создавать массив с меньшим количеством символов.
Кристиан Лупаску

Не могли бы вы сделать %w(Y M C A)*15вместо того, 'Y M C A'.split*15чтобы генерировать письма? Также это eachможет быть, mapдаже если вам не нужен вывод. Ох, и вы можете написать 10.0как 1e1!
Пол Престиж

@chron Спасибо! Я думал, что ничего не мог поделать с этим кодом еще больше, но я был явно неправ. :-)
Кристиан Лупаску

0

Python2,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

Можете ли вы заставить его работать в каждом из пятнадцати раз, перечисленных выше? Похоже, что на моем компьютере вам нужно будет включить параметр -uкомандной строки в счетчик.
Пожалуйста, установите

@PleaseStand сделано, теперь оно запускается 15 раз. Я не знаю о добавлении -u, он мне не нужен. У меня есть Python2.6, если это поможет
elssar

Чтобы уточнить, ваша программа должна напечатать первое «Y» примерно через 45.766 с, и -uэто необходимо для программы-тестера (которая использует канал), а не для вывода непосредственно на терминал.
Пожалуйста, установите

@PleaseStand Да, мне было интересно узнать время. Я собирался спросить тебя, но ты уже ответил, прежде чем у меня был шанс. А что касается программы тестирования, является ли требование, чтобы программа работала на вашем тестере в том виде, в каком она есть, или вы примете предложения, которые необходимо изменить, чтобы запустить на тестере, но работать нормально автономно?
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 в конце. лол

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.