ASCII 아트 좀비 침략 시뮬레이션


13

좀비 침공을 시뮬레이션하기 위해, 그리드로 시작 #하고 지도를 나타내는 :

##   ##
###   #
## ##  
  # ###
#  ####
  • # 토지를 나타냅니다.
  • 물을 나타냅니다.

좀비는지도의 한 지점에서 시작합니다 ...

##   ##
###   #
## %#  
  # ###
#  ####

... 그리고 퍼졌다. %좀비에 감염된 땅을 나타냅니다.

그러나 좀비는 수영을 할 수 없습니다 . 그들은 체스에서 체스가 움직이는 것과 같은 방식으로 땅을 가로 질러 움직일 수 있습니다-대각선 또는 직교 방향으로 한 정사각형 :

!!!
!%!
!!!

시뮬레이션이 끝나면 일부 토지가 좀비에 감염됩니다.

%%   ##
%%%   #
%% %%  
  % %%%
#  %%%%

당신의 임무는 좀비 침략을 시뮬레이션하는 것입니다. 그리드의 초기 상태를 나타내는 문자열과 초기 좀비의 좌표를 나타내는 두 개의 숫자를 입력으로받는 프로그램 (또는 함수)을 작성하십시오. 프로그램은 침입의 최종 상태를 출력 (또는 반환)해야합니다.

명세서

  • 프로그램은 선택적인 후행 줄 바꿈을 인쇄 할 수 있습니다.
  • 선택적인 후행 줄 바꿈과 함께 입력이 올바른 형식 (공백으로 채워짐)으로 가정 할 수 있습니다.
  • 초기 좀비가 육지에서 시작되어 즉시 죽지 않을 것이라고 가정 할 수 있습니다.
  • 이것은 이므로 가장 짧은 답변 (바이트)이 이깁니다.
  • 코드가 임의의 튜링 기계 의 정지 문제 를 해결할 수있는 경우 -100 % 보너스 .
  • 프로그램은 보드 너비를 최대 50 자까지 처리해야합니다.

정지 문제 는 무엇 입니까?
Mukul Kumar

3
@MukulKumar en.wikipedia.org/wiki/Halting_problem . 그것은 농담. 중단 문제는 해결할 수 없습니다.
Esolanging Fruit

1
당신은 몰라 : P
Mukul Kumar


1
아니오, 진지하게, 나는 정지 문제 해결에 대한 보너스를 -200 %로 올렸습니다. 대답은 그럴만 한 가치가 있습니다. :)
RudolfJelin

답변:



5

코 틀린, 283 218 바이트

이름이없는 람다 (중첩 된 함수로).

골프

{i:String,x:Int,y:Int->val m=i.lines().map{it.toCharArray()};fun v(x:Int,y:Int){try{if(m[y][x]=='#'){m[y][x]='%';for(c in-1..1)for(d in-1..1)if(!(c==0&&d==0))v(x+c,y+d)}}catch(e:Exception){}};v(x, y);m.map(::println)}

언 골프

fun zombies(input: String, startX: Int, startY: Int) {
    val m = input.lines().map(String::toCharArray)      // build game map
    fun invade(x: Int, y: Int) {                        // nested functions, woo!
        try {
            if (m[y][x] == '#') {                       // if land
                m[y][x] = '%'                           // mark as invaded
                for (dx in -1..1) {                      // generate neighbour tiles
                    for (dy in -1..1) {
                        if (!(dx == 0 && dy == 0)) {
                            invade(x + dx, y + dy)        // attempt to invade neighbours
                        }
                    }
                }
            }
        } catch(e: Exception) {}                        // catches ArrayIndexOutOfBounds
    }

    invade(startX, startY)                              // start the invasion
    m.map(::println)                                    // print final state
}

재귀 솔루션으로 전환하여 몇 바이트를 절약했습니다.


3
"fun zombies": P
Esolanging Fruit

4

자바 스크립트 (ES6), 144 바이트

