Thật vui khi ở Y-M-C-A


15

"YMCA" là một bài hát vũ trường nổi tiếng của Village People có một điệu nhảy nổi tiếng . Viết chương trình ngắn nhất để xuất các chữ in hoa "Y", "M", "C" và "A" được đồng bộ hóa với điệp khúc của bài hát.

Nói chung, một chữ cái đi trên mỗi dòng được gửi đến đầu ra tiêu chuẩn. Điều này chủ yếu là để đơn giản hóa các chương trình theo bộ đệm đầu ra của thư viện chuẩn C (in một dòng mới tuôn ra bộ đệm đầu ra), vì vậy bạn có thể bỏ qua bất kỳ hoặc tất cả các dòng mới này nếu thiếu sót đó sẽ làm cho chương trình của bạn ngắn hơn.

Chương trình của bạn, được bắt đầu cùng lúc với âm nhạc, phải xuất chữ "Y" trong vòng 0,125 giây sau mỗi lần bắt đầu (tính bằng giây; tôi xác định những điều này từ video âm nhạc được đăng trên 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

Các chữ cái "M", "C" và "A" lần lượt là 0,930 s, 1,395 s và 1,628 s sau mỗi chữ "Y". Đối với mục đích thử nghiệm, các thời gian tương đối này được chuyển đổi thành thời gian tuyệt đối bằng cách thêm chúng vào thời gian của chữ "Y" trước đó.

Tôi đã viết một chương trình thử nghiệm và chương trình ví dụ tương ứng trong C giả sử một dòng mới theo sau mỗi chữ cái (mặc dù đây không phải là quy tắc cạnh tranh). Nó được viết cho Linux và sẽ không hoạt động trên Windows mà không sử dụng Cygwin. Nếu bạn không thể kiểm tra nội dung gửi của mình bằng chương trình thử nghiệm, ít nhất hãy kiểm tra nội dung gửi của bạn đối với video YouTube .

Nếu trình của bạn yêu cầu một tùy chọn dòng lệnh đặc biệt để hành xử đúng, tùy chọn dòng lệnh đó sẽ được tính khi tính điểm của bạn. Tuy nhiên, bất kỳ thời gian khởi động trình thông dịch nào đều không được tính vào bạn và chương trình thử nghiệm có thể được sửa đổi để phù hợp với điều đó nếu cần thiết.

Mặc dù tôi nghi ngờ có tồn tại, tôi phải nói rằng việc sử dụng chức năng ngôn ngữ lập trình hoặc thư viện được thiết kế riêng cho nhiệm vụ này đều bị cấm.

Câu trả lời:


3

C, 161 154 ký tự

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

Người kiểm tra vượt qua, nhưng chỉ khi fflush(stdout);được thêm vào sau mỗi puts. Vì câu hỏi nêu rõ rằng fflushkhông bắt buộc, tôi coi đó là một vấn đề trong bài kiểm tra.

Logic:
wngủ, thời gian được tính theo đơn vị 16.384 65.536 ms. Độ phân giải này cho phép đủ thời gian chính xác và các hằng số nhỏ (có lẽ tôi nên thử 100ms).
PĐợi một lúc và in một ký tự.
yin một chuỗi YMCA, sau một độ trễ ban đầu.
bin 4 chuỗi YMCA - 4 * YMCA này xảy ra 3 lần, với thời gian đủ tương tự.
mainin các chuỗi 3 * 4 * YMCA, cộng với 3 còn lại.


"một vấn đề trong người thử nghiệm" - Bạn nói đúng , vì rõ ràng các đường ống không phải là thiết bị "tương tác" :( Tôi sẽ làm cho nó sử dụng PTY (nên thực tế hơn) thay vì một đường ống ngay khi tôi có thời gian .
Xin vui lòng vào

OK, tôi đã thay đổi người kiểm tra để sử dụng PTY và chương trình của bạn vượt qua bài kiểm tra. Tôi cũng đã tìm hiểu về một tiện ích có tên stdbuf sử dụng một số thủ thuật LD_PRELOAD để ghi đè hành vi đệm mặc định của thư viện I / O tiêu chuẩn C.
Xin vui lòng

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}

Tôi chỉ nhận ra rằng không có gì trong các quy tắc cấm trích dẫn kép xung quanh mỗi chữ cái. Tuy nhiên, bài nộp dường như hoạt động hoàn hảo :)
Xin vui lòng

