Приємно залишатися в YMCA


15

"YMCA" - популярна диско-пісня села 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

Літери "М", "С" і "А" відповідно стають 0,930 с, 1,339 с і 1,628 с після кожного "У". Для цілей тестування ці відносні часи перетворюються в абсолютні часи, додаючи їх до часу попереднього "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 (що має бути більш реалістичним) замість труби, як тільки я знайду час .
Будь ласка, продовжуйте

Гаразд, я змінив тестер на використання 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}

Я просто зрозумів, що в правилах немає нічого, що забороняє подвійні лапки навколо кожної літери. Однак подання, здається, працює чудово :)
Будь ласка, продовжте

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 разів. Я не знаю про додавання -у, мені це не потрібно. У мене 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.