摩尔迭代


9

信息

数字1到9分别代表摩尔定居区中的一个单元,其中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),并且您的程序必须输出一个通过将每个单元格替换为其摩尔邻域单元格中的值来建立网格。

输入网格示例(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。环绕到2,1,即值7。

在2,1处的下一个单元格值为7(= 1,-1),因此2+(1),1 +(-1)= 3,0。环绕到1,2,即值3。

在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 2014年

@Rainbolt输入是按行索引,然后按列索引。因此,在2,3在最后一个例子(输入)细胞值为9行2 = 81982,和第三列是9
AndoDaan


4
忍不住阅读了“摩尔实例”。
tomsmeding

Answers:


9

APL(33)

为此制作了APL 。此函数将输入网格作为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

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 ... APL是!


3

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

与APL相比,MATLAB的制作能力略差,但与Python相比,MATLAB的制作能力略高。;)

测试输出

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.