红宝石, 211 207 203 196个字符
感谢edc65为4个字符
->(x){x=x.chars
o,b,c=x.size
l=o*2+1
a=Array.new(l){Array.new l,' '}
a[o][o]=x.delete_at o/2
a[b][c]=x.pop if a[b=rand(l)][c=rand(l)]==' '&&(b-o)**2+(c-o)**2<=o*o while x[0]
a.map(&:join).join $/}
说明:
->(x){...} 定义一个接受参数的匿名函数 x
x=x.chars变换x从字符串转换成一个字符的字符串的数组
o,b,c=x.size存储输入的长度以o供以后使用。b并且c只需将其初始化为something,因此通过附加到先前的赋值来保存2个字符。
l=o*2+1 这是所有字符都可能到达的字段的长度/宽度,也是爆炸圆的直径。
Array.new(l){Array.new l,' '}制作一个lx l尺寸的2D空格字符数组。
a[o][o]=x.delete_at o/2将数组的中心设置为x(输入)值的中心,同时从中删除该值x
... while x[0]while一遍又一遍地运行该块(在这种情况下,因为之前是内联的,所以之前的代码)直到x为空。在ruby中,访问不存在的索引将返回nil,这是一个false值。
a[b=rand(l)][c=rand(l)]==' '分配b和c给0 <= n <的随机值l。然后检查是否在现场b,c是空的(也就是设置为空格字符)
(b-o)**2+(c-o)**2<=o*o勾股距离检查。o是输入的长度。**是ruby的幂运算符,并且val<=o*o比短val**0.5<=o。
a[b][c]=x.pop从中删除最后一个值x。设定的位置a,b以在数组值a
a[b][c]=x.pop if a[b=rand(l)][c=rand(l)]==' '&&(b-o)**2+(c-o)**2<=o*o while x[0]如果该位置是自由的并且在爆炸半径之内,则将随机位置设置为最后一个值;继续这样做,直到我们用完所有字符为止。
$/设置为操作系统的换行符。也比"\n"
a.map(&:join).join $/将所有数组映射a到其自身的单字符串版本(例如['a','b','c']-> 'abc')。选择该新数组,并使用换行符将其加入。隐式回报。