무어 반복


9

정보

1에서 9까지의 숫자는 각각 Moore 's Neighborhood의 셀을 나타내고 5는 중앙 셀입니다. 그래서:

123
456
789

1={-1,-1} 2={-1, 0} 3={-1, 1}
4={ 0,-1} 5={ 0, 0} 6={ 0, 1} 
7={ 1,-1} 8={ 1, 0} 9={ 1, 1}

도전

STDIN, ARGV 또는 함수 인수를 통해 입력을 받아 결과를 리턴하거나 STDOUT에 인쇄 할 수 있습니다. 입력은 N x N 그리드 (x 또는 y가 <1이면 x 또는 y = N이고 x 또는 y> N이면 x 또는 y = 1 인 경우를 의미하는 토 오스 토폴로지)이며 프로그램은 그 중 하나의 간섭을 출력해야합니다. 각 셀을 Moore 's Neighborhood 셀의 값으로 바꿉니다.

입력 그리드 예 (2 x 2) :

13
79

산출:

97
31

설명:

위치 1,1에서 시작하면 값 1이 있습니다. 값 1 = {-1, -1}이므로 1 + (-1), 1 + (-1) = 0,0을 검색해야합니다. 그리고 그것은 원환 체 0,0이기 때문에 우리는 N으로 감 쌉니다. 그래서 우리는 위치 1,1 (1)에서 셀 값을 위치 2,2 (9)에서 검색합니다.

다음 셀 1,2의 경우 값 3 (=-1, 1)이 있으므로 1 + (-1), 2 + (1) = 0,3입니다. 값 7 인 2,1로 감 쌉니다.

2,1의 다음 셀 값은 7 (= 1, -1)이므로 2+ (1), 1 + (-1) = 3,0입니다. 값 3 인 1,2로 줄 바꿈합니다.

2,2의 다음 셀 값은 9 (= 1, 1)이므로 2+ (1), 2 + (1) = 3,3입니다. 값 1 인 1,1을 감 쌉니다.

더 많은 예

입력 그리드 (3 x 3) :

123
456
789

예상 출력 :

987
654
321

입력 그리드 (5 x 5) :

77497
81982
32236
96336
67811

예상 출력 :

28728
37337
11923
73369
77433

최종 노트

질문이 있으시면 언제든지 주저하지 마십시오. 이것은 코드 골프 도전, 가장 짧은 코드 승리입니다!


요소의 위치를 ​​어떻게 정의합니까? 입력 셀 세트가 색인화되는 방법을 이해하지 못합니다.
Rainbolt

@Rainbolt 입력은 행 다음에 열로 인덱싱됩니다. 따라서 마지막 예 (입력)에서 2,3의 셀 값은 9입니다. 행 2 = 81982이고 그 세 번째 열은 9입니다.
AndoDaan


4
"무어 예"를 읽을 수는 없습니다.
tomsmeding

답변:


9

APL (33)

이를 위해 APL이 만들어졌습니다 . 입력 그리드를 N-N-N 행렬로 사용하고 출력 그리드를 N-N-N 행렬로 반환하는 함수입니다.

{(⍳⍴⍵)⌷¨(,∆∘.⊖(∆←2-⌽⍳3)∘.⌽⊂⍵)[⍵]}

테스트:

      ⍝ define input matrices
      ∆1 ← ↑(1 3)(7 9)
      ∆2 ← ↑(1 2 3)(4 5 6)(7 8 9)
      ∆3 ← ↑(7 7 4 9 7)(8 1 9 8 2)(3 2 2 3 6)(9 6 3 3 6)(6 7 8 1 1)
      ⍝ show input matrices
      ∆1 ∆2 ∆3
 1 3  1 2 3  7 7 4 9 7 
 7 9  4 5 6  8 1 9 8 2 
      7 8 9  3 2 2 3 6 
             9 6 3 3 6 
             6 7 8 1 1 
      ⍝ apply function to input matrices giving output matrices
      {(⍳⍴⍵)⌷¨(,∆∘.⊖(∆←2-⌽⍳3)∘.⌽⊂⍵)[⍵]} ¨ ∆1 ∆2 ∆3
 9 7  9 8 7  2 8 7 2 8 
 3 1  6 5 4  3 7 3 3 7 
      3 2 1  1 1 9 2 3 
             7 3 3 6 9 
             7 7 4 3 3 

5

파이썬, 174

def t(b):b=b.split("\n");E=enumerate;C=[-1]*3+[0]*3+[1]*3+[-1,0,1]*3;print"\n".join("".join(b[(i+C[int(x)-1])%len(b)][(j+C[int(x)+8])%len(y)]for j,x in E(y))for i,y in E(b))

파이썬은 이것을 위해 만들어 지지 않았습니다 ... APL 은!


3

파이썬, 105

목록의 목록을 가져 와서 반환합니다.

def f(a):e=enumerate;n=len(a);return[[a[(y+(v-1)/3-1)%n][(x+(v-1)%3-1)%n]for x,v in e(u)]for y,u in e(a)]

문자열을 가져 와서 반환합니다 (148 자).

def f(s):
 a=[map(int,l)for l in s.split()];n=len(a);e=enumerate
 for y,u in e(a):print''.join(`a[(y+(v-1)/3-1)%n][(x+(v-1)%3-1)%n]`for x,v in e(u))

2

MATLAB-121 바이트

function O=X(I),m=size(I,1);n=3*m;o=-1:1;c=o<2;M=c'*o+n*o'*c;D=repmat(I,3);C=D;C(:)=1:n*n;t=m+(1:m);O=C+M(D);O=D(O(t,t));

MATLAB은 APL보다 약간 덜 만들어졌지만 Python보다 약간 더 많이 만들어졌습니다. ;)

테스트 출력

X( [1 2 3; 4 5 6; 7 8 9] )

ans =

     9     8     7
     6     5     4
     3     2     1

X( [7 7 4 9 7; 8 1 9 8 2; 3 2 2 3 6; 9 6 3 3 6; 6 7 8 1 1] )

ans =

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