Lặp đi lặp lại Moore


9

Thông tin

Các số từ 1 đến 9 mỗi số đại diện cho một ô trong Vùng lân cận của Moore , với 5 là ô trung tâm. Vì thế:

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}

Các thách thức

Bạn có thể nhận đầu vào thông qua STDIN, ARGV hoặc đối số hàm và trả về kết quả hoặc in ra STDOUT. Đầu vào là một lưới N x N (cấu trúc liên kết hình xuyến, nghĩa là nếu x hoặc y là <1 thì x hoặc y = N và nếu x hoặc y> N thì x hoặc y = 1), và chương trình của bạn phải xuất ra một tương tác của điều đó lưới bằng cách thay thế mỗi ô bằng giá trị tại ô Vùng lân cận của Moore.

Ví dụ lưới đầu vào (2 x 2):

13
79

Đầu ra:

97
31

Giải trình:

Bắt đầu từ vị trí 1,1 chúng ta có giá trị 1, vì giá trị 1 = {- 1, -1}, chúng ta phải truy xuất 1 + (- 1), 1 + (- 1) = 0,0. Và bởi vì đó là một hình xuyến 0,0, chúng tôi quấn quanh N. Vì vậy, chúng tôi lấy giá trị ô ở vị trí 1,1 (1) với giá trị ô ở vị trí 2,2 (9).

Đối với ô 1,2 tiếp theo, chúng ta có giá trị 3 (= -1, 1) nên 1 + (- 1), 2 + (1) = 0,3. Kết thúc khoảng 2,1 là giá trị 7.

Giá trị ô tiếp theo tại 2,1 là 7 (= 1, -1) nên 2+ (1), 1 + (- 1) = 3.0. Kết thúc khoảng 1,2 là giá trị 3.

Giá trị ô tiếp theo tại 2,2 là 9 (= 1, 1) nên 2+ (1), 2 + (1) = 3,3. Kết thúc khoảng 1,1 là giá trị 1.

Thêm ví dụ

Lưới đầu vào (3 x 3):

123
456
789

Đầu ra dự kiến:

987
654
321

Lưới đầu vào (5 x 5):

77497
81982
32236
96336
67811

Đầu ra dự kiến:

28728
37337
11923
73369
77433

Ghi chú cuối cùng

Nếu bạn có bất kỳ câu hỏi, đừng ngần ngại để bình luận. Đây là một thử thách golf mã, chiến thắng mã ngắn nhất!


Làm thế nào để bạn xác định vị trí của một yếu tố? Tôi không hiểu làm thế nào tập hợp các ô đầu vào được lập chỉ mục.
Rainbolt

@Rainbolt Đầu vào được lập chỉ mục bởi các hàng rồi cột. Vì vậy, trong ví dụ cuối cùng (đầu vào) giá trị ô ở 2,3 là 9. hàng 2 = 81982 và cột thứ ba là 9.
AndoDaan


4
Không thể không đọc "ví dụ Moore".
tomsmeding

Câu trả lời:


9

APL (33)

APL đã được thực hiện cho điều này. Đây là một hàm lấy lưới đầu vào dưới dạng ma trận N-by-N và trả về lưới đầu ra dưới dạng ma trận N-by-N.

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

Kiểm tra:

      ⍝ 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

Con trăn

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 không được tạo ra cho ... APL này!


3

Con trăn, 105

Lấy và trả về một danh sách các danh sách:

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

Lấy và trả về một chuỗi (148 ký tự):

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 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 được tạo ra ít hơn cho điều này so với APL, nhưng được tạo ra nhiều hơn cho điều này so với Python. ;)

Kiểm tra đầu ra

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.