네 번째 독감에 걸릴 수 있습니다


12

내일은 5 월 4 일이므로 내일 오는 모든 나쁜 농담에 정신적으로 대비할 수있는 작은 스타 워즈 테마 게시물이 있습니다.

백 스토리

은하계 상원 회의 동안 모든 상원 의원은 n*n격자에 앉아있다 . JarJar 독감의 갑작스런 발생 (영원히 지속되고 감염된 JarJar Binks와 같이 말하게 됨)은 일부 상원 의원이 감염되게합니다.

다음 은 감염된 상원의 원인 6*6그리드 가있는 예입니다 X. 해당 목록은 다음과 [[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[0,5]]같습니다 . :

여기에 이미지 설명을 입력하십시오

그 후 감염이 단계적으로 퍼지기 시작합니다. 두 상원 의원이 그리드의 전체 가장자리 (즉, 위, 아래, 오른쪽, 왼쪽)를 공유하면 인접 합니다. 즉, 대각선을 제외합니다.

상원 의원이 2,3 또는 4 명의 다른 상원 의원과 인접 할 수 있으며 다음과 같은 감염 규칙을 주장 할 수 있습니다.

  • 감염된 상원 의원은 영원히 감염된 상태를 유지합니다
  • 상원 의원이 이전 단계에서 2 명 이상의 상원 의원에 인접 해 있다면 발병

다음은 감염의 첫 두 단계를 보여주는 이전 표의 예입니다.

여기에 이미지 설명을 입력하십시오

다음 단계 후 모든 상원이 감염됩니다

당신의 임무

코드는 목록보다 크 n*n거나 구별되지 않는 좌표 와 같은 유효하지 않은 입력을 처리 할 필요 가 없습니다.

코드는 몇 개의 정수 (또는 이진 그리드 또는 사용자 언어에 맞는 다른 형식)와 정수 n(목록 이외의 다른 형식을 사용하는 경우 불필요 할 수 있음)의 목록을 입력으로 사용합니다.

8 [[1,2],[1,1],[7,4],[2,7],[4,3]]

n은 그리드의 측면이며, 이는 그리드가 * n 그리드가됨을 의미하고 정수 쌍의 목록은 초기 감염된 상원의 세포 좌표입니다.

그리드의 왼쪽 하단은 [0,0]이고 오른쪽 상단은 [n-1, n-1]입니다. 왼쪽 상단은 [0, n-1]입니다.

코드는 정수를 출력해야합니다 :

-1 전체 그리드가 완전히 감염되지 않거나 전체 그리드를 감염시키는 데 필요한 최소 단계 수인 경우 잘못된 값 또는 오류

테스트 사례

6 [[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[5,0]] => 7

4 [[1,1][0,3][1,0][3,0][3,3]] => 9

이것은 이므로 바이트 단위의 최단 답변이 이깁니다!




최소값은 n얼마입니까? 최대 값이 있습니까?
mbomb007

@ mbomb007 이론상 최대 값은 없지만 계산 가능해야합니다. 최소 값에 대해 I는 0 또는 -1 출력 1 말하고 싶지만

2
Mathematica의 직업처럼 보이는 CellularAutomaton...
mbomb007

답변:


2

MATL, 29 28 바이트

tn:"tlY6Z+1>Z|t?@.]]Nl=?l_]&

입력은 1과 0의 2D 행렬 형태입니다.

MATL Online 에서 사용해보십시오

설명

        % Implicitly grab user input as a 2D matrix
t       % Duplicate the inputs
n:      % Count the number of elements in the input (N) and create the array [1...N]
"       % Loop this many times (maximum number of steps we analyze)
  t     % Duplicate the top element
  lY6   % Push the 2D array => [0 1 0; 1 0 1; 0 1 0]
  Z+    % Perform 2D convolution (and maintain the size)
  l>    % Find all values that are >= 2
  Z|    % Perform an element-wise OR with the previous state
  t?    % If all elements are 1's
    @.  % Push the current index and break out of the loop
  ]     % End of if 
]       % End of for loop
Nl=?    % If there is only one element on the stack
  l_    % Push a negative one
]       % End of if statement
&       % Display the top stack element

가 -1 따라서 "true"로 될 것 회선의 출력에서 일부 공의가 있기 때문에 나는 그렇게 생각하지 않습니다 불행히도 @LuisMendo
Suever

어때요 tn:"tlY6Z+1>Z|t?x@D.]]N?xl_? (나는 많이 테스트하지 않았습니다). 어느 시점에서 모든 요소가 1이면 루프 인덱스를 즉시 표시하고 스택을 삭제하십시오. 루프가 끝나면 스택이 비어 있지 않은 경우 삭제하고 푸시하십시오.-1
Luis Mendo

3

APL (Dyalog 16.0), 54 자 또는 60 바이트