(s,x,y,l=s.search`\n`,g=s=>s==(s=s.replace(eval(`/(#|%)(.?[^]{${l-1}}.?)?(?!\\1)[#%]/`),`%$2%`))?s:g(s))=>g(s.slice(0,x+=y*l)+`%`+s.slice(x+1))

어디 \n리터럴 개행 문자를 나타냅니다. 0 인덱스 좌표를 취합니다.


2

비 펀지, 324 323 바이트

&00p&10p20p~$v<p02+g02*!g02:+1$$$$<
 #<%>\"P"/8+p>1+:::~:0`!#v_:85+`!#^_2%\2%3*1+*\2/:"P"%\"P"/8+g+\2/:"P"
:+**73"="+g00*g02g010$$$$<v
02:\-<v/"P"\%"P":/2::_|#:$<:+1+g02\+g02:\-1+g02:\+1:\-1:\+1-g
\:20g^>g:30p\2%3*1+/4%1->#^_::2%6*2+30g+\2/:"P"%\"P"/p:20g-1-
0<v2\g+8/"P"\%"P":/2::<\_@#`0:-g
2^>%3*1+/4%1g,1+:20g%#^_1+55+,\

온라인으로 사용해보십시오!

설명

Befunge에서 이것을 구현하는 것은 우리가 소스 코드 자체와 공유해야하는 "메모리"의 80x25 문자로 제한되어 있기 때문에 약간 복잡했습니다. 50x50 맵을 해당 영역에 맞추는 트릭은 2D 맵을 바이트 당 2 개의 맵 위치가있는 1D 배열로 평면화하는 것입니다. 그런 다음이 1D 배열을 2D 배열로 다시 랩핑하여 Befunge 재생 필드의 80 자 너비에 맞출 수 있습니다.

감염 알고리즘은 초기 좌표를 1D 배열의 오프셋으로 변환하여 시작하여 스택으로 푸시합니다. 메인 루프는 스택에서 값을 가져와 해당 오프셋에 대한 맵 상태를 찾습니다. 감염되지 않은 토지 인 경우 감염된 것으로 표시되고 8 개의 새로운 오프셋이 스택에 밀려납니다 (현재 위치 주변의 모든 토지를 나타냄). 이 프로세스는 스택이 비워 질 때까지 계속됩니다.

범위를 벗어난 값을 확인하지 않으려면 맵이 모든 가장자리 주위에 하나의 문자 테두리로 저장됩니다.


1

(59 바이트)

{(ac+b+b*Ya@?n):'%L2*#aa:RVaR.`#(.?.?.{`.y-1.`})?%`'%.@>_a}

여러 줄 문자열, 초기 좀비의 행 (0- 인덱스) 및 초기 좀비의 열 (0- 인덱스)을 취하는 함수입니다. 온라인으로 사용해보십시오!

어떻게?

Pip에는 주기적 인덱싱이 있기 때문에 (일반적으로 좋은 점이지만 맵 가장자리를 감싸고 싶지 않기 때문에이 문제에는 좋지 않습니다) 정규식 대체 솔루션을 사용했습니다.

Ya@?n첫 번째 줄 바꿈의 색인 (즉, 격자의 너비)을 찾아서 넣습니다 y.

(ac+b+b*Ya@?n):'%위의 작업을 수행 한 후 (width + 1) * row + col, 즉를 계산 c+b+b*y하고 해당 인덱스의 문자를로 설정합니다 %.

L2*#a루프 2*len(a)타임은 플러드 필이 완전히 전파 될 수 있도록 충분한 반복을 제공하고 반복 횟수가 고르도록합니다 (중요).

.`#(.?.?.{`.y-1.`})?%`사이에 0, width-1, width 또는 width + 1 문자를 사용 #하여 a 와 일치하는 정규 표현식을 구성합니다 %. ( .처음 .에는 정규 표현식에서 줄 바꿈과 일치합니다.)이 정규 표현식은 다음 구성 중 하나와 일치합니다.

#  
 % 

 # 
 % 

  #
 % 

#% 

