ルビー、 211 207 203 196文字
4文字のedc65に感謝
->(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
文字列から1文字の文字列の配列に変換します
o,b,c=x.size
入力の長さo
を後で使用するために保存します。b
そして、c
単純に初期化する必要が何か以前の割り当てに装着することにより、その保存2つの文字が。
l=o*2+1
これは、すべてのキャラクターが移動できるフィールドの長さ/幅であり、爆発円の直径でもあります。
Array.new(l){Array.new l,' '}
作りl
、xはl
空白文字の2次元配列をサイズに。
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
入力の長さです。**
はルビーのべき乗演算子であり、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'
)。その新しい配列を取得し、改行で結合します。暗黙の戻り。