Iteracja Moore'a

9

Informacje

Każda z liczb od 1 do 9 oznacza komórkę w sąsiedztwie Moore'a , przy czym 5 to komórka centralna. Więc:

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}

Wyzwanie

Możesz pobrać dane wejściowe za pomocą argumentu STDIN, ARGV lub funkcji i albo zwrócić wynik, albo wydrukować go do STDOUT. Dane wejściowe to siatka N x N (topologia torusa, co oznacza, że ​​jeśli x lub y wynosi <1, to x lub y = N, a jeśli x lub y> N to x lub y = 1), a twój program musi wypisać jedną interakcję tego siatki, zastępując każdą komórkę wartością w komórce Sąsiedztwa Moore'a.

Przykład Siatka wejściowa (2 x 2):

13
79

Wynik:

97
31

Wyjaśnienie:

Począwszy od pozycji 1,1 mamy wartość 1, ponieważ wartość 1 = {- 1, -1} musimy pobrać 1 + (- 1), 1 + (- 1) = 0,0. A ponieważ jest to torus 0,0, zawijamy do N. Więc pobieramy wartość komórki na pozycji 1,1 (1) z wartością komórki na pozycji 2,2 (9).

Dla następnej komórki 1,2 mamy wartość 3 (= -1, 1), więc 1 + (- 1), 2 + (1) = 0,3. Obejmuje do 2,1, co jest wartością 7.

Następna wartość komórki przy 2,1 wynosi 7 (= 1, -1), więc 2+ (1), 1 + (- 1) = 3,0. Obejmuje do 1,2, co jest wartością 3.

Kolejna wartość komórki przy 2,2 wynosi 9 (= 1, 1), więc 2+ (1), 2 + (1) = 3,3. Obejmuje do 1,1, co jest wartością 1.

Więcej przykładów

Siatka wejściowa (3 x 3):

123
456
789

Oczekiwany wynik:

987
654
321

Siatka wejściowa (5 x 5):

77497
81982
32236
96336
67811

Oczekiwany wynik:

28728
37337
11923
73369
77433

Uwagi końcowe

Jeśli masz jakieś pytanie, nie wahaj się komentować. To wyzwanie dla golfa kodowego, wygrywa najkrótszy kod!

AndoDaan
źródło
Jak definiujesz pozycję elementu? Nie rozumiem, w jaki sposób indeksowany jest zestaw danych wejściowych komórek.
Rainbolt,
@Rainbolt Dane wejściowe są indeksowane według wierszy, a następnie kolumn. Tak więc w ostatnim przykładzie (wejściowa) wartość komórki w 2,3 wynosi 9. wiersz 2 = 81982, a trzecia kolumna to 9.
AndoDaan
1
powiązane: codegolf.stackexchange.com/q/36839/15599
Level River St
4
Nie można powstrzymać się od przeczytania „przykładów Moore'a”.
tomsmeding

Odpowiedzi:

9

APL (33)

Do tego stworzono APL . Jest to funkcja, która przyjmuje siatkę wejściową jako macierz N-na-N i zwraca siatkę wyjściową jako macierz N-na-N.

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

Test:

      ⍝ 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 
marinus
źródło
5

Python, 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))

Python nie został stworzony do tego ... APL był!

Będzie
źródło
3

Python, 105

Pobiera i zwraca listę list:

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)]

Pobiera i zwraca ciąg znaków (148 znaków):

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))
grc
źródło
2

MATLAB - 121 bajtów

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 był nieco mniej stworzony do tego niż APL, ale nieco bardziej stworzony do tego niż Python. ;)

Wyjście testowe

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
COTO
źródło