飙车倒计时


10

挑战:

在假设的情况下,比赛的倒数计时器在计数之间具有随机间隔,以防止过早开始,例如

3 (0.82 seconds pass), 2 (0.67 seconds pass), 1

输入:

没有


输出:

编写一个程序(或函数),以每次计数之间0.50秒至1秒的随机时间间隔打印3个数字。


注意:

  • 程序必须输出每个数字(3、2、1),每个数字之间具有随机的时间间隔(0.50到1到百分之一;无硬编码)。随机间隔的精度必须达到数百(例如:0.52)。您不需要输出时间间隔,只需输出计数。
  • 正如@JoKing所阐明的,我的意思是统一随机的(您可以使用语言的伪随机生成器。
  • 正如许多人所阐明的那样,我的意思是说2到10之间的任何十进制数字(0.50、0.51等,一直到0.98、0.99、1)。

这是,因此字节数最少的程序将获胜。


4
嗨,LordColus,欢迎来到PPCG!这似乎是一个很好的第一个挑战。对于未来的挑战,我们建议先检查一下沙箱以解决所有细节。

1
@LordColus:我改进了原始声明和其他一些修改,如果需要,请看一下并批准。
穆罕默德·萨勒曼

1
正如我在之前已删除的评论中所说的那样,如果您对精度不太严格,则指定“均匀随机”是可以的。从目前的情况来看,暂停时间必须是一致的,精度为两位小数(或者至少两位小数?)。这是否意味着分布在集合0.5、0.51、0.52,...,1上应该是均匀的,还是可以是0.5到1之间的任何浮点(可能有两个以上的小数)?
路易斯·门多

2
我最近的编辑可以清除吗?
LordColus '18年

6
@ mbomb007同样...为什么再次关闭?基本上是从3到1,中间有两个.50-1.00秒的等待时间。其实并不复杂。
魔术章鱼缸

Answers:


5

05AB1E,12个字节

3LRε=₄D;ŸΩ.W

在线尝试!


3LR          # Push [3,2,1]
   ε         # For each...
    =        # Print it.
     ₄       # Push 1000.
      D      # Duplicate top (1000).
       ;     # Divided by 2 (500).
        Ÿ    # Range from b to a ([1000 .. 500]).
         Ω   # Random pick.
          .W # Wait X ms.

在启用调试的情况下进行尝试在线尝试!


2

SmileBASIC,64 62字节

?3M?2M?1DEF M
M=MILLISEC
WHILE MILLISEC<M+500+RND(501)WEND
END

不幸的是,我不能使用WAIT,因为它仅支持1/60秒的间隔(通常,没有任何用处,因为输入/输出每帧仅更新一次)

这需要根据运行系统的速度进行调整,因此它可能无效(46字节):

?3M?2M?1DEF M
FOR I=-66E4-RND(66E4)TO.NEXT
END

无效的等待版本(36字节):

?3WAIT 30+RND(30)?2WAIT 30+RND(30)?1

2

R46 44字节

实际倒数:

for(i in 3:1){cat(i)
Sys.sleep(runif(1,.5))}

在线尝试!

我最初误解了挑战的打印间隔(46字节)感谢Giuseppe节省了2个字符。

for(i in 3:1)cat(i,format(runif(1,.5),,2)," ")

在线尝试!


我相信runif()默认情况下,左端点和右端点分别为01,因此runif(1,.5)对于-2个字节在两个端点中都应相同。
朱塞佩

好收获@Giuseppe。
JayCe '18年

2

Python 2,58字节

from time import*
for a in'321':print a;sleep(1-time()%.5)

在线尝试!

我创建了一个非常简单的随机数生成器,它占用了种子时间(就像很多人一样)。


改进之处


1-time()%.5应该可以。(您需要[3,2,1]顺便说一下)
乔纳森·艾伦


@JonathanAllan很好,已更新。
尼尔

倒数计时前也睡一次。我认为您需要在睡觉前打印声明。
魔术章鱼缸

@MagicOctopusUrn同意,已更新。
尼尔,

1

APL + WIN,37个字节

3⋄r←⎕dl ↑n←.49+.01×2?51⋄2⋄r←⎕dl 1↓n⋄1

1

Java 8,86字节

v->{for(int i=0;++i<4;Thread.sleep((int)(Math.random()*500+500)))System.out.print(i);}

不带分隔符的打印。如果不允许这样做,则通过更改printprintln(换行符)来增加+2个字节。

在线尝试。
证明时间间隔在[500, 1000)ms 的正确范围内。

说明:

v->{                        // Method with empty unused parameter and no return-type
  for(int i=0;++i<4;        //  Loop in range [1,4)
      Thread.sleep((int)(Math.random()*500+500)))
                            //    After every iteration: sleep for [500, 1000) ms randomly
     System.out.print(i);}  //   Print the current number


1

JavaScript(Node.js)75 65 60字节

  • 感谢@Shaggy减少了10个字节
  • 感谢@Kevin Cruijssen减少了5个字节
f=(i=3)=>i&&setTimeout(f,Math.random()*500+500,i-1,alert(i))

在线尝试!



1
如果您使用Date,@ Shaggy真的是随机的吗?(第二次随机发生)
DanielIndie

1
为什么*1000%500+500呢 您可以使用*500+500
凯文·克鲁伊森

随着规范的更新,它可能不会足够随机,但是可能值得澄清。
毛茸茸的


1

芯片 -wingjj,33字节

0123456e7f s
???????p*9S!ZZZtaABb

在线尝试!

在芯片上,我们不能等待正好1 / 100秒,但我们可以等待1 / 256个第二的,所以我们用在这里。

p,当询问,将暂停堆栈头(一个字节)*执行1 / 256个秒。在每个周期,我们总是设置堆栈(的高位128个 / 256个),并随机地设置所有其它堆叠位(与?“S)。这样可以在0.50到1.00秒之间分配均匀。

一些arg -w和和-gjj,指定输入(而不是使用stdin)应该是从0xFFto 倒数0x00(然后是包装)。我们用它来提供低两位递减计数。所有其他输出位保持不变(处于与ASCII对应的值0)。

最后,一旦完成,我们将以终止程序t,以防止在最后一个数字之后出现暂停。


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.