aR ... '%.@>_문자와이 정규식의 일치 대체 %앞에 추가 .제외한 모든 첫 번째 문자 @>경기를 _; 즉, 교체 #%.

a:RV ...이를 반대로하여에 다시 할당합니다 a. 정규식 은 문자열이 아닌 앞에만 일치 # 하기 때문에 반대입니다 %. 그러나 문자열이 뒤집 히면 after가 이전이되고 다음 반복에서 일치시킬 수 있습니다. 이것이 반복 횟수가 짝수 여야하는 이유이기도합니다.

루프가 완료되면 수정 된 값을 반환합니다 a.


0

TSQL, 267 바이트

골프 :

USE master
DECLARE @ varchar(max)=
'##   ##
###   #
## %#  
  # ###
#  ####'

WHILE @@rowcount>0WITH C as(SELECT x+1i,substring(@,x+1,1)v,x/z r,x%z c
FROM spt_values CROSS APPLY(SELECT number x,charindex(char(10),@)z)z
WHERE type='P'and x<len(@))SELECT @=stuff(@,d.i,1,'%')FROM C,C D
WHERE'#%'=d.v+c.v and abs(c.r-d.r)<2and abs(c.c-d.c)<2PRINT @

언 골프 드 :

USE master-- the script needs to be executed on the default master database
DECLARE @ varchar(max)=
'##   ##
###   #
## %#  
  # ###
#  ####'

WHILE @@rowcount>0
WITH C as
(
  SELECT x+1i,substring(@,x+1,1)v,x/z r,x%z c
  FROM
    spt_values
  CROSS APPLY(SELECT number x,charindex(char(10),@)z)z
  WHERE type='P'and x<len(@)
)
SELECT @=stuff(@,d.i,1,'%')FROM C,C D
WHERE'#%'=d.v+c.v and abs(c.r-d.r)<2and abs(c.c-d.c)<2

PRINT @

사용해보십시오


0

PHP, 209 189 188 183 바이트

골프를 칠 수있다

for($w=strpos($s=($a=$argv)[1],10),$s[$a[2]*++$w+$a[3]]="%";$t<$s;)for($t=$s,$i=0;""<$c=$s[$i++];)if($c>"$")for($y=-2;++$y<2;)for($x=3;$x--;)$s[$p=$i+$y*$w-$x]>"!"?$s[$p]="%":0;echo$s;

로 실행 php -r '<code>' '<grid>' <y> <x>


0

J, 152 바이트

골프를 잘하지는 못했지만 마지막 몇 가지 컨트롤 구조를 제거 할 수있는 방법이 있다고 확신합니다.

f=:4 :0
c=.(' '"_)`({~&<y)@.((*./y<$x)*.*./y>:0 0)x if.c='#' do.x=.'%'(<y)}x[i=.0 while.i<9 do.i=.>:i[x=.x f y+i<:@(|~,<.@%)3 end.end.x
)
g=:>@cutLF@[f]

플러드 채우기 알고리즘을 구현합니다. 함수 g는 f를 적용하기 전에 입력을 문자 배열로 형식화합니다.

좌표는 약간 이상합니다.

0, 0

왼쪽 상단입니다. 첫 번째 좌표 늘리기 :

1, 0

위치를 y 방향으로 아래로 이동합니다.

그 이외의 좌표는 정상입니다.

예:

    land =: 0 : 0    NB. Define a multi-line string
##   ##
###   #
## ##  
  # ###
#  ####
)

    ] l =. >@cutLF land    NB. Cut 'land' on new lines, and form into an array. Assign to 'l'
##   ##
###   #
## ##  
  # ###
#  ####
    NB. Looks the same, but it isn't.

    '%' (<2 3)} l    NB. 'Infect' the land at 2, 3
##   ##
###   #
## %#  
  # ###
#  ####

    l f 2 3    NB. Flood fill on l (already formatted), starting at 2 3
%%   ##
%%%   #
%% %%  
  % %%%
#  %%%%

    land g 2 3    NB. Flood fill on land, formats for us.
%%   ##
%%%   #
%% %%  
  % %%%
#  %%%%
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.