还记得那些蛮力破解密码的程序,它们显示了他们尝试的每种组合吗?更准确地说,在某个时刻,固定了n个第一个字符(已经成功猜出了它们),其余的每个可能的字符都在测试中。您可能已经看过电影或喜欢精美界面的人编写的某些软件。
抱歉,我们很抱歉,但是我们不会编写破解密码的程序,而只提供一个程序来复制漂亮的输出。
挑战
给定一个包含可打印的ascii字符但没有换行符的字符串(ascii代码32到126或与regex匹配^[ -~]{2,}$
),请按照以下规则打印输出:
- 在时间
t=n seconds
,n
打印的n
第一个字符是输入字符串的第一个字符。 - 的后
n
固定字符,则应该字符串形成随机字符追加(从unicode的范围内选择均匀地伪随机,以
~
(码32至126)),以形成所述初始之一的长度的字符串。 - 您应该每秒至少输出20行(稍后再详细介绍):每个行将具有相同的
n
首字符,但随机结尾不同。
目前尚不清楚您应该做什么,所以让我们来看一个例子:
例
我每秒钟只打印5条不同的行,而不是20条最小值,只是为了使其更具可读性。
考虑输入abcde
。
在第一秒内,有效输出可能类似于(完全随机):
dGuT4
S!jkN
"gQ>[
TU3!
*fAjV
然后,t=1
每个后续字符串a
的第一个字符将是(输入的第一个字符):
a);jD
aHv^p
aqw5*
a|.?:
a{gbK
现在,,t=2
前两个字符为ab
:
abTJ"
ab\ e
ab3T#
abYWS
ab"#<
现在,t=3
前三个字符为abc
:
abcvW
abc3G
abc(g
abc{@
abc@4
现在,t=4
前四个字符为abcd
:
abcdD
abcdv
abcdj
abcd$
abcd6
最后,t=5
我们打印输入(仅一次):
abcde
一些精度
- 您不应该对秒级的语言精度太费心(例如,如果您的算法正确但系统/语言缺乏精度,那就很好了)。
- 第一秒可以短于一秒(也就是说,如果您在一秒钟内启动程序,则第一秒可能只是直到当前秒结束为止的剩余时间)。或者换句话说,您不必等待新的一秒开始打印输出。
- 每秒至少20行:更自然的方法是每秒执行一次特殊行为的无限循环(或超时,或其他),因此每秒可能会产生几千行(这很好! )。但是,如果您有其他想法,只要您每秒打印至少20行,就可以随意使用它。
- 输入将始终超过2个字符长。
- 您可以考虑,如果有帮助,输入的长度不能超过30个字符。(但如果它适用于更长的时间,那是最好的)
- 输入格式应该是您语言中字符串的最自然的表示形式。
- 您可以打印尾随换行符。
代码示例
如果仍然不完全了解您必须执行的操作,则可以在linux终端中运行以下代码以查看:
perl -F -aplE 'map{$t=time;print$s,map{chr 32+rand 94}@F until$t-time;$s.=shift@F}@F' <<< "Cracking in progress\!"
获奖标准
这是代码高尔夫球,因此以字节为单位的最短代码获胜!
感谢Laikoni和Flp.Tkc在沙箱中的建议和改进。
\n
是完全可以接受的。使用的版本\r
就在这里,因为它看起来更好,但是您不需要这些\r
。