오염의 마지막 단계


10

받는 사람 5x5 안에 바이러스가 있습니다. 오염이 어떻게 전파되는지 아는 바와 같이, 당신의 임무는 오염의 마지막 단계를 출력하는 것입니다.

수신자

5x5의 2 차원 배열로 표현됩니다.

0 0 0 0 1
0 0 0 0 1
0 0 0 1 1
0 0 1 1 1
0 1 1 1 1

여기서 1바이러스가 이미 오염 된 0위치 와 오염되지 않은 위치를 의미합니다 .

바이러스가 전파되는 방법

  1. 오염 된 위치는 깨끗하지 않습니다.
  2. 인접한 위치 (북쪽, 동쪽, 남쪽 및 서쪽 셀) 중 2 개 이상이 오염 된 경우에만 다음 단계에서 깨끗한 위치가 오염됩니다.
  3. 오염의 마지막 단계는 더 이상 깨끗한 세포가 오염 될 수 없을 때 발생합니다.

견본

수신자가 위에서 설명한 오염의 1 단계로 사용하면 2 단계는

0 0 0 0 1
0 0 0 1 1
0 0 1 1 1
0 1 1 1 1
0 1 1 1 1

오염의 3 단계는 다음과 같습니다.

0 0 0 1 1
0 0 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1

오염의 4 단계는 다음과 같습니다.

0 0 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1

그리고 5 단계 (이 예에서는 마지막 단계)는 다음과 같습니다.

0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1

도전

오염의 한 단계를 입력으로 주어지면, 오염의 마지막 단계를 출력해야합니다.

당신은 전체 프로그램이나 기능을 쓸 수 있습니다. 입력을 배열 / 목록, 분리 된 숫자 또는 문자열로 사용할 수 있습니다. 귀하의 언어에 가장 적합한 방법을 선택하십시오.

바이트 단위의 최단 답변이 승리합니다!

다른 테스트 사례

Input:
1 1 0 0 1
0 0 0 0 0
0 1 0 0 1
0 0 0 0 0
1 0 0 0 1

Output:
1 1 0 0 1
1 1 0 0 1
1 1 0 0 1
1 1 0 0 1
1 1 0 0 1

Input:
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1

Output:
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1

Input:
1 0 0 1 0
0 0 1 0 1
0 0 0 0 0
1 0 0 0 0
0 0 1 0 0

Output:
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1

Input:
0 1 0 0 0
0 0 0 0 1
0 0 1 0 0
1 0 0 0 0
0 0 0 1 0

Output:
0 1 0 0 0
0 0 0 0 1
0 0 1 0 0
1 0 0 0 0
0 0 0 1 0

1
1 0 1출력에서 어떻게 발생할 수 있습니까? 중심 0이 2에 인접하지 1않습니까?
Lynn

@Lynn .. 업데이트했습니다;) ... 죄송합니다
제거됨

1
1 0 0 1 0 \ 0 0 1 0 1 \ 0 0 0 0 0 \ 1 0 0 0 0 \ 0 0 1 0 0테스트 사례로 추가 할 수 있습니까?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ. 추가 감사
제거

2
지금까지 모든 테스트 케이스에는 전체 행과 열만 비어 있습니다. 나는 0 1 0 0 0 \ 0 0 0 0 1 \ 0 0 1 0 0 \ 1 0 0 0 0 \ 0 0 0 1 0변하지 않는 제안 합니다.
xnor

답변:


12

이것이 기본적으로 셀룰러 오토 마톤에 대해 말하고 있기 때문에 ..

Golly Quicklife 규칙, 10 바이트

01234/234V

규칙을 입력하고 그리드를 Golly에 붙여 넣고 패턴을 실행하십시오. 결과 패턴이 출력입니다.

설명:

01234 Survive on any number of neighbors
     /234 Born on >2 neighbors
         V Only directly adjacent neighbors count

또는 완전한 RuleLoader 규칙을 고집하는 경우 89 바이트 :

@RULE X
@TABLE
n_states:2
neighborhood:vonNeumann
symmetries:permute
011001
011101
011111

규칙 이름은 X이며 이전과 동일한 단계입니다.


3
이것은인가 프로그래밍 언어 ?
Lynn

1
Golly Quicklife는 B3/S23어떤 작업을 수행 할 수 있는지 시뮬레이션 할 수 있습니다! ...하지만 엄격한 입력 형식을 가지고 있습니다 (전체 프로그램이 입력에 포함되어있는 것처럼 (어떻게해야합니까?)). 그러나 왜 재미를 망치지?
CalculatorFeline

