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