영감을받은 이 .
배경
악한 농부 가격을 견인하기 위해 당신의 밀밭을 태워하기로 결정했다. 완전한 파괴를 보장하기 위해, 그는 또한 당신의 분야를 휘발유에 담그 셨습니다. 더 불행하게도, 당신은 불이 켜졌을 때 들판을 걷고 있었으며, 생존하기 위해 빨리 나가야합니다.
도전
밀, 불 및 당신의 위치를 포함하는 들판이 주어지면, 들판에서 제 시간에 만들 수 있는지 결정하십시오.
필드는 밀 (여기서는 .
)과 화재 ( 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 가지 고유 한 값을 사용할 수 있습니다.
- 필드의 크기는 항상 1×1 이상이며 직사각형이며 유효하지 않은 문자가 없습니다.
- 모든 필드에는 위치를 나타내는 값 중 정확히 하나가 포함되며 다른 모든 위치는 발사 될 수도 있고 발사되지 않을 수도 있습니다.
- 의사 결정 문제 에서 평소와 같이 “생존”또는 “죽음”에 대한 두 가지 고유 한 값 중 하나가 출력됩니다 .
- 표준 코드 골프 규칙이 적용됩니다.
테스트 사례
살아남은
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..
답변
달팽이, 15 바이트
\Oo!{.,fee7.,\F
1
생존 0
은 죽음 을 의미합니다.
불을 피우는 것은 불가능하기 때문에 불을 피우는 것은 결코 유용하지 않습니다. 가장 좋은 경로는 항상 직선입니다. 따라서 탈출 경로는 네 가지 중에서 선택할 수 있습니다. 방향이 안전한지 확인하기 위해 F
해당 방향을 가리키는 “파이어 콘”이 있는지 확인합니다 .
답변
파이썬 (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..
... .. ..
모든 방향에 불이 있으면 죽을 수 있습니다.
편집 : 문자열을 입력으로 다시 돌아가서 이제는 위 / 오른쪽 만 확인하고 입력을 거꾸로 확인합니다 (아래 / 왼쪽)
Xcoder 와 Felipe Nardi Batista 덕분에 많은 바이트를 절약 했습니다.
답변
자바 스크립트, 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)
답변
옥타브, 71 바이트
@(a)(A=blkdiag(0,a,0))<3||any((bwdist(A>2,'ci')>bwdist(A==2,'ci'))(!A))
또는
입력 형식 :
- 정수의 2D 배열
1
대한.
,2
대한O
및3
대한F
산출:
true
과false
설명:
설명:
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
답변
레티 나 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
갑니다.