1
Phần thứ hai của codegolf.stackexchange.com/questions/6695/ cấp cũng có liên quan đến bạn.
JPvdMerwe

@JPvdMerwe Cảm ơn rất nhiều! Bạn nói đúng. Giảm hai số thập phân không có bất kỳ ảnh hưởng đáng kể. Ngoài ra, sau khi tôi làm điều đó tôi nhận thấy rằng nếu tôi điều chỉnh các giá trị ± 0,1, có một số mẫu cho phép mảng được xây dựng trong ít ký tự hơn.
Cristian Lupascu

Bạn có thể làm %w(Y M C A)*15thay vì 'Y M C A'.split*15để tạo ra các chữ cái? Ngoài ra, đó eachcó thể là một mapmặc dù bạn không cần đầu ra. Oh, và bạn có thể viết 10.0như 1e1!
Paul Prestidge

@ sync Cảm ơn! Tôi nghĩ rằng tôi không thể làm gì nhiều để chơi mã này hơn nữa, nhưng rõ ràng là tôi đã sai. :-)
Cristian Lupascu

0

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

Đã sửa. Ran chống lại video và có vẻ chính xác. Đã lưu một vài ký tự bằng cách giảm độ chính xác từ 3 xuống 2 trong hầu hết các trường hợp (cảm ơn vì mẹo @JPvdMerwe).

Vấn đề duy nhất là người kiểm tra cho thấy sự khác biệt rất lớn trong thời gian. Nó bắt đầu không đồng bộ và cố gắng trở lại đồng bộ hóa. Trong hai trường hợp thử nghiệm, nó đã mất hơn 175 giây đồng bộ ngay từ đầu và quay trở lại trong vòng 0,342 và 0,451 giây sau khi được đồng bộ hóa trở lại.

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

Bạn có thể làm cho nó chạy ở mỗi mười lăm lần được liệt kê ở trên không? Dường như trên máy của tôi, bạn sẽ cần bao gồm -utùy chọn dòng lệnh trong số đếm.
Xin vui lòng

@PleaseStand xong, giờ nó chạy 15 lần. Tôi không biết về việc thêm -u, không cần nó cho tôi. Tôi có Python2.6, nếu điều đó có ích
elssar

Để làm rõ, chương trình của bạn nên in chữ "Y" đầu tiên sau khoảng 45.766 giây và -ucần thiết cho chương trình thử nghiệm (sử dụng đường ống), không cho đầu ra trực tiếp đến thiết bị đầu cuối.
Xin vui lòng

@PleaseStand Vâng, tôi đã tự hỏi về thời gian. Sẽ hỏi bạn, nhưng bạn đã trả lời trước khi tôi có cơ hội. Và về chương trình thử nghiệm, đó có phải là một yêu cầu mà chương trình chạy trên trình kiểm tra của bạn không, hoặc bạn sẽ chấp nhận các bài nộp cần được sửa đổi để chạy trên trình kiểm tra, nhưng chạy độc lập tốt?
elssar

Humm, tôi có thể chuyển mã của mình cho người kiểm tra mà không phải sử dụng bất kỳ tùy chọn nào
elssar

0

Toán học, 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}

Tôi đã xem toàn bộ video để xác nhận thời gian. YMC A .... YMC A ...

Nó có thể ngắn hơn với độ chính xác thấp hơn, nhưng sau đó tôi phải xem lại video để xác nhận rằng nó không bị tắt quá 0,125 ở cuối. cười lớn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.