红宝石, 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,' '}
制作一个l
x 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'
)。选择该新数组,并使用换行符将其加入。隐式回报。