음, 우리는 셀룰러 오토 마톤의 장기적인 행동으로 귀결되는 질문을 기다릴 필요가 있습니다!
CalculatorFeline

1
나는 타당성이 의심 스럽다. Golly가 최종 결과 만 표시했다면 괜찮을 것입니다. 그러나 중간 결과도 표시합니다 (잘못되지 않은 경우)
lirtosiast

1
@CatsAreFluffy 당신은 내 공의를 가지고 있습니다.
lirtosiast

5

파이썬 2, 97 바이트

s=' '*6+input()
exec"s=s[1:]+('1'+s)[sum(s[i]<'1'for i in[-6,-1,1,6])>2or'/'>s];"*980
print s[6:]

온라인으로 사용해보십시오 . 입력은 개행으로 구분 된 각 행과 함께 따옴표로 묶은 문자열로 간주됩니다. 이 프로그램 980은 최적이 아니며 35의 낮은 배수로 대체 될 수 있습니다.이 프로그램의 길이에 영향을 미치지 않기 때문에 독자를위한 연습으로 가장 낮은 안전 상한을 결정했습니다.


입력과 \ n 이스케이프 된 개행을 인용하십시오.
CalculatorFeline

@CatsAreFluffy 나는 Ideone 링크가 이미 입력이 어떻게 취해지고 있는지를 믿습니다.
xsot

입력은 각 행을 \ n으로 구분하여 따옴표로 묶은 문자열로 간주합니다.
CalculatorFeline

알겠습니다. 덜 모호하게 만들기 위해 편집하겠습니다.
xsot

3

자바 스크립트 (ES6), 91 89 87 바이트

숫자 나 문자열의 배열로 입력을받는 함수로.

Neil에서 -2 바이트 ( y문자열 변환과 결합 된 할당 )

-2 바이트 (제거 변수 j)

f=x=>(y=x.map((z,i)=>~(i%5&&x[i-1])+~(i%5<4&x[i+1])+~x[i-5]+~x[i+5]<-5|z))+[]==x?y:f(y)
<!-- Snippet demo with array <-> string conversion for convenience -->
<textarea id="input" cols="10" rows="5">0 0 0 0 1
0 0 0 0 1
0 0 0 1 1
0 0 1 1 1
0 1 1 1 1</textarea>
<button id="submit">Run</button>
<pre id="output"></pre>
<script>
strToArray=x=>x.match(/\d/g)
arrayToStr=x=>([]+x).replace(/(.),(.),(.),(.),(.),*/g, '$1 $2 $3 $4 $5\n')
submit.onclick=_=>output.innerHTML=arrayToStr(f(strToArray(input.value)))
</script>


(y=...)+''==x대신 쓰는 방법으로 2 바이트를 절약하십시오 (y=...),y+''==x.
Neil

2

MATL , 22 바이트

tn:"t5Bt!=~2X53$Y+1>Y|

이 언어의 현재 버전 (15.0.0) 에서 작동 합니다.

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

입력 형식은 다음과 같습니다. 행이 세미콜론으로 구분 된 2D 배열입니다. 따라서 네 가지 테스트 사례에는 다음과 같은 입력이 있습니다.

[0 0 0 0 1; 0 0 0 0 1; 0 0 0 1 1; 0 0 1 1 1; 0 1 1 1 1]

[1 1 0 0 1; 0 0 0 0 0; 0 1 0 0 1; 0 0 0 0 0; 1 0 0 0 1]

[1 0 0 0 0; 0 1 0 0 0; 0 0 1 0 0; 0 0 0 1 0; 0 0 0 0 1]

[1 0 0 1 0; 0 0 1 0 1; 0 0 0 0 0; 1 0 0 0 0; 0 0 1 0 0]

설명

이는 다음 마스크를 사용하여 입력 어레이의 2D 컨벌루션을 반복적으로 수행하며 어떤 마스크가 오염으로 간주되는지 정의합니다.

0 1 0
1 0 1
0 1 0

원래 배열과 동일한 크기의 결과를 얻으려면 먼저 0의 프레임으로 채워지고 컨볼 루션의 "유효한"부분 만 유지됩니다 (즉, 가장자리 효과가없는 것).

2의 임계 값이 컨벌루션의 출력에 적용되고 결과는 원래 입력과 요소 별 OR됩니다.

최종 상태에 도달하기에 충분한 횟수를 수행해야합니다. 이를 충족시키는 간단한 기준은 다음과 같습니다. 입력 배열의 항목 수만큼 반복합니다 (즉, 테스트 경우 25 회).

