留在基督教青年会很有趣


15

“ YMCA”是乡村人民流行的迪斯科歌曲,有着著名的舞蹈。编写最短的程序,以输出与歌曲的合唱同步的大写字母“ Y”,“ M”,“ C”和“ A”。

通常,发送到标准输出的每一行都有一个字母。这主要是为了简化受C标准库的输出缓冲限制的程序(打印换行符会刷新输出缓冲区),因此,如果省略这些换行符会使您的程序更短,则可以省略其中的任何或所有换行符。

您的程序(与音乐同时启动)必须在启动后每隔0.125 s内输出字母“ 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 s,1.395 s和1.628 s。出于测试目的,通过将这些相对时间加到前面的“ Y”时间中,可以将它们转换为绝对时间。

我已经用C语言编写了一个测试程序和相应的示例程序,假定每个字母后都有一个换行符(尽管这不是竞争规则)。它是为Linux编写的,如果不使用Cygwin,将无法在Windows上运行。如果您无法使用测试程序测试提交的内容,请至少根据YouTube视频来检查提交的内容。

如果您的提交要求使用特殊的命令行选项才能正常运行,则该命令行选项将在计算分数时计算在内。但是,任何解释器的启动时间都不会影响您,可以根据需要修改测试程序以适应该要求。

尽管我怀疑存在,但我必须说禁止使用专门为此任务设计的编程语言功能或库。

Answers:


3

C,161154个字符

#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 ms 为单位给出。此分辨率允许足够精确的定时和较小的常数(我应该尝试100ms)。
P等待一会儿并打印一个字符。
y在初始延迟后打印YMCA序列。
b打印4个YMCA序列-此4 * YMCA发生3次,且时序相似。
main打印3 * 4 * YMCA序列,以及其余3个。


“测试仪中的问题”- 您是对的,因为管道显然不是“交互式”设备:(我一有空就将使它使用PTY(应该更现实)而不是管道。 。
PleaseStand

好的,我将测试仪更改为使用PTY,并且您的程序通过了测试。我还发现了一个名为stdbuf的实用程序,该实用程序使用一些LD_PRELOAD技巧来覆盖C标准I / O库的默认缓冲行为。

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


@JPvdMerwe非常感谢!没错 删除两位小数不会产生任何重大影响。另外,在执行此操作后,我注意到如果调整值±0.1,则可以使用某些模式以较少的char构造数组。
克里斯蒂安·卢帕斯库

您能%w(Y M C A)*15代替'Y M C A'.split*15生成字母吗?即使您不需要输出,这each也可能是一个错误map。哦,你可以写10.01e1
Paul Prestidge

@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

@PleaseStand完成,现在运行15次。我不知道添加-u,我不需要。我有Python2.6,如果有帮助的话
elssar 2012年

为了明确起见,您的程序应在大约45.766 s后打印第一个“ Y”,-u这对于测试程序(使用管道)是必需的,而不是直接输出到终端。
PleaseStand

@PleaseStand是的,我想知道时间。会问你的,但是在我有机会之前,你已经回答了。关于测试器程序,是否要求该程序按原样在您的测试器上运行,还是您接受需要修改才能在测试器上运行但可以独立运行的提交?
elssar 2012年

嗯,我可以将代码传递给测试人员,而无需使用任何选项
elssar 2012年

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 ...

它可能会以较低的精度缩短,但随后我必须再次观看视频,以确认最后的偏移量不超过.125。大声笑

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.