펄, 293 바이트
@Dom Hastings 덕분에 -9 바이트
{$==7+rand 30;@r=$"=();@a=((C)x4,(E)x3,("#")x1369,(" ")x1369);for$i(0..7+rand 30){$r[$i][$_]=splice@a,rand@a,1for 0..$=}$r[0][$=]=F;$r[-1][0]=P;$_=$r=join$/,$v="#"x($=+=3),(map"#@$_#",@r),$v;1while$r=~s/F(.{$=})?[^#F]/F$1F/s||$r=~s/[^#F](.{$=})?F/F$1F/s;$r!~/[CEP]/&&/C.*C/s&&/E/?last:redo}say
-E
실행하려면 플래그를 추가 하십시오.
perl -E '{$==7+rand 30;@r=$"=();@a=((C)x4,(E)x3,("#")x1369,(" ")x1369);for$i(0..7+rand 30){$r[$i][$_]=splice@a,rand@a,1for 0..$=}$r[0][$=]=F;$r[-1][0]=P;$_=$r=join$/,$v="#"x($=+=3),(map"#@$_#",@r),$v;1while$r=~s/F(.{$=})?[^#F]/F$1F/s||$r=~s/[^#F](.{$=})?F/F$1F/s;$r!~/[CEP]/&&/C.*C/s&&/E/?last:redo}say'
그러나 실행하는 데 시간이 오래 걸리므로 대신이 버전을 사용하는 것이 좋습니다.
perl -E '{${$_}=8+rand 30for"=","%";@r=$"=();@a=((C)x4,(E)x3,("#")x($v=rand $=*$%),(" ")x($=*$%-$v));for$i(0..$%-1){$r[$i][$_]=splice@a,rand@a,1for 0..$=-1}$r[0][$=-1]=F;$r[$%-1][0]=P;$_=$r=join$/,$v="#"x($=+=2),(map"#@$_#",@r),$v;1while$r=~s/F(.{$=})?[^#F]/F$1F/s||$r=~s/[^#F](.{$=})?F/F$1F/s;$r!~/[CEP]/&&/C.*C/s&&/E/?last:redo}say'
온라인으로 사용해보십시오!
설명
{ # 블록으로 들어가기 (루프로 사용됨) { $ == 7 + "" ) x1369 ); 0 ] [ $ =] = F ;
rand 30 ; # 무작위로 맵의 폭 -2 선택 #을 (-2 우리가 아직 국경을 포함하지 않기 때문에) @r = $ "= (); # 리셋 @r 및 세트 $를" 에 미확정 @a = ( # 생성 보드 ( C ) x4 , # 4 동전 'C' ( E ) x3 , # 3 적 'E' ( "#" ) x1369 , # 37 * 37 '#' (
# 37 * 37 스페이스 에 대한 $ I ( 0..7 + 랜드 30 ) # 2 차원지도를 작성 (7 랜드 (30)가 이제 막 생성 된 높이이다 +) 에 대한 $ _ ( 0 . $ = - 1 ) {
$ r [ $ i ] [ $ _ ] = # index [$ i] [$ _] 수신 ...
splice @ a , rand @ a , 1 # .. 이전에 생성 된 목록에서 임의의 문자 # (문자는 'splice'덕분에 목록에서 제거되었습니다.) } }
$ r [
# 마무리 셀 추가
$ r [ -1 ] [ 0 ] = P ; # 시작 셀을 추가하십시오
$ _ = $ r = # 여기에서 map
join $ / 의 문자열 표현을 생성합니다 . # 줄 바꿈으로 다음 요소를 조인합니다.
$ v = "#" x ( $ = + = 3 ) # 첫 번째 # 줄만 ( map "# @ $ _ #" , @r ), # 각 줄의 시작과 끝에 # 추가
$ v ; #의 마지막 줄 #
# 다음 정규식은 모든 액세스 가능한 셀을 F
$ r = ~로 바꿉니다 . S / F (. { $ =})? [^ # F ] / F $ 1 층 / S # 오른쪽에 셀 또는 하단 F 셀이 교체되었습니다 || # 또는
$ r = ~ s / [^ # F ] (. { $ =})? F / F $ 1F / s ; # F 셀의 왼쪽 또는 맨 위에있는 셀은
$ r ! ~ / [CEP] / 로 대체됩니다 . # 맵에 C, E 또는 P가 없으면 (모두 액세스 가능함 ) &&
/C.*C/ s # 그리고 최소 2 개의 동전이 있습니다 && / E / ? # and 1 enemy last : # 맵이 유효하고, 루프 리두를 종료하고 # 다시 시작하고 }
말하고 # 보드를 인쇄하십시오.
보드에 넣을 캐릭터를 무작위로 고르는 목록 ( @a
)에는 1369 개의 공백과 #
, 동전 4 개와 적 3 개만 들어 있기 때문에 실행하는 데 시간이 오래 걸립니다 . 따라서 너비와 높이의 크기가 작 으면 공간이 많고 #
동전과 적과 비교되므로 임의의지도가 유효하지 않을 가능성이 큽니다. 은 "최적화 된"버전이 빠른 이유입니다 : 우리가 문자를 선택할 수있는 목록이지도보다는 조금 더 큰 (목록입니다 @a=((C)x4,(E)x3,("#")x($v=rand $=*$%),($")x($=*$%-$v))
: 난수 $v
의 #
지도의 크기 열등 () 및 size of the map - $v
공백).