제 시간에 만들어 줍니까?


37

영감을받은 .

배경

악한 농부 가격을 견인하기 위해 당신의 밀밭을 태워하기로 결정했다. 완전한 파괴를 보장하기 위해, 그는 또한 당신의 분야를 휘발유에 담그 셨습니다. 더 불행하게도, 당신은 불이 켜졌을 때 들판을 걷고 있었으며, 생존하기 위해 빨리 나가야합니다.

도전

밀, 불 및 당신의 위치를 ​​포함하는 들판이 주어지면, 들판에서 제 시간에 만들 수 있는지 결정하십시오.

필드는 밀 (여기서는 .)과 화재 ( F)로 구성됩니다. 여기에 위치가로 표시되어 있습니다 O. 예를 들면 다음과 같습니다.

...F...F
F.......
........
.F......
....O...
...F....
........
.F....F.

매 초마다 인접한 셀로 이동하지만 (대각선은 아님) 모든 화재는 모든 인접한 셀로 퍼집니다. 불이 붙지 않는 세포로 옮길 수 없으면 죽습니다. 현장에서 벗어나면 살아남습니다. 이 예제에서 어떤 일이 발생하는지 봅시다 :

...F...F
F.......
........
.F......
....O...
...F....
........
.F....F.

..FFF.FF
FF.F...F
FF......
FFF.....
.F.F.O..
..FFF...
.F.F..F.
FFF..FFF

FFFFFFFF
FFFFF.FF
FFFF...F
FFFF....
FF.FF.O.
.FFFFFF.
FFFFFFFF
FFFFFFFF

FFFFFFFF
FFFFFFFF
FFFFF.FF
FFFFF.FF
FFFFFFFO
FFFFFFFF
FFFFFFFF
FFFFFFFF

FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFFO <-- you made it out and survived, barely
FFFFFFFF
FFFFFFFF
FFFFFFFF

규칙

  • 입력은 그리드로 필드입니다. 줄 구분 기호가있는 문자열 또는 2D 배열을 포함한 모든 입력 형식을 선택할 수 있습니다.
    • 화재 및 / 또는 자신의 위치를 ​​입력으로 사용할 수 없습니다 .
    • 배열 입력을 위해 문자열이 아닌 문자열을 포함하여 밀, 불 및 위치로 3 가지 고유 한 값을 사용할 수 있습니다.
    • 필드의 크기는 항상 1x1 이상이며 직사각형이며 유효하지 않은 문자가 없습니다.
    • 모든 필드에는 위치를 나타내는 값 중 정확히 하나가 포함되며 다른 모든 위치는 발사 될 수도 있고 발사되지 않을 수도 있습니다.
  • 에서 평소와 같이 "생존"또는 "죽음"에 대한 두 가지 고유 한 값 중 하나가 출력됩니다 .
  • 표준 규칙이 적용됩니다.

테스트 사례

살아남은

O
....
.O..
....
FFFFF
.....
..O..
.....
FFFF
FFFO
FFFF
.F....
......
......
.F....
..O...
.FF...
.F....
..FF..
...F...F
F.......
........
.F......
....O...
...F....
........
.F....F.

살아남지 않았다

FFF
FOF
FFF
F.F
.O.
F.F
....F
.....
..O..
.....
F....
.F....F.
........
........
F..O....
........
.....F..
...F...F
F......F
........
.F......
....O...
...F....
........
.F....F.
F..F
.O..
FF..

2
왜 누군가가 다운 봇을했는지 알 수 없습니다
Oliver Ni

3
두 downvoter 모두에게 왜 내 도전이 나쁜지 설명하십시오.
PurkkaKoodari

6
@DeadPossum 도전을 너무 단순화하고 너무 넓게 만드는 느낌이 들기 때문입니다. 그래도 동의하지 마십시오. 다른 사람들이 귀하에게 동의하면 제한을 변경할 수 있습니다.
PurkkaKoodari

2
나는 Pietu1998에 동의하며, 제한이 매우 적절하다고 생각합니다.
Mr. Xcoder

2
@LuisMendo 농부가 돌아올 때 탈출 할 수 있다면 항상 직선으로 탈출 할 수 있습니다. 예를 들어, 농부가 들판 오른쪽으로 탈출하려고한다고 가정 해 봅시다. 농부가 한 칸 아래로 이동하면 일부 화재가 아래쪽으로 퍼집니다. 그러면 농부의 상황은 초기 위치 (더 많은 불)와 동일합니다.
JungHwan Min

답변:


28

달팽이, 15 바이트

\Oo!{.,fee7.,\F

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

1생존 0은 죽음 을 의미합니다.

불을 피우는 것은 불가능하기 때문에 불을 피우는 것은 결코 유용하지 않습니다. 가장 좋은 경로는 항상 직선입니다. 따라서 탈출 경로는 네 가지 중에서 선택할 수 있습니다. 방향이 안전한지 확인하기 위해 F해당 방향을 가리키는 "파이어 콘"이 있는지 확인합니다 .


1
O_o 테스트 링크를 제공 할 수 있습니까? 이것은 매우 짧은 것 같습니다.
Mr. Xcoder

10
코드는 거의 말하고있다 : "오우!"... "휴 ..."
마법 문어 항아리

26
달팽이는 화재를
극복

6
@feersum "온라인으로 시도"링크에서 다음 3 줄 밀밭을 시험해 보았습니다.이 밀밭은 죽어야하지만 "F..F", ".O ..", " FF .. "
Xantix


12

파이썬 (2) , 283 (218) 209 208 바이트

lambda F:f(F)&f(F[::-1])
def f(F):l=F.split();w=len(l[0])+1;i=F.index('O');x,y=i/w,i%w;r=range(len(l));return all('F'in''.join(n)for n in[[l[i][x+abs(i-y):]for i in r],[l[i][max(0,y+x-i):i+x-y+1]for i in r]])

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

줄 바꿈으로 구분 된 문자열로 입력을 받아서를 반환 True/False합니다.Dead/Alive

F바깥 쪽을 보면서 각 방향 (udlr)을 확인하여 작동합니다 .

예:

입력:

FFFFF
.....
..O..
.....

화재 점검 :

Up:       Down:     Left:     Right:

FFFFF               F             F
 ...                ..           ..
  O         O       ..O         O..
           ...      ..           ..

모든 방향에 불이 있으면 죽을 수 있습니다.

편집 : 문자열을 입력으로 다시 돌아가서 이제는 위 / 오른쪽 만 확인하고 입력을 거꾸로 확인합니다 (아래 / 왼쪽)

XcoderFelipe Nardi Batista 덕분에 많은 바이트를 절약 했습니다.


@FelipeNardiBatista 감사합니다 :)
TFeld


