Viv*_*ath 13 language-agnostic random code-golf rosetta-stone
使用中间方法生成一系列(伪)随机数的字符数最短的代码.
约翰冯·诺伊曼于1946年首次提出了(伪)随机数生成的中间方法,其定义如下:
R n + 1 = mid((R n)2,m)
例如:
3456 2 = 11943936
mid(11943936)= 9439
9439 2 = 89094721
mid(89094721)= 0947
947 2 = 896809
mid(896809)= 9680
9680 2 = 93702400
mid(93702400)= 7024
另一个例子:
843 2 = 710649
mid(710649)= 106
106 2 = 11236
mid(11236)= 123
123 2 = 15129
mid(15129)= 512
512 2 = 262144
mid(262144)= 621
621 2 = 385641
mid(385641)= 856
856 2 = 732736
mid(732736)= 327
327 2 = 106929
mid(106929)= 069
69 2 = 4761
中(4761)= 476
476 2 = 226576
mid(226576)= 265
mid:显然,对于确切的定义存在一些混淆mid.出于此挑战的目的,假设您正在提取与起始种子相同的位数.意思是,如果起始种子有4位数,你将从中间提取4位数.如果 起始种子有3位数,则从中间提取3位数.
关于在找不到精确中间数时提取数字,请考虑数字710649.如果要提取中间3,则存在一些歧义(106或064).在这种情况下,提取最接近字符串开头的3.所以在这种情况下,你会提取106.
想到它的一种简单方法是,如果数字不是正确的数字,则将零填充到数字.例如,如果您将前导零填充到710649,则会得到0710649,而中间的3位数现在变为106.
不要假设种子的长度.例如,您不能假设种子将始终是4位数字
生成4位随机数的3456的起始种子应生成以下系列(前10个):
9439,947,9680,7024,3365,1322,4458,8737,3351,2292
生成4位随机数的8653的起始种子应生成以下系列(前10个):
8744,4575,9306,6016,1922,6940,1636,6764,7516,4902
产生3位随机数的843的起始种子应生成以下系列(前10个):
106,123,512,621,856,327,69,476,265,22
生成5位数的ranom数的45678的起始种子应生成以下系列(前10个):
86479,78617,80632,1519,30736,47016,10504,3340,11556,35411
就前导零而言,答案是不应该显示前导零:).
Dan*_*llo 15
=MID(C2^2,LEN(C2^2)/2-LEN(C2)/2+1,LEN(C2))
Run Code Online (Sandbox Code Playgroud)
用法:
C2,然后拖动所有序列的公式.测试用例:
截图:
Code Golf:MSM随机数发生器http://img59.imageshack.us/img59/6830/golfo.png
限制:
INT()结果.Car*_*rez 10
26个单个数字的函数:
?dZsl2^dZ1+ll-2/Ar^/All^%p
Run Code Online (Sandbox Code Playgroud)
带有10个循环循环的37个字符:
?dZsl[2^dZ1+ll-2/Ar^/All^%pdzB>L]dsLx
Run Code Online (Sandbox Code Playgroud)
功能说明:
? Input n dZ calculate number of digits sl store in register l 2^ calculate n^2 dZ calculate number of digits of square 1+ll-2/Ar^/ n/(10^((squaredigits+1-l)/2)) int division truncates last digits All^% n%(10^l) modulus truncates first digits p print the number
测试:
dc msml.dc 45678 86479 78617 80632 1519 30736 47016 10504 3340 11556 35411
r=input()
l=len(str(r))
while 1:
x=str(r*r)
y=(len(x)-l)/2
r=int(x[y:y+l])
print r
Run Code Online (Sandbox Code Playgroud)
在stdout上产生无限序列.请注意,long由于L表示结束,至少在具有类型的旧版本上,反引号技巧不起作用.Python 3 print作为函数将为关闭paren添加1个char.