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!


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


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 

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ł!


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.