생명의 게임 arrowslits


26

배경

이 문제는의 명예에 apsillers 원화, 보이는 것처럼 간단하지 그들의 도전에 PPCG 2016 최고의 카테고리를 수 내 4 주 음악 상자 놀이 노래가? 축하합니다!

"내 정보"페이지에서이 사용자는 Game of Life 셀룰러 오토 마톤을 위한 깔끔한 시뮬레이터를 보유하고 있습니다. 반면에, aspillera 라는 단어 는 "arrowslit"의 스페인어입니다. 이러한 사실에 비추어 볼 때,이 도전은 Game of Life의 화살에 관한 것입니다.

생명의 게임 arrowslits

GoL에서는 글라이더 로 화살표 를, 일련의 블록으로 벽을 표현합니다 . 단일 글라이더가 위에서 벽에 접근하여 벽의 틈새 (화살표)를 통해 비행하려고합니다. 당신의 임무는 글라이더가 화살촉을 통과하거나 벽에 충돌하는지 확인하는 것입니다.

입력

입력은 GoL 구성을 나타내는 비트 그리드입니다. 합리적인 형식 (2 개의 인쇄 가능한 ASCII 문자, 문자열 목록, 정수의 2D 배열, 부울의 2D 배열 등)의 여러 줄 문자열을 사용할 수 있습니다. 명확성을 기하기 .#위해 다음에서 여러 줄 문자 를 사용합니다.

입력에는 몇 가지 속성이 있습니다. 먼저, 일부 N ≥ 6 의 높이는 2N 이고 너비는 2N + 2 이상 입니다. 입력은 맨 위 세 행 어딘가가 글라이더이고 두 가운데 행에 블록 벽이 있다는 점을 제외하고는 모두 s입니다. 글라이더는 남서쪽 또는 남동쪽으로 향하며 벽을 제거하면 아래쪽 가장자리에 닿기 전에 측면 가장자리를 통과하지 않지만 그리드의 모서리에 도달 할 수 있습니다. 글라이더는 초기에 적어도 하나의 단계에 의해 좌측 및 우측 에지로부터 분리된다 . 어느 단계 에나있을 수 있습니다...

벽은 블록으로 구성되며, 블록은 하나의 열로 구분되며 .한 곳을 제외하고는 두 열 이상의 열로 구분됩니다 .. 글라이더와 마찬가지로 가장 왼쪽과 가장 오른쪽 블록도 한 단계 씩 가장자리에서 분리됩니다 .. 왼쪽 가장자리에는 항상 하나 이상의 블록이 있고 오른쪽 가장자리에는 하나의 블록이 있습니다.

다음은 유효한 입력 그리드의 예입니다.

....#......................
..#.#......................
...##......................
...........................
...........................
...........................
.##.##............##.##.##.
.##.##............##.##.##.
...........................
...........................
...........................
...........................
...........................
...........................

산출

명시된 바와 같이, 글라이더가 벽에 부딪 치거나 남쪽 가장자리를 통과하는지 여부를 결정해야합니다. 이 문제를 해결하기 위해 나중에 시뮬레이션에서 수행되는 작업에 관계없이 구성이 더 이상 단일 글라이더와 블록 벽으로 구성되지 않으면 충돌이 발생합니다. 다음 다이어그램은 두 가지 단계에서 남동 글라이더가 충돌하지 않고 통과 할 수있는 가장 작은 간격을 보여줍니다 (남서쪽 글라이더의 조건은 대칭 임).

...#...........
.#.#...........
..##...........
...............
...............
##...........##
##...........##

...#...........
....#..........
..###..........
...............
...............
##...........##
##...........##

글라이더가 벽을 통과하면 진실한 값을 출력하고 그렇지 않으면 거짓 값을 출력해야합니다. 위의 예에서는 글라이더가 벽의 왼쪽 부분에 충돌하기 때문에 올바른 출력이 잘못되었습니다.

이 문제를 해결하기 위해 2 * (높이-3) 단계 의 입력에서 GoL을 시뮬레이션 하면 글라이더가 예상 위치의 맨 아래 행에 있고 벽이 손상되지 않은 경우 출력이 사실이라고 가정 할 수 있습니다 .

규칙과 득점

전체 프로그램이나 함수를 작성할 수 있습니다. 가장 낮은 바이트 수가 이깁니다.

테스트 사례

