루비, 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.charsx문자열을 한 문자 문자열의 배열로 변환
o,b,c=x.sizeo나중에 사용하기 위해 입력 길이를 저장하십시오 . b그리고 c간단하게 초기화 할 필요가 뭔가 이전 할당에 부착하여, 이렇게 저장이 개 문자.
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. 루비에서 존재하지 않는 인덱스에 액세스하면 nilfalse 값을 반환 합니다.
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'). 그 새로운 배열을 가져 와서 줄 바꿈과 결합하십시오. 암시 적 반환.