Iterasi Moore

9

Info

Angka 1 hingga 9 masing-masing mewakili sel di Lingkungan Moore , dengan 5 sebagai sel pusat. Begitu:

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}

Tantangan

Anda dapat mengambil input melalui STDIN, ARGV atau argumen fungsi dan mengembalikan hasilnya atau mencetaknya ke STDOUT. Input adalah kotak N x N (topologi torus, artinya jika x atau y adalah <1 maka x atau y = N, dan jika x atau y> N maka x atau y = 1), dan program Anda harus menampilkan satu interaksi dari itu kisi dengan mengganti setiap sel dengan nilai di sel Lingkungan Moore.

Contoh Input grid (2 x 2):

13
79

Keluaran:

97
31

Penjelasan:

Mulai dari posisi 1,1 kita memiliki nilai 1, karena nilai 1 = {- 1, -1} kita harus mengambil 1 + (- 1), 1 + (- 1) = 0,0. Dan karena itu adalah torus 0,0 kami membungkus ke N. Jadi kami mengambil nilai sel di posisi 1,1 (1) dengan nilai sel di posisi 2,2 (9).

Untuk sel 1,2 berikutnya kita memiliki nilai 3 (= -1, 1) jadi 1 + (- 1), 2 + (1) = 0,3. Membungkus sekitar 2,1 yang merupakan nilai 7.

Nilai sel berikutnya di 2,1 adalah 7 (= 1, -1) jadi 2+ (1), 1 + (- 1) = 3,0. Membungkus sekitar menjadi 1,2 yang merupakan nilai 3.

Nilai sel berikutnya di 2,2 adalah 9 (= 1, 1) jadi 2+ (1), 2 + (1) = 3,3. Membungkus sekitar ke 1,1 yang merupakan nilai 1.

Lebih banyak contoh

Input Grid (3 x 3):

123
456
789

Output yang Diharapkan:

987
654
321

Input Grid (5 x 5):

77497
81982
32236
96336
67811

Output yang Diharapkan:

28728
37337
11923
73369
77433

Catatan Akhir

Jika Anda memiliki pertanyaan, jangan ragu untuk berkomentar. Ini adalah tantangan kode golf, kode terpendek menang!

AndoDaan
sumber
Bagaimana Anda menentukan posisi suatu elemen? Saya tidak mengerti bagaimana set input sel diindeks.
Rainbolt
@Rainbolt Input diindeks oleh baris lalu kolom. Jadi dalam contoh terakhir (input) nilai sel pada 2,3 adalah 9. baris 2 = 81982, dan kolom ketiga adalah 9.
AndoDaan
1
terkait: codegolf.stackexchange.com/q/36839/15599
Level River St
4
Mau tidak mau membaca "contoh Moore".
mulai

Jawaban:

9

APL (33)

APL dibuat untuk ini. Ini adalah fungsi yang mengambil grid input sebagai matriks N-by-N dan mengembalikan grid output sebagai matriks N-by-N.

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

Uji:

      ⍝ 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
sumber
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 tidak dibuat untuk ini ... APL dulu!

Akan
sumber
3

Python, 105

Mengambil dan mengembalikan daftar daftar:

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

Mengambil dan mengembalikan string (148 karakter):

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
sumber
2

MATLAB - 121 byte

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 sedikit kurang dibuat untuk ini daripada APL, tetapi sedikit lebih dibuat untuk ini daripada Python. ;)

Output Uji

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
sumber