테스트 케이스 는 상당히 크기 때문에 GitHub 리포지토리에 수집했습니다 . 개별 파일에 대한 링크는 다음과 같습니다.


입력에서 벽 아래에 빈 행을 포함시킬 이유가 있습니까?
마틴 엔더

@MartinEnder 그들은 실제로 입력에서 GoL을 더 잘 시뮬레이션 할 수있는 솔루션을 만듭니다 (적어도 나는 그렇게 희망합니다).
Zgarb

글라이더는 항상 맨 위 줄에서 시작됩니까?
Rod

@로드 네, 남서부 또는 남동쪽으로 향하는 맨 위 줄에 있습니다.
Zgarb

또 다른 삶의 게임 : P
Christopher

답변:


15

파이썬 (2) , 142 (136) 135 바이트

ElPedro 덕분에 -6 바이트 TuukkaX 덕분에
-1 바이트

p=input()
z=p[2].index(1)
m=(p[1][z]-p[1][z+1]<1)*2-1
k=i=0
for b in p[3:]:x=p[2][::m].index(1)+i;k|=1in b[::m][x-2:x+8];i+=1
print 1-k

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인

방향 확인 (동 / 서) :

서쪽 동쪽
사용 z=p[2].index(1)(빨간색 사각형으로 표시) 3 행의 첫 번째 광장을 얻기 위해, 다음 m=(p[1][z]-p[1][z+1]<1)*2-1,가는 모든 4 개 글라이더 상태를 이런 식으로 왼쪽 (파란색)에 한에서 (녹색) 오른쪽에있는 값을 뺄 남서쪽은 1(이미지의 맨 윗줄), 남동쪽으로가는 것은 0또는 -1입니다.
그런 다음 :을 변환 1 -> -1하고 0,-1 -> 1매개 변수에 사용하여 서쪽을 처리 할 때 목록을 뒤집습니다. 이런 식으로 남서쪽으로가는 글라이더는 남동쪽으로가는 글라이더와 같은 위협을받습니다.

글라이더 운동

활공
이것은 남동쪽으로가는 글라이더가하는 움직임이며, "사다리"패턴이 있으며, 3 번째 줄의 가장 왼쪽 블록은 모든 패턴에 대해 일정합니다. 이를 시작점으로 사용하여 주변의 왼쪽과 오른쪽에 3 개의 블록이 있고 가운데 4 개의 블록에 1s (벽이 있음) 가 있는지 확인합니다 .
화살
arrowslits_path


루프 외부에 변수 i를 설정 한 다음 각 패스에 1을 추가하여 4 바이트를 잃을 수 있다고 생각합니다 . TIO와 함께 시도했을 때 작동하는 것 같습니다. 내가 옳든 나쁘 든 멋진 답변을 얻으려면 +1하십시오. 0forenumerate
ElPedro

좋은! 에서 공백을 제거하여 바이트를 저장할 수 있습니다 1 in. +1.
Yytsi

2

4

옥타브 123 122 108 바이트

@LuisMendo 덕분에 2 바이트를 절약했습니다.

B=A=input("");B(1:3,:)=0;do;until nnz((A=A&(s=conv2(A,(m=-1:1)|m','same'))>1&s<4|~A&s==3)-B)-5;any(A(end,:))

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

또는

모든 테스트 사례 확인

로드 준비 테스트 케이스에 감사합니다.

B=A=input("");
B(1:3,:)=0;
do
until nnz((A=A&(s=conv2(A,(m=-1:1)|m','same'))>1&s<4|~A&s==3)-B)-5
any(A(end,:))

이전 답변 :

B=A=input("");
B(1:3,:)=0;
while nnz(A~=B)==5
    s=conv2(A,(m=-1:1)|m','same');
    x=~A;
    A&=~A|~(s<2|s>3);
    A|=x&s==3;
end;
any(A(end,:))

먼저 변수로 벽 패턴을 추출합니다 B.
벽 패턴과 시뮬레이션 된 패턴이 5 개 이상의 서로 다른 셀을 가질 때까지 GoL 시뮬레이션을 수행하십시오.
글라이더가 마지막 행을 수신하면 함수는 true를 반환합니다.


1
벽 패턴 및 시뮬레이션 된 패턴이 5 개 이상의 상이한 셀을 가질 때까지. 영리 해요!
Luis Mendo

@LuisMendo 감사합니다, 구식
rahnema1

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