동봉 된 행렬을 인수로 취하여 감염을 완료하는 단계 번호를 반환합니다 (예 : 1 = 이미 완전히 감염 됨). 0 = 완전히 퍼지지 않습니다. 1 + OP의 숫자입니다.

54 자 (유니 코드) :

(≢×0=0∊⊃){(⊢≡f←⊢∨2≤{+/,⍵×3 3⍴0 1}⌺3 3)⊃⍵:⍵⋄(⊂f⊃⍵),⍵}⍣≡

60 바이트 (클래식) :

(≢×0=0∊⊃){(⊢≡f←⊢∨2≤{+/,⍵×3 3⍴0 1}⎕U233A 3 3)⊃⍵:⍵⋄(⊂f⊃⍵),⍵}⍣≡

에 해당 ⎕U233A

예제 실행 :

      g←(≢×0=0∊⊃){(⊢≡f←⊢∨2≤{+/,⍵×3 3⍴0 1}⌺3 3)⊃⍵:⍵ ⋄ (⊂f⊃⍵),⍵}⍣≡
      ⎕IO←0
      b←⊂⊖⍉~@(⎕JSON'[[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[5,0]]')⊢0⍴⍨2⍴6
      g b
8
      b←⊂⊖⍉~@(⎕JSON'[[1,1],[0,3],[1,0],[3,0],[3,3]]')⊢0⍴⍨2⍴4
      g b
10

단계는 다음과 같습니다.

┌──────────────┬─────────────┬─────────────┬──────── ──────┬─────────────┬───────────────────────────── ─────────────┐
│ XX │ XXX │ XXXX │ XXXXX │ XXXXX │ XXXXX │ XXXXX │ XXXXXX │
│ X │ XXX │ XXXX │ XXXXX │ XXXXX │ XXXXX │ XXXXXX │ XXXXXX │
│ XX │ XXX │ XXXX │ XXXX │ XXXXX │ XXXXXX │ XXXXXX │ XXXXXX │
│ │ X │ XXX │ XXXXX │ XXXXXX │ XXXXXX │ XXXXXX │ XXXXXX │
│ X │ XX │ XXX │ XXXXX │ XXXXXX │ XXXXXX │ XXXXXX │ XXXXXX │
│ XX │ XXXX │ XXXX │ XXXX │ XXXXX │ XXXXXX │ XXXXXX │ XXXXXX │
└──────────────┴─────────────┴─────────────┴──────── ──────┴─────────────┴─────────────┴─────────────── ─────────────┘
┌─────────┬─────────┬─────────┬┬─────────┬────────── ┬─────────┬─────────┬─────────┬┬─────────┬────────── ┐
│ XX │ XX │ XX │ XX │ XX │ XX │ XXX │ XXXX │ XXXX │ XXXX │
│ │ │ │ │ X │ XX │ XXX │ XXXX │ XXXX │ XXXX │
│ X │ X │ XX XXX XXX │ XXX │ XXX │ XXX │ XXX │ XXXX │ XXXX │
│ XX │ XXX │ XXX │ XXX │ XXX │ XXX │ XXX │ XXX │ XXX │ XXXX │
└─────────┴─────────┴─────────┴┴─────────┴────────── ┴─────────┴─────────┴─────────┴┴─────────┴────────── ┘


2

파이썬, 231 바이트

g=input()
q=lambda r,c:g[r][c]if(0<=r<m)*(0<=c<m)else 0
m=len(g);p=t=0;n=range(m)
while not all([r for k in g for r in k]):h=[[g[r][c]or sum([q(r+1,c),q(r-1,c),q(r,c+1),q(r,c-1)])>1 for c in n] for r in n];t+=1;0/(g!=h);g=h
print t

가능하지 않으면 오류가 발생합니다.

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


0/0에서 2 바이트를 저장합니다 raise. 아마도 1/(g!=h)효과가 있을까요? (전체 while도 인라인 될 수 있습니다).
Jonathan Allan

@JonathanAllan 입력 해 주셔서 감사합니다.
Neil

q=lambda r,c:g[r][c]if(0<=r<m)*(0<=c<m)else 0당신은 (A) 사이의 공간을 제거 할 수 있습니다 (12)에 저장 1하고 for그리고 (b) ]for도.
Jonathan Allan

@JonathanAllan 다시 업데이트되었습니다. 감사합니다
Neil

1

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

f=s=>(w=s.search`\n`,t=` `.repeat(w+1),t+=s+t,t=s.replace(/0/g,(_,i)=>1-t[i]-t[i+=w]-t[i+=2]-t[i+w]>>>31),t==s?0/!/0/.test(s):1+f(t))

어디 \n리터럴 개행 문자를 나타냅니다. 줄 바꾸기로 구분 된 배열에서 입력을 0s 및 1s 문자열로 가져 옵니다. NaN그리드가 완전히 감염되지 않은 경우 반환 합니다.

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