t          % get input 2D array implicitly. Duplicate
n:"        % repeat as many times as elements in the input array
  t        %   duplicate array
  5B       %   number 5 in binary: row vector [1 0 1] 
  t!       %   duplicate and transpose into column
  =~       %   compare for inequality with broadcast. Gives desired mask
  2X53$Y+  %   2D convolution. Output has same size as input 
  1>       %   true for elements equal or greater than 2
  Y|       %   element-wise OR with previous copy of the array
           % end loop. Implicitly display

1

TI-BASIC, 151 바이트

Prompt [A]
[A]→[B]
Lbl 0
[B]→[A]
For(Y,1,5
For(X,1,5
DelVar ADelVar BDelVar CDelVar D
If Y>1:[A](Y-1,X→A
If Y<5:[A](Y+1,X→B
If X>1:[A](Y,X-1→C
If X<5:[A](Y,X+1→D
max(A+B+C+D≥2,[A](Y,X→[B](Y,X
End
End
If [A]≠[B]:Goto 0
[B]

로 입력하십시오 [[1,0,0,1,1][1,0,0,0,0]...].


1
나는 당신이 이것을 약 100 바이트로 얻을 수 있다고 생각합니다. 첫 번째 팁 : Repeat루프를 사용하십시오 .
lirtosiast

1

루아, 236 바이트

s=arg[1]u=s.sub while p~=s do p=s s=s:gsub("(%d)()",function(d,p)t=0 t=t+((p-2)%6>0 and u(s,p-2,p-2)or 0)t=t+(p-7>0 and u(s,p-7,p-7)or 0)t=t+(p+5<30 and u(s,p+5,p+5)or 0)t=t+(p%6>0 and u(s,p,p)or 0)return t>1 and 1 or d end)end print(s)

명령 행에서 입력을 받아들이고 Lua의 문자열 조작을 사용하여 답을 얻습니다.

언 골프 드 :

s=arg[1]
u=s.sub
while p~=s do
    p=s
    s=s:gsub("(%d)()", function(d, p)
                 t=0
                 t=t+((p-2)%6>0 and u(s,p-2,p-2)or 0)
                 t=t+(p-7>0 and u(s,p-7,p-7)or 0)
                 t=t+(p+5<30 and u(s,p+5,p+5)or 0)
                 t=t+(p%6>0 and u(s,p,p)or 0)
                 return t>1 and 1 or d
    end)
end
print(s)

1

APL, 76 72 70 바이트

{⍵∨1<¯1 ¯1↓1 1↓↑+/(1 0)(¯1 0)(0 ¯1)(0 1){⍺[1]⊖⍺[2]⌽⍵}¨⊂¯1⊖¯1⌽7 7↑⍵}⍣≡

이것이하는 것 : 매트릭스를 7x7로 확장 한 다음 논점 (오메가)을 중심으로합니다. 이 행렬에서 4 개의 "자식"행렬을 생성합니다. 각 행렬은 서로 다른 방향 (위 / 아래 / 왼쪽 / 오른쪽)으로 이동하고 함께 추가하여 (이웃 수를 얻음) 프레임을 삭제합니다 ( 5x5 매트릭스). 또는 프로세스에 (즉, 가장자리에) 어떤 셀도 놓지 않도록하기 위해 "이전"매트릭스를 사용하는이 새로운 매트릭스. 그런 다음 ⍣≡조합을 사용하여 고정 소수점 값에 도달하십시오.

{⍵∨1<¯1 ¯1↓1 1↓↑+/(1 0)(¯1 0)(0 ¯1)(0 1){⍺[1]⊖⍺[2]⌽⍵}¨⊂¯1⊖¯1⌽7 7↑⍵}⍣≡
                                                             7 7↑⍵    ⍝ Expand the matrix
                                                       ¯1⊖¯1⌽         ⍝ Center the original matrix
                  (1 0)(¯1 0)(0 ¯1)(0 1){⍺[1]⊖⍺[2]⌽⍵}¨⊂               ⍝ Construct 4 child matrices, each offset from the original one by the values on the left of {}
                +/                                                    ⍝ Sum each matrix into one giant matrix
               ↑                                                      ⍝ Mix
     ¯1 ¯1↓1 1↓                                                       ⍝ Transform the 7x7 matrix back to a 5x5 matrix
   1<                                                                 ⍝ Check which elements are smaller than 1
 ⍵∨                                                                   ⍝ "Or" this matrix and the generated matrix
{                                                                 }⍣≡ ⍝ Find the fixpoint

예 (함수가 할당 된 것으로 간주 contaminate) :

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