2

자바 스크립트, 174 바이트

a=>+(t=>g=a=>t--?g(a.map((l,y)=>l.map((c,x)=>(h=v=>[(a[y-1]||[])[x],(a[y+1]||[])[x],a[y][x+1],a[y][x-1],c].includes(v),!c&&h()?p=1:[2,0,1].find(h))))):p)((p=a+'!').length)(a)

입력 형식 :

  • 정수 배열의 배열
  • 2 F, 1 ., 0O

산출:

  • 생존을위한 참된 가치 (1)
  • 다이에 대한 잘못된 값 (NaN)

시도 해봐:

셀룰러 오토 마톤을 고려하십시오. 셀 O(사람들이 접근 할 수있는), F(캐치 해고), .(아무것도 일어나지 않은) 3 가지 상태가 있습니다 . 차세대 생성 규칙은 다음과 같습니다.

for each cell:
  me and my 4 neighborhoods,
    if anyone is `F` then result is `F`,
    otherwise, if anyone is `O` then result is `O`
    otherwise, keep state `.`

가장자리에 셀이 있으면 O상태 가 유지됩니다. 이것이 충분한 양으로 발생하지 않으면 사람들은 죽었습니다.

// check for all neighbors:
h=v=>[(a[y-1]||[])[x],(a[y+1]||[])[x],a[y][x+1],a[y][x-1],c].includes(v)
// if me == 'O' and i'm edge (neighbors contain _undefined_), then survive
!c&&h()?p=1
// Otherwise apply the given rule
:[2,0,1].find(h)

2

옥타브, 71 바이트

@(a)(A=blkdiag(0,a,0))<3||any((bwdist(A>2,'ci')>bwdist(A==2,'ci'))(!A))

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

또는

모든 테스트 사례를 확인하십시오!

입력 형식 :

  • 정수의 2D 배열
  • 1대한 ., 2대한 O3대한F

산출:

  • truefalse

설명:

설명:

A=blkdiag(0,a,0)    % add a boundary of 0s around the array
A<3                 % return truthy when there is no fire
bwdist(A>2,'ci')    % city block distance transform of binary map of fire
bwdist(A==2,'ci')   % city block distance transform of binary map of your location
any(...)(!A)        % check if there is at least one element on the boundary of 
                    % the fire distance map has its distance greater than 
                    % that of distance map of your location

1

레티 나 243 바이트

^.*O(.|¶)*|(.|¶)*O.*$|(.|¶)*(¶O|O¶)(.|¶)*
O
m`^((.)*) (.*¶(?<-2>.)*(?(2)(?!))O)
$1#$3
m`^((.)*O.*¶(?<-2>.)*(?(2)(?!))) 
$1#
T`p`\O`#| ?O ?
+m`^((.)*)[O ](.*¶(?<-2>.)*(?(2)(?!))F)
$1#$3
+m`^((.)*F.*¶(?<-2>.)*(?(2)(?!)))[O ]
$1#
}T`p`F`#|.?F.?
O

온라인으로 사용해보십시오! 배경이 .s가 아닌 공백이어야 합니다 (또는 다른 정규식 안전 문자를 사용할 수 있음). 설명:

^.*O(.|¶)*|(.|¶)*O.*$|(.|¶)*(¶O|O¶)(.|¶)*
O

O가장자리 가 있으면 다른 모든 것을 삭제하십시오 (생존 사례).

m`^((.)*) (.*¶(?<-2>.)*(?(2)(?!))O)
$1#$3

를 놓고 #기존 위의 모든 공간에 O.

m`^((.)*O.*¶(?<-2>.)*(?(2)(?!))) 
$1#

그리고 #기존 공간 아래의 아무 공간 에나 있습니다 O.

T`p`\O`#| ?O ?

변화 #에들 O또한 왼쪽 또는 오른쪽으로 기존의 공간들, 그리고 O.

+m`^((.)*)[O ](.*¶(?<-2>.)*(?(2)(?!))F)
$1#$3

장소 #의 기존 위 F의. O공백뿐만 아니라을 덮어 쓸 수 있습니다 .

+m`^((.)*F.*¶(?<-2>.)*(?(2)(?!)))[O ]
$1#

장소 #의 기존 이하 F의도 덮어 쓰기 O뿐만 아니라 공간으로들.

}T`p`F`#|.?F.?

변화 #에들 F모든도들, 그리고 O왼쪽이나 오른쪽으로 기존의 또는 공간 F. 의 F모든 것을 다 소비 할 때까지 반복하십시오 .

O

그렇지 않은 경우 1생존을 위해 돌아 0갑니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.